在haskell中洗牌和先取vs采样
在Ruby编程语言中,在haskell中洗牌和先取vs采样,haskell,lazy-evaluation,shuffle,sample,random-sample,Haskell,Lazy Evaluation,Shuffle,Sample,Random Sample,在Ruby编程语言中,myList.shuffle.first比myList.sample慢,因为它会完全洗牌列表并选择第一个元素。如果在Haskell中进行了类似的操作(先洗牌,然后取走),那么速度是否会与后面的操作(对数组进行采样)一样快?我假设列表将被延迟地洗牌,因此拾取第一个元素或获取样本实际上是相同的。它可以这样写,使用装饰排序-取消装饰模式:首先用随机数标记列表中的每个元素;按标签分类;扔掉标签;以第一个元素为例。sort的标准实现将使其成为一个O(n)操作,就像采样一样。不确定是否
myList.shuffle.first
比myList.sample
慢,因为它会完全洗牌列表并选择第一个元素。如果在Haskell中进行了类似的操作(先洗牌,然后取走),那么速度是否会与后面的操作(对数组进行采样)一样快?我假设列表将被延迟地洗牌,因此拾取第一个元素或获取样本实际上是相同的。它可以这样写,使用装饰排序-取消装饰模式:首先用随机数标记列表中的每个元素;按标签分类;扔掉标签;以第一个元素为例。sort
的标准实现将使其成为一个O(n)操作,就像采样一样。不确定是否有现成的软件包提供此功能,当然,手动编写的算法版本可能有更好的常量。这取决于具体情况。Haskell标准没有规定任何特定的洗牌或采样算法,因此它完全取决于实现。在任何情况下,懒散并不意味着计算机将尽可能少地进行计算以产生输出。它只是意味着它避免了给定输出的“显然无用的计算”。换言之,head$shuffle something
可能会执行一些用于洗牌元素而不是第一个元素的操作,具体取决于实现。懒散只是告诉你,当第一个元素被生成时,其他步骤是可以避免的。也许你可以看一看,告诉我们你想要使用的[whichshuffle
](hayoo.fh wedel.de/?query=shuffle;)它可以这样写,使用装饰排序取消装饰模式:首先用随机数标记列表中的每个元素;按标签分类;扔掉标签;以第一个元素为例。sort
的标准实现将使其成为一个O(n)操作,就像采样一样。不确定是否有现成的软件包提供此功能,当然手动编写的算法版本可能有更好的常量。@DanielWagner您应该将此评论作为答案:-)@DanielWagner:我已将您的答案添加为社区Wiki