一个关于O(N*logN)耗时下限的理论
来源:互联网 发布:电磁兼容原理知乎 编辑:程序博客网 时间:2024/05/18 13:11
一个关于O(N*logN)耗时下限的理论
这里有一个疑问:是不是O(N*logN)是排序算法时间代价最好的极限呢?
当然不是,但是如果排序算法是基于"关键字比较"操作的,那么在最坏情况下确实能够到达的最好效果就是O(N*logN)了。 在最好情况下就没必要说了,如果待排序列基本有序,那么直接插入排序的比较次数都非常的少。
下面我们来证明一下(注意:这些排序算法的基本操作就是比较,其时间主要消耗在比较次数上)。现在有三个关键字K1、K2、K3。那么下图给出了这三个关键字记录在任何可能的排序状态下的判定树,树中的内部结点都进行了一次必要的比较。
三个关键字的待排序列只有上面叶子结点所描述的6中排序状态。而判定树上的每一次比较都是必须的。因此、这个判定树足以描述通过“比较”进行的排序过程。并且,每一个待排序列经过排序达到有序序列所需要进行的"比较"次数,恰为从树根到叶子结点的路径长度。因此3个关键字的比较最少需要2次,最多需要3次。
扩展一下,有N个关键字序列。那么就有N!种排序状态,自然判定树就有N!个叶子节点。我们知道,二叉树的树高为h的情况下,叶子结点最多有2^(h-1)个。而现在又N!个叶子结点,那么树高至少为log(N!)+1。也就是说,描述N个记录排序的判定树必存在一条长度为[log(N!)+1]的路径。根据斯特林公式(n!的高精度近似求解公式): log(N!)=N*log(N)。因此,最少的比较次数也就是N*log(N)了。
基于比较操作的排序算法的时间复杂度下限确实是O(N*logN)。那么如果不比较呢,耗时代价会不会进一步减少。当然,关于这方面的排序算法,请见《桶排序 》、《基数排序 》。
- 一个关于O(N*logN)耗时下限的理论
- LCA <O(N logN, O(logN)>
- O(logn*2^logn)和O(n*logn)算法
- 关于O(logN)的正确理解
- 算法导论15.4-6 求一个n个数的序列的最长单调递增子序列 O(n*logn)
- LCS O(n logn)解法
- 归并排序 O(N*logN)
- 今天才搞清楚排序算法的O(N*logN)是什么意思
- 最长不下降子序列的O(n*logn)算法
- 今天才搞清楚排序算法的O(N*logN)是什么意思
- 这算O(n)还是O(logn)?
- 把O(n)变成O(logn)
- closest pair of points(O(n*logn*logn)) solution
- o(1), o(n), o(logn), o(nlogn)
- poj-3903 Stock Exchang O(N*logN)
- [LeetCode] Pow(x,n) O(logN)
- COGS 1473 O(N*logN) 高精乘 FFT
- O(logN)时间复杂度内求整数的N次方以及矩阵的N次方
- 面试笔试题集合--转自北邮论坛
- Zend Controller Action Helper Broker 源码笔记
- 解决IE6不能正常使用显示透明背景的.png图片(集)
- joomla邮件设置
- 多叉树的递归遍历和堆栈遍历【多叉树的前序遍历及后续遍历】
- 一个关于O(N*logN)耗时下限的理论
- 个人技术简介
- 提高Oracle性能3
- struts2.2搭建s2sh多加一个Jar包
- 少了control_transit_play.jsp文件 会自动跳转
- 一道智力java题 你做过吗?
- sed初级使用-------shell学习(7)
- 大家一起来
- W. :最大优先级队列