--- title: Permutations TARGET DECK: Obsidian::STEM FILE TAGS: combinatorics set tags: - combinatorics - set --- ## Overview A **permutation** of some $n$ objects is a (possible) rearrangement of those $n$ objects. The number of permutations is $n!$ since there are $n$ possible ways to pick the first object, $(n - 1)$ possible ways to pick the second, and so on. ```c void next(const size_t n, int A[static n]) { size_t pivot = -1; for (size_t i = n - 1; i >= 1; --i) { if (A[i - 1] < A[i]) { pivot = i - 1; break; } } if (pivot == -1) { reverse(0, n - 1, A); return; } size_t j = pivot; for (size_t i = pivot + 1; i < n; ++i) { if (A[pivot] < A[i] && (j == pivot || A[i] < A[j])) { j = i; } } swap(pivot, j, A); reverse(pivot + 1, n - 1, A); } void permutations(const size_t n, int A[static n]) { size_t iters = factorial(n); for (size_t i = 0; i < iters; ++i) { print_array(n, A); next(n, A); } } ``` The above approach prints out all permutations of an array (assuming distinct values). %%ANKI Basic What *is* a permutation? Back: An ordered arrangement of some collection of objects. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How many permutations are there of $n$ objects? Back: $n!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How is $n!$ written recursively? Back: $n(n - 1)!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How is $n!$ permutations of $n$ objects derived? Back: There are $n$ choices for the first position, $n - 1$ choices for the second, etc. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What combinatorial concept explains $n!$ permutations of $n$ objects? Back: The multiplicative principle. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How does sorting relate to the concept of permutations? Back: Sorting aims to efficiently find a specific permutation. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). Tags: algorithm END%% %%ANKI Basic What symbol denotes "$n$ factorial"? Back: $n!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic $n!$ is shorthand for what other "big operator" formula? Back: $\Pi_{k=1}^n k$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What is the identity element of $\cdot$ (multiplication)? Back: $1$ Reference: Gries, David. *The Science of Programming*. Texts and Monographs in Computer Science. New York: Springer-Verlag, 1981. END%% %%ANKI Basic What does $0!$ (factorial) evaluate to? Back: $1$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic *Why* might $0! = 1$ (barring convention)? Back: Because the empty product is $1$, the multiplication identity. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What combinatorial concept explains the number of bijective functions between two finite sets? Back: Permutations (factorials). Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How many bijective functions exist between $\{1, 2, 3\}$ and $\{a, b, c\}$? Back: $3!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How many bijective functions exist between finite sets $A$ and $B$ where $|A| = |B| = n$? Back: $n!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% ### Lexicographic Ordering We can find the next lexicographic ordering of an array via a procedure of "pivot", "swap", and "reverse". The function `void next(const size_t n, int A[static n])` defined in [[#Overview]] shows the details, taking in a permutation and producing the next, lexicographically speaking. To prove correctness, consider the following: ``` [ a₁ a₂ ... aᵢ | aᵢ₊₁ aᵢ₊₂ ... aₙ ] ``` Here the RHS side is the longest increasing sequence we could find, from right to left. That is, $a_{i+1} > a_{i+2} > \cdots > a_n$. Denote $a_i$ as the pivot. Next, swap the smallest element in the RHS greater than $a_i$, say $a_j$, with $a_i$. This produces ``` [ a₁ a₂ ... aⱼ | aᵢ₊₁ aᵢ₊₂ ... aᵢ ... aₙ ] ``` Notice the RHS remains in sorted order. Since $a_j$ was the next smallest element, reversing the reverse-sorted RHS produces the next permutation, lexicographically speaking: ``` [ a₁ a₂ ... aⱼ | aₙ ... aᵢ ... aᵢ₊₂ aᵢ₊₁ ] ``` Eventually the swapped $a_j$ will be the largest in the RHS ensuring that the breakpoint will eventually move one more position leftward. %%ANKI Basic What algorithm does `NEXT_LEXICO_ARRAY` refer to? Back: The finding of the next lexicographic ordering of an array. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What does array `A`'s next lexicographic ordering refer to? Back: The permutation that follows `A` in a sorted list of all distinct permutations of `A`. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic How does lexicographic ordering of arrays relate to permutations of an array? Back: Each lexicographic ordering corresponds to a permutation. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: How many invocations guarantee all permutations of `A[1:n]`? Back: $n!$ Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: When does `< n!` iterations yield all permutations of `A[1:n]`? Back: When `A` contains duplicates. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is `NEXT_LEXICO_ARRAY`'s worst-case running time? Back: $O(n)$ Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is `NEXT_LEXICO_ARRAY`'s best-case running time? Back: $\Omega(n)$ Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is `NEXT_LEXICO_ARRAY`'s auxiliary memory usage? Back: $O(1)$ Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the next lexicographic ordering of `[ 1 3 2 4 ]`? Back: `[ 1 3 4 2 ]` Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the next lexicographic ordering of `[ 2 1 4 3 ]`? Back: `[ 2 3 1 4 ]` Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the next lexicographic ordering of `[ 4 3 2 1 ]`? Back: N/A Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the output of `NEXT_LEXICO_ARRAY([ 1 2 3 4 ])`? Back: `[ 1 2 4 3 ]` Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the output of `NEXT_LEXICO_ARRAY([ 4 3 2 1 ])`? Back: `[ 1 2 3 4 ]` Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: Which element will be the pivot of `[ 1 2 3 4 ]`? Back: `3` Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: Which element will be the pivot of `[ 4 3 2 1 ]`? Back: N/A Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What property does the RHS of `A[1:n]` exhibit before swapping? ``` [ a₁ a₂ ... aᵢ | aᵢ₊₁ aᵢ₊₂ ... aₙ ] ``` Back: Values are in non-increasing order. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What property does the LHS of `A[1:n]` exhibit before swapping? ``` [ a₁ a₂ ... aᵢ | aᵢ₊₁ aᵢ₊₂ ... aₙ ] ``` Back: N/A Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What property does the RHS of `A[1:n]` exhibit after swapping? ``` [ a₁ a₂ ... aⱼ | aₙ ... aᵢ ... aᵢ₊₂ aᵢ₊₁ ] ``` Back: Values are in non-increasing order. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What property does the LHS of `A[1:n]` exhibit after swapping? ``` [ a₁ a₂ ... aⱼ | aₙ ... aᵢ ... aᵢ₊₂ aᵢ₊₁ ] ``` Back: N/A Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic What is the first step taken in the `NEXT_LEXICO_ARRAY` algorithm? Back: Finding the pivot element. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What does the "pivot" refer to? Back: The element preceding the longest increasing subarray from right-to-left. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Cloze The `NEXT_LEXICO_ARRAY` algorithm can be summed up as "{pivot}", "{swap}", and "{reverse}". Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: *Which* element is swapped with the pivot? Back: The smallest element to its right that is greater than it. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What is done after swapping the pivot element? Back: Reverse the subarray to the right of where the pivot element was originally located. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What step follows swapping `A[1:n]`'s pivot element? ``` [ a₁ a₂ ... aⱼ | aₙ ... aᵢ ... aᵢ₊₂ aᵢ₊₁ ] ``` Back: Reverse the elements to the right of $a_j$. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% %%ANKI Basic `NEXT_LEXICO_ARRAY`: What invariant is maintained after swapping the pivot? Back: The elements to the right of the original pivot remain in non-increasing order. Reference: [https://leetcode.com/problems/next-permutation/description/](https://leetcode.com/problems/next-permutation/description/) END%% ## Falling Factorials If we generalize to choosing $k \leq n$ elements of $n$ objects, we can calculate the $k$-permutation of $n$. This is denoted as $(n)_k$, sometimes called the **falling factorial**. $$(n)_k = \frac{n!}{(n - k)!}$$ The derivation works by noting that we have $n - 0$ possible ways to pick the first object, $n - 1$ ways to pick the second, up until $n - (k - 1)$ ways to pick the last object. %%ANKI Basic What *is* a $k$-permutation? Back: An ordered arrangement, containing $k$ elements, of some collection of objects. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What is the closed formula for falling factorial $(n)_k$? Back: $$(n)_k = \frac{n!}{(n - k)!}$$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How is the number of $k$-permutations of $n$ objects denoted? Back: $(n)_k$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How is $n!$ written equivalently as a falling factorial? Back: $(n)_n$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How is $(n)_k$ $k$-permutations of $n$ objects derived? Back: There are $n$ choices for the first position, $n - 1$ choices for the second, etc. up until $n - (k - 1)$ choices for the last position. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What does $(n)_n$ evaluate to? Back: $n!$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What does $(n)_0$ evaluate to? Back: $1$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What combinatorial problem does $(n)_0$ represent? Back: The number of ways to choose $0$ objects from $n$ choices. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Cloze In a $k$-permutation of $n$ objects, there are $n - 0$ choices for first object and {$n - (k - 1)$} choices for the last object. Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic What combinatorial concept explains the number of injective functions between two finite sets? Back: $k$-permutations (falling factorials). Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% %%ANKI Basic How many injective functions exist between $\{1, 2, 3\}$ and $\{a, b, c, d, e\}$? Back: $(5)_3$ Reference: Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf). END%% ## Bibliography * Gries, David. *The Science of Programming*. Texts and Monographs in Computer Science. New York: Springer-Verlag, 1981. * Oscar Levin, *Discrete Mathematics: An Open Introduction*, 3rd ed., n.d., [https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf](https://discrete.openmathbooks.org/pdfs/dmoi3-tablet.pdf).