【问题标题】:How to shuffle rows with keeping two fields in original order?如何在保持两个字段原始顺序的情况下打乱行?
【发布时间】:2016-09-12 19:53:33
【问题描述】:

我有四个字段的行数组:

组、名称、键、值

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

【问题讨论】:

  • 但不是名字?好奇。
  • 您是否需要一种可以正常工作的算法,或者是否可以按顺序生成一个新数组?
  • 内存不是问题,数组不是很大,所以任何方式都可以

标签: algorithm


【解决方案1】:

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

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

  2. 使用Fisher-Yates shuffle algorithm 将原始数组打乱到位。

  3. 对步骤 2 中创建的混洗数组进行最后一次遍历。对于每一行,将创建的排序数组中的下一个未使用的 KEYVALUE 条目替换为 KEYVALUE 条目在第 1 步中。

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

如果您打算重复对同一个数组进行 shuffle,那么您应该保留已排序的数组和直方图的副本,因为这些辅助结构的构建是产生 shuffle 时间的一半以上。

【讨论】:

  • 我知道了,最后一关没有逃脱。因此,我以更粗略的方式进行了处理 - 我为每个 GROUP 添加了 ORDER 列,从 1 到 N,然后随机播放,然后为每个 GROUP-KEY 搜索对。如果成对的 ORDER 不是偶数,我只是交换行。谢谢大家
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2013-07-26
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多