如何按原始顺序保留两个字段来重排行?

时间:2016-09-12 19:53:33

标签: algorithm

我有四个字段的行数组:

GROUP,NAME,KEY,VALUE

我需要"洗牌"此数组,但结果数组应符合以下规则:具有相同GROUP的每个KEY-VALUE对应具有与原始数组中相同的顺序

1 个答案:

答案 0 :(得分:0)

这是一种可能的算法,它需要一个与原始数组大小相同的辅助数组。它是O(N),但它在原始数组上进行了几次传递。

  1. 使用stable counting sort algorithm,复制按GROUP排序的原始数组。保留直方图以便在步骤3中使用。

  2. 使用Fisher-Yates shuffle algorithm对原始数组进行随机播放。

  3. 对在步骤2中创建的混洗数组进行最终传递。对于每一行,将KEYVALUE条目替换为下一个未使用的KEY和{{1来自步骤1中创建的已排序数组的条目。

  4. 计数排序算法假设VALUE值是小范围内的整数,理想情况下小于原始数组中的总行数。如果不是这种情况 - 组不是整数或者它们没有受限大小 - 那么可以通过将GROUP值放在哈希表中来创建计数排序的原始直方图。哈希表的条目不能超过GROUP,因此需要O(N)空间和预期的O(N)时间来创建。

    如果你打算反复洗牌同一个数组,那么你应该保留排序的数组和直方图的副本,因为这些辅助结构的构造超过了产生shuffle的一半时间。