中位数和顺序统计量(第9章)
来源:互联网 发布:nginx php fpm 配置 编辑:程序博客网 时间:2024/06/05 14:58
学习由n个不同的树的集合中选择第i个顺序统计量的问题。
输入:一个包含n 个(互异的)数的集合A ,1≤i≤n 的整数i。
输出:元素x∈A ,并且A 中恰好有i个元素小于它。
求解第i小的元素的算法设计
1. Max 和 Min
在一个有n个元素的集合中,确定Max 和 Min的方法是遍历。
同时找到最大值和最小值,我们只需要最多
2. 期望时间是线性时间的选择算法
//划分算法 A[q]作为划分数组的主元PARTITION(A,p,q){ x=A[q] i=p-1 for j=p to q-1 if(A[j]<=x){//将比A[q]小的数值统一按照顺序移动到前面 i=i+1 exchange A[i] with A[j] } exchange A[i+1] with A[q] return i+1; }//随机划分算法 随机选择主元RANDOMIZED-PARTITION(A,p,q){ i=Random(p,q) exchange A[q] with A[i]; return PARTITION(A,p,q)}//Algorithms //这里不是从整个数组中找,而是从其中的一段中找 递归的算法设计如下RANDOMIZED-SELECT(A,p,q,i){ if(p==q)//检查递归的基本情况,A中仅仅包括一个元素这种情况下 i=1. return A[p] r=RANDOMIZED-PARTITION(A,p,q)//随机划分函数 k=r-p+1;//小于A[r]的元素的个数的计算 if(i==k){ return A[r] else if(i<k) RANDOMIZED-SELECT(A,p,r-1,i) else RANDOMIZED-SELECT(A,r+1,q,i) }}
如上
3. 最坏情况为线性的选择算法
指示器随机变量(indicator random variable):给定一个样本空间S和 事件A,那么事件A对应的指示器随机变量I{A}=1(如果A发生),0(如果A不发生);显而易见,事件A对应的指示器随机变量的期望等于事件A发生的概率。实例分析见指示器随机变量
类似于RANDOMIZED-SELECT算法,SELECT通过对输入数组的递归划分来找出所需元素,但是该算法能够保证对数组的一个好的划分。核心就是在划分主元的确定上,将PARTITION中的主元也作为输入参数进行输入。
具体算法的文字描述:
Step 1:把数组划分为若干个子数组,每个子数组里包含5个数,因为会有无法整除的可能,所以最后一个子数组可能会小于5.Step 2:用插入排序把每个组的5个数排序,然后找出中位数。Step 3:把获得的中位数又排序,找出中位数的中位数x。如果中位数的个数是偶数,那么取排好序的第 m/2 个数,m指的是中位数的个数。Step 4:把原来的数组使用类似快排的方法,分成两个部分。一部分比x大,一部分比x小。我们可以假设左边的数小,右边的数大。然后我们可以得到“中位数的中位数”的位置i.//这个地方是调用修改后的PARTITION,返回当前x的位置。 假设下标从1开始。Step 5:如果i = k, 那么那个“中位数的中位数”就是第小的数。如果 i < k, 则在低区递归调用SELECT来找出第i小的元素,如果i > k, 则在高区递归查找第i-k大的元素。
分析算法:
整个过程中,第1,2,4步所需时间为O(n), 注意第2步的复杂度不为O(n^2),第3步的复杂度为 T(n/5),第五步的复杂度为 T(7n/10)。注意这里第2步虽然我们使用的是插入排序,但是待排的序列长度为常数5,所以对一组的排序时间花费为O(1),对于n/5个组,其时间预期是O(n/5),即O(n)。
时间预期为
算法伪代码描述:
//设定主元参数的划分函数PARTITION(A,p,q,key){ i=p-1; for j=p to q-1{ if(A[j]<=key){//将比A[q]小的数值统一按照顺序移动到前面 i=i+1 exchange A[i] with A[j] } } return i+1; }//---------------------------------SELECT(A,p,q,i){ if(A.length<5){ InsertSort(A,p,q); return A[i]; } groups=A.length/5; midValues[groups]=0;//声明初始化一个中位数数组 for(int t=0;t<groups;t++){ InsertSort(A,t*5,t*5+5); midvalues[t] = A[t*5+3];//中 } InsertSort(midvalues,0,groups); if(groups/2==0){ x=midvalues[groups/2];//中位数的中位数作为主元 }else{ x=midvalues[groups/2+1];//中位数的中位数作为主元 } r=PARTITION(A,p,q,x)//设定主元的划分函数 k=r-p+1;//小于A[r]的元素的个数的计算 if(i==k){ return A[r] else if(i<k) SELECT(A,p,r-1,i) else SELECT(A,r+1,q,i) }}
- 中位数和顺序统计量(第9章)
- 第9章:中位数和顺序统计量
- 第 9 章 中位数和顺序统计量
- 第9章 中位数和顺序统计量
- 最小值与最大值(第9章:中位数和顺序统计量)...2014.4.28
- 第九章 中位数和顺序统计量
- 算法导论 第9章 中位数和顺序统计量 C++实现
- 《算法导论》第9章 中位数和顺序统计量 个人笔记
- 算法导论读书笔记(9)中位数和顺序统计量
- 顺序统计量和中位数
- 算法导论:第9章 中位数和顺序统计量_1期望为线性时间的选择算法
- 算法导论:第9章 中位数和顺序统计量_2最坏情况为线性时间的选择算法
- [算法导论]第九章《中位数和顺序统计量》
- 算法导论第九章-中位数和顺序统计量
- 算法导论 第九章 中位数和顺序统计量
- 中位数和顺序统计学之求解顺序统计量
- 中位数与顺序统计量
- 中位数与顺序统计量
- Python迭代器和生成器
- PHP的命名空间(转)
- Oracle数据库操作例题
- mysql 替换某个字段中的某个字符
- JAVA的Proxy动态代理在自动化测试中的应用
- 中位数和顺序统计量(第9章)
- Linux安装PHP7.0.2
- Kali 2.0 RTL8192eu驱动安装(记录贴)
- 使用intel ijl库 RGB转Jpg
- 《Android开发精要》读书笔记——Android应用模型
- UVA 11462(p39)----Age Sort
- iOS中的正则表达式
- MVC View中获取action、controller、area名称
- JAVA生产者消费者的实现