Randomize select algorithm 随机选择算法
从一个序列里面选择第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 随机选择算法的更多相关文章
- 使用Numpy验证Google GRE的随机选择算法
最近在读<SRE Google运维解密>第20章提到数据中心内部服务器的负载均衡方法,文章对比了几种负载均衡的算法,其中随机选择算法,非常适合用 Numpy 模拟并且用 Matplotli ...
- 一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS.
一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS. 选择算法也就是求一个无序数组中第K大( ...
- 用Python实现随机森林算法,深度学习
用Python实现随机森林算法,深度学习 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩 ...
- Bagging与随机森林算法原理小结
在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...
- [Machine Learning & Algorithm] 随机森林(Random Forest)
1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...
- [Data Structure & Algorithm] 八大排序算法
排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...
- R语言︱决策树族——随机森林算法
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...
- R语言︱机器学习模型评估方案(以随机森林算法为例)
笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...
- Python机器学习笔记——随机森林算法
随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...
随机推荐
- Log4net Level
ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); l ...
- Android 图片旋转(使用Matrix.setRotate方法)
imageView2 = (ImageView) findViewById(R.id.img2); Bitmap bitmap = BitmapFactory.decodeResource(getRe ...
- mybatis和spring3.1整合
因spring3发布时mybatis还没有出正式版本,所以spring没有整合最新的mybatis.不过社区倒是开发了一个中间件. 需要的jar包 mybatis-3.0.6.jar mybatis- ...
- [Unity菜鸟] Unity读XML
1. 在Unity中调试可行,发布成exe可行,发布成web不行 Application.dataPath 在Unity中调试是在“..Assets”文件夹下, 发布成exe文件是在“..yourNa ...
- 新的HTTP框架:Daraja Framework
https://www.habarisoft.com/daraja_framework.html
- (组合数学3.1.2.1)POJ 2249 Binomial Showdown(排列组合公式的实现)
/* * POJ_2249.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> #i ...
- 你想建设一个能承受500万PV/每天的网站吗?
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 你想建设一个能承受500万P ...
- Java版本的在指定目录及子目录下创建指定的文件
和删除指定目录及子目录下名叫“xxx.txt”的所有文件一样,也是使用递归的方式实现的. 代码如下: public class Example826003 { private static FileO ...
- Tomcat详解
解压缩下载的Tomcat压缩包,呈现的目录结构如下. bin:目录存放一些启动和关闭Tomcat的可执行程序和相关内容.conf:存放关于Tomcat服务器的全局配置.lib:目录存放Tomcat运行 ...
- poj 2418 Hardwood Species (map)
题目:http://poj.org/problem?id=2418 在poj 上交题总是有各种错误,再次感叹各个编译器. c++ AC代码,G++为超时,上代码: #include<cstdio ...