我想創建一個函式 f ,它將整數索引映射到串列 L 的唯一排列,無論語言如何。那里已經解決了一個非常相似的問題,這里的區別是我們不想要重復的排列(例如:[1,0,0] 不是 [1,0,0] 的有效排列,請參閱下面的完整示例)。據我所知,這個特殊問題尚未得到解決。
這是一個例子。考慮一下串列:
L = [1,0,0,-1]
然后我希望該函式執行類似于以下的映射:
f(0) = [1,0,0,-1]
f(1) = [0,1,0,-1]
f(2) = [0,0,1,-1]
f(3) = [1,0,-1,0]
f(4) = [0,1,-1,0]
f(5) = [0,0,-1,1]
f(6) = [1,-1,0,0]
f(7) = [0,-1,1,0]
f(8) = [0,-1,0,1]
f(9) = [-1,1,0,0]
f(10) = [-1,0,1,0]
f(11) = [-1,0,0,1]
順序無關緊要,重要的是我得到了從集合 [0;11] 到 L 的唯一排列的雙射映射,沒有任何重復。我正在尋找一個通用的解決方案,它可以適用于任何串列 L,而且它應該避免存盤所有可能的排列,因為這很容易不切實際。有沒有辦法做到這一點 ?
uj5u.com熱心網友回復:
一個通用的演算法如下:
- 將串列轉換為一組與每個專案在串列中出現的次數相關聯的唯一專案。例如:
["A","C","A","C","B","A"]
→[["A",3], ["B",1], ["C",2]]
- 設定
n
為原始串列中m
的專案數,以及縮減集中的專案數(在本例中為n=6
和m=3
),假設您要生成i
此串列的第 th 個排列。 - 創建一個新的空串列
- 直到這個新串列的長度等于
n
:
- 計算
x = i % m
并將x
一組唯一項中的第一項添加到您的串列中。- 設定
i
為整數部分i / m
- 減少此
x
專案的出現次數。如果它都為零,則從集合中洗掉該專案并遞減m
- 新串列現在包含第
i
th 排列
或者,您可能希望確保它i
在從 0 到小于等于 n 的排列總數的范圍內。除以縮減集中每個出現次數的階乘(上例中為 6!/(3!1!2!))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482725.html
上一篇:查找樹高時超出時間限制
下一篇:使用Dfs演算法達到目標