博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
阅读量:4110 次
发布时间:2019-05-25

本文共 614 字,大约阅读时间需要 2 分钟。

排序算法对结果的唯一要求就是操作数满足全序关系

  1. 如果 a≤b 并且 b≤c 那么 a≤c(传递性)。
  2. 对于 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个回合。 二分显然是一种更佳的策略,那么它好在什么地方呢? 用信息论理解: 最大的熵

英文版维基百科词条有个大致的解释:, 最少次数为 log(5!) = 6.91,取整的话,就是 7。

决策树如下:

比较排序决策树

如果我们用归并排序的话,比较次数是O(nlogn),因为归并排序是 全局最优解,但是在局部,归并并不都保证是最优的。

附一张快速排序的 gif 图:

快速排序

相关阅读:

你可能感兴趣的文章
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
关于无线PCB中 中50欧姆的特性阻抗的注意事项
查看>>
Spring的单例模式源码小窥
查看>>
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>