如何在保持两个字段原始顺序的情况下打乱行?

Posted

技术标签:

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

我有四个字段的行数组:

组、名称、键、值

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

【问题讨论】:

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

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

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

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

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

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

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

【讨论】:

我知道了,最后一关没有逃脱。因此,我以更粗略的方式进行了处理 - 我为每个 GROUP 添加了 ORDER 列,从 1 到 N,然后随机播放,然后为每个 GROUP-KEY 搜索对。如果成对的 ORDER 不是偶数,我只是交换行。谢谢大家

以上是关于如何在保持两个字段原始顺序的情况下打乱行?的主要内容,如果未能解决你的问题,请参考以下文章

在保持原始行顺序的同时合并两个数据框

Mysql某个表有近千万数据,CRUD比较慢,如何优化?

如何打乱一组数的顺序?

如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?

spark:如何在数据帧上进行 dropDuplicates,同时保持最高时间戳行 [重复]

在函数被装饰的情况下如何取消装饰器,访问原始函数