The \text{The } The Listen&Say
Test will be hold on May 11, so I decided to fill my blog \text{Test will be hold on May 11, so I decided to fill my blog } Test will be hold on May 11, so I decided to fill my blog
with English words until that day. \text{with English words until that day.} with English words until that day.
There goes a problem. \text{There goes a problem.} There goes a problem.
You’ve got 2 intergers N , k . Please calculate the k th permutation of ∀ k ∈ [ i , n ] . \text{You've got 2 intergers }N,k\text{. Please calculate the }k\text{th permutation of }\forall k\in[i,n]. You’ve got 2 intergers N,k. Please calculate the kth permutation of ∀k∈[i,n].
It’s easy to know that we can got it by Depth-first Search, \text{It's easy to know that we can got it by Depth-first Search, } It’s easy to know that we can got it by Depth-first Search, but its Time complexity is O ( n ! ) . \text{but its Time complexity is }O(n!). but its Time complexity is O(n!).
DeCantor Expansion
is a algorithm which can solve problems like these calculating the k th permutation \text{is a algorithm which can solve problems like these calculating the }k\text{th permutation} is a algorithm which can solve problems like these calculating the kth permutation in O ( n log n ) with heap optimization. \text{in }O(n\log n)\text{ with heap optimization.} in O(nlogn) with heap optimization.
Let’s explain how it works in a simple example. Set N = 5 , k = 61 , the answer is a [ ] . \text{Let's explain how it works in a simple example. Set }N=5,k=61,\text{ the answer is }a[]. Let’s explain how it works in a simple example. Set N=5,k=61, the answer is a[].
1. Let 61 / 4! = 2 ... 13, it shows that there’re 2 numbers behind a [ 1 ] are smaller than a[1]. \text{1.\quad Let 61 / 4! = 2 ... 13, it shows that there're 2 numbers behind }a[1]\text{ are smaller than a[1].} 1.Let 61 / 4! = 2 ... 13, it shows that there’re 2 numbers behind a[1] are smaller than a[1].
Therefore, a [ 1 ] = 3 ; \text{Therefore, }a[1]=3; Therefore, a[1]=3;
2. Let 13 / 3! = 2 ... 1, it shows that there’re 2 numbers behind a [ 2 ] are smaller than a[2]. \text{2.\quad Let 13 / 3! = 2 ... 1, it shows that there're 2 numbers behind }a[2]\text{ are smaller than a[2].} 2.Let 13 / 3! = 2 ... 1, it shows that there’re 2 numbers behind a[2] are smaller than a[2].
Therefore, a [ 2 ] = 4 ; \text{Therefore, }a[2]=4; Therefore, a[2]=4;
3. Let 1 / 2! = 0 ... 1, it shows that there’re 0 number behind a [ 3 ] are smaller than a[3]. \text{3.\quad Let 1 / 2! = 0 ... 1, it shows that there're 0 number behind }a[3]\text{ are smaller than a[3].} 3.Let 1 / 2! = 0 ... 1, it shows that there’re 0 number behind a[3] are smaller than a[3].
Therefore, a [ 3 ] = 1 ; \text{Therefore, }a[3]=1; Therefore, a[3]=1;
4. Let 1 / 1! = 1 ... 0, it shows that there’re 1 number behind a [ 4 ] are smaller than a[4]. \text{4.\quad Let 1 / 1! = 1 ... 0, it shows that there're 1 number behind }a[4]\text{ are smaller than a[4].} 4.Let 1 / 1! = 1 ... 0, it shows that there’re 1 number behind a[4] are smaller than a[4].
Therefore, a [ 4 ] = 5 ; \text{Therefore, }a[4]=5; Therefore, a[4]=5;
Therefore, a [ 5 ] = 2 , a [ ] = { 3 , 4 , 1 , 5 , 2 } . \text{Therefore, }a[5]=2, a[]=\{3,4,1,5,2\}. Therefore, a[5]=2,a[]={3,4,1,5,2}.
∀ i ∈ [ 1 , n − 1 ] , let k / ( n − 1 ) ! , the answer you’ve got is the number of interger j ∈ [ i + 1 , n ] which has a [ j ] < a [ i ] . And let k equals to the remainder. \forall i\in[1,n-1],\text{ let }k\ /\ (n-1)!\text{, the answer you've got is the number of interger }\newline j\in[i+1,n]\text{ which has }a[j]<a[i].\text{ And let }k\text{ equals to the remainder.} ∀i∈[1,n−1], let k / (n−1)!, the answer you’ve got is the number of interger j∈[i+1,n] which has a[j]<a[i]. And let k equals to the remainder.
Reference material \text{Reference material} Reference material