`
akon405
  • 浏览: 45276 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

2012/4/4----随机选择法

 
阅读更多

写算法之前先吐槽一下,今天实在是不适合骑车。昨晚花了一个小时洗车,准备干粮,各种骑行装备全都检查一遍就为今天的骑行。早上6点起床,7点准时集合出发,但是出发后就开始下雨。结果我们冒雨骑了近40km,不仅全身湿透(没有挡泥板的车,雨天真的不想再骑了),还满背是泥。并且由于雨越下越大,路又滑导致骑行速度提不上去,全程140km已经不能顺利完成了,只有半途返回。

但是悲剧的事情又发生了,在返回的途中一朋友的车胎爆了,大家又在雨中花了近1个小时补胎(主要是车胎不好补,一次性爆了两个大洞,无奈)。回来之后照镜子看了一下,全身是泥,昨晚刚洗的车已经看不出车样了,于是又花了20分钟洗车。。。

好了,吐槽结束,开始写算法了。

随机选择法(RANDOMIZED-SELECT):选择出数组A经过排序后的第i个数(有一个专业名词需要了解--顺序统计量),常规方式是先对数组A进行排序,然后再取出A[i]的值就可以了。但是,使用先排序再选取这种方式,它的时间效率不太好。所以,这里我们使用“随机选择法”。其核心思想有点像快速排序,先找一个关键字key查看其所在数组中的位置q,然后再比较q和i的大小,如果i=q,则我们直接就可以取出关键字key;如果i>q,则我们又在[q+1...]这个范围内选择关键字进行比较,直到找到i=q为止;如果i<d,我们就在[0...q-1]这个范围内继续选择关键字进行比较,直到找到i=q为止。

至于详细的思想,程序中有足够的注释帮助理解。

/*
 * 随机选择法求数组中的”顺序统计量“----即在排序后的数组中,A[i]的值
 * @version 1.0 2012/4/4
 * @author akon
 */
package com.akon405.www;

public class RandomizedSelect {
	//randomized_Select函数可以求得A排序过后的A[i]的值
	public int randomized_Select(int[] A,int left,int right,int i){
		if(left==right){//如果数组只有一个元素的情况下直接返回数组中唯一的元素
			return A[left];
		}
		int q=division(A,left,right);//q为分割点的下标(数组A以key值为界限,分为两拨。key前面的数值比key小,key后面的数值比key大)
		if(i==q){//i等于分割点的下标
			return A[q];
		}else if(i<q){//i小于分割点的下标,则可以确定i在[left,q-1]这个区间里
			return randomized_Select(A,left,q-1,i);
		}else{//i大于分割点的下标,则可以确定i在[q+1,right]这个区间里
			return randomized_Select(A,q+1,right,i);
		}
		
	}
	
	//division函数可以实现对A的分割,把A按照关键字key进行分割,一部分比key大,一部分比key小(这里的key选定为数组A的第一个数据),最后返回分割点的下标
	public int division(int[] A,int left,int right){
		int key=A[left];//确定最右边的数组元素为关建数值
		int temp;
		//下面循环可以把输入的数组A以key值为界限,分为两拨。key前面的数值比key小,key后面的数值比key大
		while(left!=right){
		while(left<right&&key<A[right])
			right--;//从右向左找出比key小的第一个数值,下标为right
		temp=A[right];
		A[right]=A[left];
		A[left]=temp;
		while(left<right&&key>A[left])
			left++;//从左向右找出比key大的第一个数值,下标为left
		temp=A[right];
		A[right]=A[left];
		A[left]=temp;
		}
		return left;//分割点的下标,left=right
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] A={20,19,3,1,87,32,65};
		RandomizedSelect rs=new RandomizedSelect();
		int right=A.length-1;//数组的右边
		int left=0;//数组的左边
		int i=6;//第i个”顺序统计量“--即在排序后的数组中,A[i]的值
		if(i<=right)
		System.out.print(rs.randomized_Select(A, left, right, i));//输出这个所求的数据
	}

}
 
1
0
分享到:
评论

相关推荐

    2012-概率论与数理统计-期末试题及答案1

    4. 能作为随机变量X概率密度函数的必须满足归一性、非负性和在定义域内的积分等于1。选项A和B的积分不为1,选项C不是非负的,只有D满足条件。 5. 给定2S/(n-1)是样本方差的无偏估计,所以2S/(n-1)~t(n-1),而X-S/(n...

    层次分析法 AHP - 2012年美赛C题论文

    层次分析法(Analytic Hierarchy Process,AHP)是一种在决策过程中处理复杂、模糊和多准则问题的系统方法。由美国运筹学家Thomas L. Saaty于20世纪70年代提出,它结合了定量与定性的分析,适用于在多个相互关联的...

    2012年全国计算机一级考试题--选择题部分题.pdf

    计算机一级考试选择题涉及到计算机基础知识,包括程序语言、操作系统、硬件知识、计算机病毒、数制转换、网络传输、计算机历史、存储器特性和系统结构等多个方面。以下是对这些知识点的详细解析: 1. 高级程序设计...

    【创新方案】2014届高考数学一轮复习 10.1随机抽样讲解与练习 理 新人教A版.doc

    在高考中,随机抽样通常以选择题和填空题的形式出现,难度较低,如2012年天津T9和江苏T2等题目的实例。对于考生来说,理解和掌握随机抽样的基本概念和方法是关键,同时能灵活运用到实际问题中。 复习时,可以通过...

    河南省安阳一中2012-2013学年高一生物下学期第二次阶段测试试题新人教版

    1. 孟德尔遗传实验的成功因素:孟德尔遗传实验的成功在于他选择了豌豆作为实验材料,因为豌豆是严格的自花授粉植物,可以保证实验的遗传稳定性。他采用了一对相对性状优先研究的方法,逐步深入到多对性状的遗传规律...

    IOI国家集训队论文集1999-2019

    * _2010~2012:组委会暂停论文答辩项目_ * [_2013_](#2013) * [_2014_](#2014) * [_2015_](#2015) * [_2016_](#2016) * [_2017_](#2017) * [_2018_](#2018) * [_2019_](#2019) - _论文分类汇总(1999-2009...

    百度2012校园招聘机器学习数据挖掘工程师(北京)笔试题目--绝对经典

    - 第一个问题涉及生成随机点:利用`rand(s,t)`生成半径为R的圆内n个随机点,可以采用接受-拒绝法,时间复杂度为O(n)。 - 第二个问题是公平取样:可以使用 reservoir sampling 算法,其时间复杂度为O(m),并且保证...

    哈工大2012年秋季学期期末考题及答案.doc

    【哈工大2012年秋季学期概率论与数理统计期末考试解析】 这份试卷主要涵盖概率论与数理统计的基础知识,包括填空题、选择题、计算题和应用题,涉及到独立事件、互斥事件、概率密度函数、指数分布、泊松分布、随机...

    河南省长葛市第三实验高中2012-2013学年高一数学下学期第三次月考试题新人教A版

    可以通过列举法逐一计算每种情况的概率,再求和。例如,点数之和为6的组合有5种(1+5, 2+4, 3+3, 4+2, 5+1),以此类推。 18. **三角形解法** - **题目**: 在△ABC中,已知cosC=-1/4,求sinC的值;当a=2,2sinA=...

    吉林省吉林一中2012-2013学年高二数学下学期期末考试试题 理(含解析)新人教A版

    9. **图论与组合**:第18题中,涂色问题可以转换为图论中的染色问题,用五种颜色涂色,相邻区域不同色,考虑排除法,总涂色方法数为5^4 - 4 * 4! = 625 - 96 = 529种。 10. **二次函数与最值**:第17题是关于二次...

    数学建模-cumcm2012C.zip

    《数学建模-cumcm2012C.zip》是一个包含数学建模相关资料的压缩文件,其中的核心文档是“数学建模-cumcm2012C.doc”。这个文件很可能是中国大学生数学建模竞赛(China Undergraduate Mathematical Contest in ...

    山西省忻州一中2012-2013学年高一数学下学期期中试题 理 新人教A版

    9. **概率与圆周率的估计**:第十四题利用随机模拟方法估算圆周率,根据圆内豆子的比例来近似π/4,具体计算方法是π=4×(豆子数落在圆内/总豆子数)。 10. **三角恒等变换**:第十五题中,利用同角三角函数的关系...

    STM8-008_ADC采样滤波例程(V1.0_2012-10-12)_stm8s_ADC采样_stm8sadc采样_

    STM8系列微控制器是STMicroelectronics(意法半导体)推出的一种8位单片机,具有高性能、低功耗的特点,广泛应用于各种嵌入式系统。在这个STM8-008_ADC采样滤波例程中,我们将深入探讨STM8S微控制器如何执行模拟到...

    考研数学一 2012-2021真题解析

    【考研数学一 2012-2021真题解析】 考研数学一的真题解析涵盖了多项式计算、极限、曲面切平面、函数性质、矩阵理论、概率统计等多个核心知识点。以下是对这些题目的详细分析: 1. **极限问题**: 在选择题第一题...

    蒙特卡洛法评定

    2. 随机抽样:然后,为每个输入变量选择一个概率分布,这通常基于历史数据或专家经验。通过随机抽样,从这些分布中抽取数值。 3. 模拟过程:将抽样的数值代入测量模型,进行多次计算,获取大量可能的测量结果。 4....

    2007-2012全国大学生数学建模竞赛真题

    2007年至2012年的真题集是参赛者和教师们宝贵的参考资料,对于准备比赛和提高数学建模技能具有极高的价值。 数学建模是一种将实际问题抽象为数学模型的过程,它涉及多个数学领域,如微积分、线性代数、概率统计、...

    福建省福州八县(市)一中2012-2013学年高二数学下学期期末联考试题 理 新人教A版

    4. **随机变量及其性质**: - 问题9和10涉及到随机变量的分布列,求解分布列中未知的概率或特定函数的值。 - 问题11和12探讨了数列的性质,一个是余弦数列的定义,另一个是根据给定规则构建数列的方法。 5. **...

    北京市西城区(北区)2012-2013学年高二数学下学期期末考试试题 理 北师大版

    4. 组合问题,考察从有限集合中选择元素组合成特定条件的组合数。 5. 奇函数性质,涉及函数的导数与原函数的奇偶性关系。 6. 二次函数的图像分析,要求学生能够根据函数图像判断与x轴围成的图形面积。 7. 排列组合...

    STM32选型手册2012

    - **随机访问存储器 (RAM)**:RAM 用于运行时的数据存储,大小范围从 4KB 到 8KB。如 STM32F051K4 的 RAM 为 4KB,而 STM32F051C8 的 RAM 为 8KB。 - 不同的应用对存储器的需求不同。较大的程序存储器适合存储复杂的...

Global site tag (gtag.js) - Google Analytics