【问题标题】:shuffle and take first vs sampling in haskell在haskell中洗牌并首先与采样
【发布时间】:2015-10-19 13:14:55
【问题描述】:

在 Ruby 编程语言中,myList.shuffle.firstmyList.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


【解决方案1】:

可以这样写,使用 decorate-sort-undecorate 模式:首先用随机数标记列表中的每个元素;按标签排序;扔掉标签;并取第一个元素。 sort 的标准实现将使它成为一个 O(n) 操作,就像采样一样。不确定是否有开箱即用的包提供此功能,当然手动编写的算法版本可能具有更好的常量。

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 2017-07-09
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多