我有四个字段的行数组:
GROUP,NAME,KEY,VALUE
我需要"洗牌"此数组,但结果数组应符合以下规则:具有相同GROUP的每个KEY-VALUE对应具有与原始数组中相同的顺序
答案 0 :(得分:0)
这是一种可能的算法,它需要一个与原始数组大小相同的辅助数组。它是O(N),但它在原始数组上进行了几次传递。
使用stable counting sort algorithm,复制按GROUP排序的原始数组。保留直方图以便在步骤3中使用。
使用Fisher-Yates shuffle algorithm对原始数组进行随机播放。
对在步骤2中创建的混洗数组进行最终传递。对于每一行,将KEY
和VALUE
条目替换为下一个未使用的KEY
和{{1来自步骤1中创建的已排序数组的条目。
计数排序算法假设VALUE
值是小范围内的整数,理想情况下小于原始数组中的总行数。如果不是这种情况 - 组不是整数或者它们没有受限大小 - 那么可以通过将GROUP
值放在哈希表中来创建计数排序的原始直方图。哈希表的条目不能超过GROUP
,因此需要O(N)空间和预期的O(N)时间来创建。
如果你打算反复洗牌同一个数组,那么你应该保留排序的数组和直方图的副本,因为这些辅助结构的构造超过了产生shuffle的一半时间。