我知道,對於大小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