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相关推荐

  1. Mastercam若要加工多个相同大小的孔该如何一次性做快速选取?

    Mastercam若要加工多个相同大小的孔该如何一次性做快速选取? 从[刀具路径]中点选[钻孔],出现如下图所示先点选[限定圆弧],点选你要的一个孔做圆弧限定,再全选所有图并按下结束选取,就可选取该相 ...

  2. 《现代命令行工具指南》3. 选取字符:让选取字符变得轻而易举 - choose

    ​好工具就是生产力,这是专栏<现代命令行工具指南>精讲的第 3 个命令行工具,欢迎品鉴. 假如有一行文本是: choose sections from each line of files ...

  3. 解题报告(一)B、(CF453D) Little Pony and Elements of Harmony(FWT经典套路 + 任意模数 k 进制FWT + 快速幂)(2)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  4. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  5. 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口...

    原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 [源码下载] 重新想象 Windows 8 Store Apps (27) - ...

  6. kmeans k值确定 matlab,kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)...

    kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为 ...

  7. 让用户能快速选取有趣影片 Bing使用机器来选择摘要

    网络上充满各式内容的影片,对使用者来说,最好可以快速知道影片有不有趣,而对于微软Bing影片搜寻功能来说,问题则是如何提供影片概览,帮助使用者决定是否要花时间点击并观看影片.微软提到,提供影片摘要是非 ...

  8. 快速选取单元格的10种方法。

    你还在用鼠标拖选来选取单元格吗?小编在这里将教你十招超级方便的选取单元格的技巧,学会之后,你工作学习的效率一定会大大提升哦,感兴趣的话让我们看下去吧! 1.Ctrl键 按住[Ctrl]键然后用鼠标拖选 ...

  9. 【Excle数据透视表】如何快速选取所有标签并标注黄色底纹

    如下图:需要把所有标签标注为黄色底纹该如何操作呢? 步骤 单击数据透视表任意单元格→数据透视表工具→分析→选择→整个数据透视表→选择→标签→开始→字体组合中"填充颜色" 第一次选择 ...

最新文章

  1. JavsScript--on与addEventListener的使用与两者的不同
  2. mysql子查询存到另一张表_MySQL数据库(11)----使用子查询实现多表查询
  3. pmcaff系列活动《走进今日头条》
  4. pccad自定义图框_(PCCAD自定义标题栏详细方法.doc
  5. Android Activity中状态保存机制
  6. UVa 1326 - Jurassic Remains
  7. Hadoop与分布式开发
  8. @media实现网页自适应中的几个关键分辨率
  9. 目标检测(三)--DPM
  10. clickhouse Aggregatingmergetree表引擎
  11. 学数值计算可以从事计算机算法吗,数值计算方法
  12. iOS 权限提示语_iOS11权限变化,权限都要弹框提示,而且需要说出功能用途
  13. 视频分割软件,将一个视频分割成多段小的视频
  14. LearnOpenGL-CN笔记(一)
  15. 为什么我不建议你去外包公司?
  16. 深度学习——致命问题之Gradient Vanish
  17. c语言程序设计 李俊,深入浅出C语言程序设计(第2版)习题集和编程指导
  18. 没有加入泛型之前存在的问题
  19. (Training 1) Educational Codeforces Round 101
  20. 把html转换为json数据,HTML转成JSON数据

热门文章

  1. 积水成渊之python——os.path.join()
  2. pdfjs 浏览器打印字体模糊问题
  3. 如何避免搜索引擎爬虫产生的流量过大以及搜索引擎设置优化
  4. Creo教程:如何使用SQLite在Creo中创建日记应用?
  5. python 文件备份
  6. 分割评价指标MIOU
  7. 数字功放芯片NTP8835和TAS5731M对比测评
  8. c++ 判断电脑是否装有vc_redist.x86 运行时库
  9. 去除 WPS 的广告
  10. Python基础提高