algorithm - 大量重复的无偏洗牌

标签 algorithm random permutation shuffle fisher-yates-shuffle

Fisher-Yates 算法生成有限序列的无偏随机排列。运行时间与被打乱的元素数量成正比。

我想将一些非零元素与大量零元素进行混洗。

使用列表实现 Fisher-Yates 算法会导致洗牌过程花费太长时间并需要太多存储空间。 Fisher--Yates 算法中的大多数步骤只是简单地交换重复零元素的位置。

是否存在随机洗牌(或替代)算法:

  1. 导致无偏排列
  2. 不需要打乱和存储所有重复元素

最佳答案

由于 Fisher-Yates 洗牌产生随机排列,因此其逆也是随机排列:

  1. 对于 i=1 到 n-1:
    1. 在 [0,i] 中选择一个随机数 j
    2. 交换元素 i 和 j

但是,在这个算法中,如果有 m 个非零元素,并且最后从所有这些元素开始,那么前 n-m 次迭代一定会交换零,因此您可以跳过这些元素。

如果您想避免存储所有零元素,请使用 HashMap 而不是数组。

关于algorithm - 大量重复的无偏洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69720725/

相关文章:

algorithm - 矩阵乘法的时间复杂度

algorithm - 钳位到系列中的下一个最低值

子文件夹中的 Python 随机行

改组 itertools.permutation(range(15)) 时出现 Python OOM 错误

java - 计算没有两个相邻字符相同的所有排列

Java:数组的可能组合

java - 8皇后没有8皇后全食宿需要重启

c++ - 如何使用 C++11 标准库生成随机数

python - 如何在python中生成但排除某个数字整数中的某个数字

java - 需要优化程序逻辑。单词问题1 Sweet1