我知道,对于大小k
的k
-permutation p
,从n
要素为基础,主要有:如何从n个元素中找到k-置换的索引?
P(n, k) = n!/(n - k)!
可能k
-permutations。例如:
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
-permutation p
指数?考虑按照字典顺序生成的排列 。
编辑: 我可以通过寻找在其中“块” p
是,通过寻址的p
第一元件的块开始。例如,对于p = [3, 2, 4]
,p
的索引应该至少为12(从0到P(n, k) - 1
)。
但是,为了找到那个“块”内的第二个元素,我必须看看剩下的项目是什么,以及它们将在哪个位置。我的意思是,我最终会在名单[1, 4]
,而4将位于第2位,所以仅仅使用元素作为关键就需要一些额外的操作。
我可以使用散列来查找元素并更新它们的位置,但它会给我一个O(n^2)
时间复杂度。有没有可能做得更好?
可能的出发点:http://en.wikipedia.org/wiki/Lehmer_code#Encoding_and_decoding – Kaz
@Kaz非常感谢参考资料。我会检查出来的,我也会尝试使用TXR。我正在考虑向Lisp介绍自己,现在我要试试Lisp和TXR。谢谢。 – Rubens