我有一个数组:算法重新排列的数组
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”算法吗? –
“最好”在哪?时间?记忆?分配? –
谢谢,我的意思是最好的“时间” –
把依赖元素放入不同的队列,比从随机队列中随机选取一个元素,直到所有队列都为空。 –