当前位置:  开发笔记 > 编程语言 > 正文

这种改组算法的效率和质量如何?

如何解决《这种改组算法的效率和质量如何?》经验,为你挑选了3个好方法。

最近关于使用C#随机排序的这个问题让我想到了我有时在Perl中改组数组的方式.

@shuffled = sort { rand() <=> rand() } @array;

在上述问题中提出的解决方案是Fisher-Yates shuffle,它在线性时间内工作.

问题是:我的代码片段效率如何,并且是如此随机"真正"随机?



1> David Thornl..:

我不是Perl的内部专家,所以我不知道"sort"在这里是如何工作的.但是,大多数排序函数都希望它们的比较具有一致性,如果函数本身是随机的,我希望它们能够无法预测地工作.不幸的是,不可预测性与随机性不一样,所以我对你的洗牌阵列没有信心.它可能倾向于以某种顺序放置元素,就像匆忙创建和复杂的递归关系可能不是随机的一样.

而不是分析排序函数,我建议与Fisher-Yates一起去.

正如Knuth所说,随机性太重要了,不能留给偶然.



2> derobert..:
$ perldoc List::Util
?
  shuffle LIST
       Returns the elements of LIST in a random order

           @cards = shuffle 0..51      # 0..51 in a random order
?

那是我的建议.



3> Greg Hewgill..:

我实际上有点惊讶你提议的洗牌工作.在Perl sort函数的实现中,它尝试根据比较函数的值以升序获取数组的元素.问题是,你的比较函数没有返回一致的答案!有时它可能会说"foo" lt "bar",而有时可能会说"bar" lt "foo".这有可能将排序算法混淆到它永远不会终止的地步,或者以致命错误或其他一些灾难性故障终止.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有