从一个序列里面选择第k大的数在没有学习算法导论之前我想最通用的想法是给这个数组排序,然后按照排序结果返回第k大的数值。如果使用排序方法来做的话时间复杂度肯定至少为O(nlgn)。

问题是从序列中选择第k大的数完全没有必要来排序,可以采用分治法的思想解决这个问题。Randomize select 算法的期望时间复杂度可以达到O(n),这正是这个算法的迷人之处。具体的算法分析可以在《算法导论》这本书里查看。

贴出伪代码:

RANDOMIZED-SELECT(A, p, r, i)
if p = r
then return A[p]
q ← RANDOMIZED-PARTITION(A, p, r)
k ← q - p +
if i = k ▹ the pivot value is the answer
then return A[q]
elseif i < k
then return RANDOMIZED-SELECT(A, p, q - , i)
else return RANDOMIZED-SELECT(A, q + , r, i - k)

这个算法的思想其实跟quik-sort有些相似,采用分治法的思想来解决。首先选择一个主元pirvot: q,将序列中的元素分为两个集合Q,W,Q里面的元素都小于主元pirvot,W里面的元素都大于pirvot。然后递归的调用这个过程可以得到我们想要的第i大的元素。这里的划分有三种情况:

1:主元的选择正好是第i大的元素,那么返回这个元素即可

2:Q里面的元素个数 k=(q-p+1) 大于i,代表第i大的元素还在Q这个集合里,那么继续这个过程寻找第i小的元素( step 7-8)

3:Q里面的元素个数 k=(q-p+1) 小于i,代表已经找到了k个小的元素,那么第i小的元素一定在W这个集合里,只要在W集合里寻找第(i-k)小的元素即可

下面给出这个算法的java实现:

/**
* 根据算法导论的伪代码,完成快速选择的代码。
* @author 截取自:http://blog.csdn.net/zy825316/article/details/19486167 */
public class randomizedSelect { /**
* @param args
*/
public static void main(String[] args) {
int a[]={,,,,,,,}; int result=randomizedSelect(a,,a.length-,);//产生第三小的数
System.out.print("\n"+result);
} private static int partition(int[] a, int p, int r) {
int x=a[r];
int i=p-;
for(int j=p;j<r;j++){
if(a[j]<=x){
i=i+;
swap(a, i, j);
}
}
swap(a, i+, r);
return i+;
} private static int randomizedPartition(int[] a,int p,int r){
java.util.Random random = new java.util.Random();
int i=Math.abs(random.nextInt() % (r-p+)+p);//产生指定范围内的随机数
swap(a,i,r);
return partition(a,p,r);
} /**
*
* @param a 数组
* @param p 数组的第一个元素
* @param r 数组的最后一个元素
* @param i 需要求第几小的元素
* @return
*/
private static int randomizedSelect(int[] a,int p,int r,int i){
if(p==r){
return a[p];//这种情况就是数组内只有一个元素
}
int q=randomizedPartition(a,p,r);
int k=q-p+;//拿到上一句中作为枢纽的数是第几小的数
if(i==k){
return a[q];
}else if(i<k){
return randomizedSelect(a,p,q-,i);
}else{
return randomizedSelect(a,q+,r,i-k);
} } private static void swap(int[] a, int i, int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
} }

Randomize select algorithm 随机选择算法的更多相关文章

  1. 使用Numpy验证Google GRE的随机选择算法

    最近在读<SRE Google运维解密>第20章提到数据中心内部服务器的负载均衡方法,文章对比了几种负载均衡的算法,其中随机选择算法,非常适合用 Numpy 模拟并且用 Matplotli ...

  2. 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.

    一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS. 选择算法也就是求一个无序数组中第K大( ...

  3. 用Python实现随机森林算法,深度学习

    用Python实现随机森林算法,深度学习 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩 ...

  4. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

  5. [Machine Learning & Algorithm] 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  6. [Data Structure & Algorithm] 八大排序算法

    排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...

  7. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  8. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  9. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

随机推荐

  1. window.location.hash属性介绍

    location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...

  2. 【数位DP】bzoj1026: [SCOI2009]windy数

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 1864[Submit][Sta ...

  3. uva 10780

    曾经做过一个类似的  求n!中有多少个质因子m 这里有一个结论 k = n/m+n/(m^2)+n/(m^3)+.... int getnum(int n, int m) { int sum = 0; ...

  4. c++ ANSI、UNICODE、UTF8互转

        static std::wstring MBytesToWString(const char* lpcszString);    static std::string WStringToMBy ...

  5. MFC的dll中控制资源问题

    有程序EXE和DLL,其中DLL中有1个函数用来显示对话框,被EXE调用.当EXE和DLL都为Release或Debug时,没有任何问题,但EXE为Release.DLL为Debug时,就会出错.该D ...

  6. 程序自动生成Dump文件

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...

  7. IText PdfPTable表格 单元的居中显示

    昨晚寻找了网上很多关于IText表格居中问题,他们其中的有些代码我即使复制上去生成的doc表格的文字都是不居中的,后来我自己找出了一种居中方式: 为PdfPCell对象添加paragraph对象,并将 ...

  8. SaaS系列介绍之一: SaaS的前身ASP介绍

    1. 引言 未来将越来越不可预测,这是新经济最具挑战性的方面之一.商务和技术上的瞬息万变会产生变化,这既可以看作要防范的威胁,也可以看作应该欢迎的机遇.                         ...

  9. Android UI-开源框架ImageLoader的完美例子

    Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...

  10. ios开发--网页中调用JS与JS注入

    先将网页弄到iOS项目中: 网页内容如下, 仅供测试: <html> <head> <meta xmlns="http://www.w3.org/1999/xh ...