我知道,对于一个k
-排列p
大小的k
,从构建n
元素,有:
P(n, k) = n! / (n - k)!
可能的k
-排列。例如:
k = 2
n = 4
l = [1, 2, 3, 4]
P(n, k) = 4! / (4 - 2)! = 12
1 2 | 2 1 | 3 1 | 4 1
1 3 | 2 3 | 3 2 | 4 2
1 4 | 2 4 | 3 4 | 4 3
还有另一个例子:
k = 3
n = 4
l = [1, 2, 3, 4]
P(n, k) = 4! / (4 - 3)! = 24
1 2 3 | 2 1 3 | 3 1 2 | 4 1 2
1 2 4 | 2 1 4 | 3 1 4 | 4 1 3
1 3 2 | 2 3 1 | 3 2 1 | 4 2 1
1 3 4 | 2 3 4 | 3 2 4 | 4 2 3
1 4 2 | 2 4 1 | 3 4 1 | 4 3 1
1 4 3 | 2 4 3 | 3 4 2 | 4 3 2
那么,如何找到该索引k
-排列p
?考虑排列
按字典顺序生成。
Edit:
我可以首先找到哪个“块”p
是,通过第一个元素来寻址块p
。例如,对于p = [3, 2, 4]
,索引为p
应至少为 12(从 0 到P(n, k) - 1
).
但是,为了找到该“块”内的第二个元素,我必须查看要找到的剩余项目是什么,以及它们将位于哪个位置。我的意思是,我最终会处理这个列表[1, 4]
,4 将位于位置 2,因此简单地使用该元素作为键将需要一些额外的操作。
我可以使用哈希来查找元素并更新它们的位置,但它会给我一个O(n^2)
时间复杂度。是否可以做得更好?