【发布时间】:2015-10-19 13:14:55
【问题描述】:
在 Ruby 编程语言中,myList.shuffle.first 比 myList.sample 慢,因为它完全打乱列表并选择第一个元素。如果在 Haskell 中完成类似的操作(随机播放并先获取),那会和后者一样快(对数组进行采样)吗?我假设列表将被懒惰地洗牌,因此选择第一个元素或取样将几乎相同。
【问题讨论】:
-
视情况而定。 AFAIK Haskell 标准没有规定任何特定的洗牌或采样算法,因此它完全取决于实现。在任何情况下,惰性不意味着计算机将执行尽可能少的计算来产生输出。它只是意味着它避免了给定输出的“明显无用的计算”。换句话说,
head $ shuffle something可以很好地执行一些用于对第一个元素以外的元素进行混洗的操作,具体取决于实现。懒惰只是告诉你,当产生第一个元素时,会避免其他步骤。 -
也许您可以看看并告诉我们[您想使用哪个
shuffle](hayoo.fh-wedel.de/?query=shuffle) ;) -
可以这样写,使用 decorate-sort-undecorate 模式:首先用随机数标记列表中的每个元素;按标签排序;扔掉标签;并取第一个元素。
sort的标准实现将使其成为 O(n) 操作,就像采样一样。不确定是否有开箱即用的包提供此功能,当然手动编写的算法版本可能具有更好的常量。 -
@DanielWagner 您应该将该评论作为答案:-)
-
@DanielWagner:我已将您的答案添加为社区 Wiki
标签: haskell lazy-evaluation shuffle sample random-sample