k-选取问题之快速选取策略quickSelection
1. 问题描述:
k-选取问题:从一组无序数组中,找出第k大的元素。
2. 思路分析:
通常想到的是先排序,然后直接取出秩为k的元素,即为所求解。但是根据比较式算法的结论:该算法最坏情况下需要O(nlogn)时间复杂度。对于一个容量较大的数组来说,复杂度太高。
这里介绍一种基于减而治之、逐渐逼近的策略,即利用二分思想来解决这个问题。它可以在最好或者平均意义上做到线性,即Ω(n).
3. quickSelection算法
strategy: 基于“猜测”思想,有些类似于快速排序的划分思想。
1)随机抓取一个元素,猜测它是第k大的。定义为轴点pivot
2)元素数组中,大于pivot的元素放在数组右边,小于pivot的元素放在数组左边。完毕时,pivot定位,秩为i,数组分成三部分,小于pivot的左数组,等于pivot的元素,大于pivot的右数组。此时,pivot恰好为元素中第i大的元素。
3)如果k小于i,则在左数组中重复执行1)-2)步;否则,在右数组中重复执行1)-2)步。
4)基于以上逐步逼近的思想,最终会收敛到一个确定的秩,即为所求第k大的元素。
这里,你或许会问,为什么在3)步不采用三分思想,解释是:由于数组元素比较是一个费时的工作,尤其是元素类型不明确的情况下,所以这里采用二分思想更好。
4. 基于以上算法思想实现的代码:
//快速选取序列中第k大的元素的秩
int quickSelect(vector<int> &q,int k){
int lo=0,hi=q.size()-1; //闭区间内的操作
while (hi>lo)
{
int pivot=q[lo];
int i=lo,j=hi;
while(j>i){
while(j>i){
if(pivot<q[j])
j--;
else{
q[i++]=q[j];
break;
}
}
while(j>i){
if(q[i]<pivot)
i++;
else{
q[j--]=q[i];
break;
}
}
}
q[i]=pivot;
if(k<=i)
hi=i;
else{
lo=i+1;
}
}
return --lo;
}
k-选取问题之快速选取策略quickSelection相关推荐
- Mastercam若要加工多个相同大小的孔该如何一次性做快速选取?
Mastercam若要加工多个相同大小的孔该如何一次性做快速选取? 从[刀具路径]中点选[钻孔],出现如下图所示先点选[限定圆弧],点选你要的一个孔做圆弧限定,再全选所有图并按下结束选取,就可选取该相 ...
- 《现代命令行工具指南》3. 选取字符:让选取字符变得轻而易举 - choose
好工具就是生产力,这是专栏<现代命令行工具指南>精讲的第 3 个命令行工具,欢迎品鉴. 假如有一行文本是: choose sections from each line of files ...
- 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式
作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...
- 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口...
原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 [源码下载] 重新想象 Windows 8 Store Apps (27) - ...
- kmeans k值确定 matlab,kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)...
kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为 ...
- 让用户能快速选取有趣影片 Bing使用机器来选择摘要
网络上充满各式内容的影片,对使用者来说,最好可以快速知道影片有不有趣,而对于微软Bing影片搜寻功能来说,问题则是如何提供影片概览,帮助使用者决定是否要花时间点击并观看影片.微软提到,提供影片摘要是非 ...
- 快速选取单元格的10种方法。
你还在用鼠标拖选来选取单元格吗?小编在这里将教你十招超级方便的选取单元格的技巧,学会之后,你工作学习的效率一定会大大提升哦,感兴趣的话让我们看下去吧! 1.Ctrl键 按住[Ctrl]键然后用鼠标拖选 ...
- 【Excle数据透视表】如何快速选取所有标签并标注黄色底纹
如下图:需要把所有标签标注为黄色底纹该如何操作呢? 步骤 单击数据透视表任意单元格→数据透视表工具→分析→选择→整个数据透视表→选择→标签→开始→字体组合中"填充颜色" 第一次选择 ...
最新文章
- JavsScript--on与addEventListener的使用与两者的不同
- mysql子查询存到另一张表_MySQL数据库(11)----使用子查询实现多表查询
- pmcaff系列活动《走进今日头条》
- pccad自定义图框_(PCCAD自定义标题栏详细方法.doc
- Android Activity中状态保存机制
- UVa 1326 - Jurassic Remains
- Hadoop与分布式开发
- @media实现网页自适应中的几个关键分辨率
- 目标检测(三)--DPM
- clickhouse Aggregatingmergetree表引擎
- 学数值计算可以从事计算机算法吗,数值计算方法
- iOS 权限提示语_iOS11权限变化,权限都要弹框提示,而且需要说出功能用途
- 视频分割软件,将一个视频分割成多段小的视频
- LearnOpenGL-CN笔记(一)
- 为什么我不建议你去外包公司?
- 深度学习——致命问题之Gradient Vanish
- c语言程序设计 李俊,深入浅出C语言程序设计(第2版)习题集和编程指导
- 没有加入泛型之前存在的问题
- (Training 1) Educational Codeforces Round 101
- 把html转换为json数据,HTML转成JSON数据