我有一個數組:算法重新排列的數組
1 1A 2 2A 3 3A 4 4A 5 5A
我需要通過隨機重新安排它,條件:1A必須背後1,圖2A落後2 ...(不一定喜歡1 1A )
的期待後導致重新排列如下:
1 4 2 4A 3 2A 5 1A 5A 3A
幫助我的最好的算法(最好的速度)
我有一個數組:算法重新排列的數組
1 1A 2 2A 3 3A 4 4A 5 5A
我需要通過隨機重新安排它,條件:1A必須背後1,圖2A落後2 ...(不一定喜歡1 1A )
的期待後導致重新排列如下:
1 4 2 4A 3 2A 5 1A 5A 3A
幫助我的最好的算法(最好的速度)
你可以嘗試這樣的:
[[1, 1A], [2, 2A, 2B], [3, 3A], ...]
萬一部分排序是更復雜的,例如如果某些元素a
必須在b
和c
之前,但在b
和c
之間沒有偏序,則可以對樹或類似元素執行相同操作。
此外,正如@vib所指出的,爲了確保結果中元素的均勻分佈,您應該選擇與隊列中剩餘元素的數量成比例的不同隊列。
請注意,分組需要映射/排序集合(O(n)空間/ O(nlogn)時間) - 它本質上是元素獨立性問題。 – amit
@amit我認爲分組將是O(n)時間,只要序列已經排序(就像問題中似乎是這樣),並且您只需確定每個元素所屬的組。 –
謝謝,我認爲這很好。你拯救了我的生命... –
O(n)
中爲陣列中的所有元素創建map:Element->Index
來完成。總複雜性:O(n)
(時間)平均情況
輸出被保證是隨機均勻地混洗,從Fisher-耶茨的正確性。
僞代碼:
array = shuffle(array)
map = new map
for each element e in array with index i:
map.add(e,i)
for each element e in the array:
if e is "x" (not "xA"):
i = map.get(e)
j = map.get(xA)
if j<i:
swap(arr,i,j)
謝謝你,但我認爲tobias的解決方案對我來說很好,很容易 –
是比「shuffle」算法更快的「Random pick」算法嗎? –
「最好」在哪?時間?記憶?分配? –
謝謝,我的意思是最好的「時間」 –
把依賴元素放入不同的隊列,比從隨機隊列中隨機選取一個元素,直到所有隊列都爲空。 –