为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
2013-04-22 15:03
405 查看
排序算法对结果的唯一要求就是操作数满足全序关系:
如果 a≤b 并且 b≤c 那么 a≤c(传递性)。
对于 a 或 b,要不 a≤b,要不 b≤a(完全性)。
这个问题可以用信息论来回答。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/11e81a23a733644586edb12e68dd63dc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/8bbd65727e1cc9ded1ce945cfe5339de)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/d54016a65440d829a02cc5128ffc5b73)
我从 1 到 5 中挑一个数字出来让你来猜,每回合你都可以问我一个问题,我的回答“是”或“不是”(1 或 0),那么你至少需要几个回合才能保证猜出这个数字?
比较符合这个游戏精神的玩法是从自己的幸运数字(比如我的是7)开始猜起,一个一个地问我“是不是X?”, 可能你的运气足够好,一个回合就能够猜对,但是在最坏的情况下可能就需要5个回合,所以你的答案应该是“至少需要5个回合” (事实上你至少只需要一次就“有可能”猜出来,但为了“保证能”猜出来,你只好委曲求全地说 5), 换句话说这种猜法的最优下界是 5。 (平均性能是 1×1/5+2×1/5+…+5×1/5=(1+…+5)/5 = 3)
但因为你会二分,所以会这样问“是不是比3大?”……而且无论我挑出的数字是几,都只用3个回合。 二分显然是一种更佳的策略,那么它好在什么地方呢? 用信息论理解: 最大的熵。
英文版维基百科词条有个大致的解释:Comparison_sort, 最少次数为 log(5!) =
6.91,取整的话,就是 7。
决策树如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/18bcd512fd582d563b26cdc58600428b.jpg)
如果我们用归并排序的话,比较次数是O(nlogn),因为归并排序是 全局最优解,但是在局部,归并并不都保证是最优的。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/63640e6ccaf3d2413dde2020f4f0e71d)
附一张快速排序的 gif 图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/a62b6373746ffd78cbca4a7bb560558b.gif)
相关阅读:
面试算法有必要吗?
如果 a≤b 并且 b≤c 那么 a≤c(传递性)。
对于 a 或 b,要不 a≤b,要不 b≤a(完全性)。
这个问题可以用信息论来回答。
我从 1 到 5 中挑一个数字出来让你来猜,每回合你都可以问我一个问题,我的回答“是”或“不是”(1 或 0),那么你至少需要几个回合才能保证猜出这个数字?
比较符合这个游戏精神的玩法是从自己的幸运数字(比如我的是7)开始猜起,一个一个地问我“是不是X?”, 可能你的运气足够好,一个回合就能够猜对,但是在最坏的情况下可能就需要5个回合,所以你的答案应该是“至少需要5个回合” (事实上你至少只需要一次就“有可能”猜出来,但为了“保证能”猜出来,你只好委曲求全地说 5), 换句话说这种猜法的最优下界是 5。 (平均性能是 1×1/5+2×1/5+…+5×1/5=(1+…+5)/5 = 3)
但因为你会二分,所以会这样问“是不是比3大?”……而且无论我挑出的数字是几,都只用3个回合。 二分显然是一种更佳的策略,那么它好在什么地方呢? 用信息论理解: 最大的熵。
英文版维基百科词条有个大致的解释:Comparison_sort, 最少次数为 log(5!) =
6.91,取整的话,就是 7。
决策树如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/18bcd512fd582d563b26cdc58600428b.jpg)
如果我们用归并排序的话,比较次数是O(nlogn),因为归并排序是 全局最优解,但是在局部,归并并不都保证是最优的。
附一张快速排序的 gif 图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201304/a62b6373746ffd78cbca4a7bb560558b.gif)
相关阅读:
面试算法有必要吗?
相关文章推荐
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- 基于比较的算法之四:快速排序
- 算法 基于比较的排序
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- 基于比较的算法之二:选择排序
- 非基于比较的排序算法之一:计数排序
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 算法中对于用七次比较完成5个元素的排序
- 算法—比较两种排序算法:选择排序和插入排序(详细)
- 6.对数组进行排序、求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板ArrayAlg,并采用相关数据进行测试。
- 【算法设计与分析】5个数7次比较排序的算法
- 【算法】插入排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 关于插入排序元素之间比较次数的计算
- STL_算法_对全部元素排序(sort、stable_sort)
- C++学习笔记26——泛型算法之容器元素排序(sort unique)
- 算法学习笔记----确定n个元素的任何排列中逆序对的数目
- [置顶] 算法笔记 //05_有重复元素的排列问题(针对字母排序)
- 基于JAVA的排序算法之八--桶排序
- [算法设计与分析]3.1.3递归与循环的比较(输出各位数字+任何数都可以用2的幂表示+组合数)