中位数之第K小的线性选择算法
来源:互联网 发布:阿里云带宽怎么升级 编辑:程序博客网 时间:2024/04/28 07:24
1973年,Blum、Floyd等几位大仙合并一体,写了一篇题为 “Time bounds for selection” 的章,给出了一种在数组中选出第k小元素的算法,俗称"中位数之中位数算法"。该算法从理论上保证了最坏情形下的线性时间复杂度(O(n))。而一个简单的排序算法像快速排序的时间复杂度是O(nlogn),利用类似于快速排序的做法是:首先对该无序数组进行排序(O(nlogn)),然后进行一次遍历(O(k))就可以找到第k小元素。下面我们来重点看看中位数排序法。
该算法使用分而治之的策略,查找到第K小元素在最坏情况下的时间复杂度为O(n)。
实现该算法的步骤如下:
1.如果n是一个比较小的数,比如n<6,那么只需要对此无序数组进行排序后,即可很容易的得到第K小元素。
此时约束时间T=7。
2.如果n>5,那么我们将这个无序数组分成五组。此时约束时间T=n/5。
3.找出每组的中位数,构成集合M。此时的约束时间T=7n/5.
4.递归的调用selection(M,|M|/2)算法查找上一步中所有中位数的中位数,设为m。此时的约束时间
T=T(n/5)。
5.用m来分割此时的数组,比较m与其他的(n-1)个数,小于m的数置于左集合L,大于m的数置于右集合R。当
然,中位数m的下标r=|L|+1(|L|是左集合L的个数)。此时的约束时间T=T(n)。
如果r=k,那么返回m。
如果r<k,那么在小于m的左集合L中递归查找第K小数。
如果r>k,那么在大于m的右集合R中递归查找第K小数。
递归方程:T(n)=O(n) + T(n/5) + T(7n/10) (证明过程略)
如果你想知道怎样得到次方程的,不妨找一本关于算法的书看一看或直接给我留言,谢谢!
另外,我想说的是:我为什么分为五组而不是分为其他的组。
假设我们将此数组分为三组,那么有:T(n) = O(n) + T(n/3) + T(2n/3) so T(n) > O(n)。如果我
们将此数组分成五组以上,那么就会显得有些麻烦了,所以分为五个组是最理性的选择。
由于鄙人的翻译水平所致,文中不妥之处还望各位指出来,谢谢!
- 中位数之第K小的线性选择算法
- 中位数之第K小的线性选择算法(续)
- 线性选择序列第k小 / 中位数附近k个数
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Java实现
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),C/C++实现
- 递归与分治策略-2.9.2线性时间选择(取中位数的中位数基准)(第k小问题)
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现
- 第九章中位数和顺序统计学 之 “寻找第i小元素之最坏情况线性时间的选择 最坏运行时间就为O(n)算法”
- 算法:快速排序以及第k小元素的线性选择算法
- 算法:快速排序以及第k小元素的线性选择算法
- 《算法导论》读书笔记之第9章 中位数和顺序统计学 最坏情况是线性时间的选择算法
- 算法--选择第K小的数
- 线性时间选择第K小元素(随机化选择第K小元素)C++
- 递归与分治策略之线性选择(第k小元素)
- 算法导论:第9章 中位数和顺序统计量_1期望为线性时间的选择算法
- 算法导论:第9章 中位数和顺序统计量_2最坏情况为线性时间的选择算法
- 线性时间选择第k小(递归)
- 算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
- document.defaultView.getComputedStyle
- ArraySortDemo1
- 光纤交换机如何划分zone
- 给XJTU大一CS系学生的网络资源推荐及一些建议
- jQuery学习之:jqGrid表格插件——参数配置
- 中位数之第K小的线性选择算法
- 水晶报表设置字段自动换行
- 准确获取当前时间
- 黑莓开发环境搭建windows7+eclipse+BlackBerry Java Plug+JDK6
- Sqlite简单介绍与一些常用的例子
- 软件版本命名规范
- sql2005 定时备份
- SQLite3 C/C++ 开发接口简介(API函数)
- java中的POJO是什么意思?