【问题标题】:Efficient implementation of an iPod-like shuffle algorithm?类似 iPod 的 shuffle 算法的有效实现?
【发布时间】:2013-05-06 18:03:01
【问题描述】:

我们的目标是从 1..N 中随机选择一首不重复 N 首歌曲的歌曲,并且能够像在 iPod 中一样向前和向后迭代。我使用哈希表来存储随机歌曲。有没有更好的办法?

【问题讨论】:

  • 你能分享你的代码吗?
  • 在不知道你在写什么的情况下写这个有点难!
  • 向前和向后迭代是什么意思?
  • iPod 实际上会创建一个临时播放列表(我相信),因为它是随机播放的,因此您可以来回移动。

标签: algorithm random shuffle


【解决方案1】:

执行此操作的一个简单算法是从所有 N 首歌曲的列表开始,然后使用类似 Fisher-Yates Shuffle 的算法随机打乱数组元素。完成此操作后,您将以随机顺序对所有歌曲进行排序,并且没有重复。如果您跟踪列表中的当前索引,则可以通过在数组中向前或向后移动来实现下一个和上一个。

希望这会有所帮助!

【讨论】:

  • 所以 O(NlogN) 洗牌和 O(N) 空间来查找数组?
  • @McDowells- 实际上,只有 O(n) 来进行洗牌(Fisher-Yates 在 O(n) 时间内运行),然后在数组中只有 O(1) 查找时间。不过,您确实需要使用 O(n) 内存来保存打乱顺序。
  • 随机排列索引数组,减少内存开销。
  • @arynaq 交换两个对象引用并不太昂贵(现在使用 C/C++ 或 PHP 4.x 的人并不多)。
【解决方案2】:

一种方法是使用基于 LCG 的伪随机数生成器来选择歌曲。在每一步,歌曲 n+1 是 (an+b)Mod 2^N。确保 LCG 的周期大于 N。使用 LCG 的倒数向后迭代

【讨论】:

  • 有趣的想法。如何保证周期大于N?
  • en.wikipedia.org/wiki/Linear_congruential_generator#cite_note-HullDobell-3
  • 这不是给歌曲一个明确的非随机排列吗?
猜你喜欢
  • 2010-09-09
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 2015-05-20
  • 2021-12-23
相关资源
最近更新 更多