平均排序
来源:互联网 发布:js redirect 重定向 编辑:程序博客网 时间:2024/04/29 08:41
8-5 平均排序
假设我们不是要排序一个数组,而只是要求数组中的元素一般情况下都是层递增序的。更准确地说,称一个包含n个元素的数组A为k排序的(k-sorted),如果对所有i=1,2, ..., n-k,有下式成立:
a)给出一个数组是1排序的是什么意思?
b)给出数字1,2, ..., 10的一个排列,它是2排序的,但不是完全排序的。
c)证明:一个n元素的数组是k排序的,当且仅当对所有i=1,2, .... n-k 有 A[i] ≤ A[i+k]。
d)给出一个算法,它能在O(nlg(n/k))时间内,对一个n元素的数组进行k排序。
e)说明一个长度为n的k排序的数组可以在O(nlgk)内排序。
f)说明当k是一个常量时,需要Θ(nlgn)时间来k排序一个n元素的数组。(提示:可以利用前一部分的结果及比较排序的下界)
分析与解答:
a)数组1排序时就和我们平常的排序一样了。
b)2排序但不是全排序的例子:
1 6 2 7 3 8 4 9 5 10
c) 该推论非常容易得到,证明如下:
d)根据c)得到的结果,一个n元素的数组是k排序,当且仅当A[i] ≤ A[i+k]。也就是说,等价于
A[0] ≤ A[k] ≤ A[2k] ≤ A[3k] ....
A[1] ≤ A[k+1] ≤ A[2k+1] ≤ A[3k+1] ...
..........
根据上述观察,我们可以分成k个独立的分组,每个分组的大小为n/k进行排序即可。
每个大小为n/k的分组进行排序的时间复杂度为O(n/k*lg(n/k)),那么k个分组总的时间复杂度为
k*O(n/k*lg(n/k)) = O(nlg(n/k))
e) 使用k个元素的最小堆,进行k路归并,每次提取最小值和增加一个新元素的时间复杂为O(lgk),总共需要n次提取最小值和增加新元素的操 作, 则对应的时间复杂度为O(nlgk)。
f)因为可以采用O(nlg(n/k)时间内对一个n元素的数组进行k排序,则时间复杂度为O(nlg(n))
以下用决策树得到k排序的下界:
一个n元素的数组最后生成的可能k排序的数目为
那么,决策树的高度h满足
即时间复杂度为Ω(nlg(n))
结合上面的结果以及基于比较的k排序的下界可知,当k是一个常量时,需要Θ(nlgn)时间来k排序一个n元素的数组。
- 平均排序
- 基于贝叶斯平均的产品排序方法
- 交换排序的平均复杂度的证明
- 排序的平均时间复杂度和稳定性
- 排序算法:实现,平均复杂度,最好…
- 快速排序最好,最坏,平均复杂度分析
- 基于贝叶斯平均的产品排序方法
- 快速排序[平均时间复杂度O(NlogN)]
- 基于贝叶斯平均的产品排序方法
- 快速排序最好,最坏,平均复杂度分析
- cpp: 学生成绩排序,计算平均分
- 平均
- 算法导论8-5-平均排序-k排序
- 查询不同班级,不同课程的平均成绩,按照平均成绩从大到小排序
- 算法导论8-5思考题-平均排序-average sorting
- 冒泡排序法,求平均分,多谢指教
- 快速排序 平均时间复杂度 分析(random pivot)
- 常用排序算法的稳定性与平均时间复杂度
- “温水煮青蛙”的实验论证
- Eclipse 内部启动 Tomcat,浏览器访问出错的解决方法
- 线段树求区间最值
- Ogre的GPUProgram的参数管理
- 如何创建特殊总账数据源
- 平均排序
- BW增强数据源的几个函数
- F2812片上外设时钟分组
- Surf试用感受
- Web开发人员常用速查手册推荐
- 关于C++中更改默认比较关系的总结
- ubuntu 下修复使用sudo命令后出现主机名字不能解析的错误:Fix Ubuntu sudo Error:unable to resolve host
- 基于TMS320F2812的三电平逆变器载波调制方法研究
- Firebug调试CSS布局