一、引言

今天学了一个快速选择算法,这个算法跟快排差不多,只不过专门用来在选择数组中第k大/小的数时,可以免去将整个数组排序后选择第k个数。将整个数组排序再选择第k个数的时间复杂度是O(nlog(n)),快速选择算法将平均时间复杂度优化到O(n),但最坏的情况还是O(n^2)。一开始很纠结这个O(n)是怎么来的,后来看了一下别人的分析,得到了答案。

二、分析

这里大概分析一下O(n)怎么来的,可能不是很严谨。

(1)快速选择算法,每次根据pivot(枢纽值)将数组分成左部分和右部分以后,根据k值的大小选择下一次进入左部分还是右部分,我们把数组分成左右部分的过程叫partition。

(2)假设用随机选择算法取得的枢纽值总是在数组的中间,那每次都会将数组分成等长(或长度相差1)的两半,再假设如果一直到最后子数组长度为1才找到第k大/小的值,那就一共要进行⌊logn⌋+1次partition。

(3)第一次partition要遍历的长度是n,第二次要遍历的长度是n/2,第三次要遍历的长度是n/4……倒数第二次遍历的长度是2,最后一次遍历的长度是1。这是一个首项为1,公比为2的等比数列,记ax=2^(x-1),其中x为项数。这个等比数列的前x项和为2^x-1(等比数列的求和公式为Sx=(a1-ax*q)/(1-q))。因为一共要求⌊logn⌋+1次partition,而S(⌊logn⌋+1)=2^(⌊logn⌋+1)-1≈2n-1(大概是这样,会有误差,但主要是看数量级。数学这方便确实比较菜嘻嘻),所以时间复杂度是O(2n-1)=O(n)。

三、总结

一开始觉得快速选择算法的平均时间复杂度应该跟快排一样是O(nlogn),因为觉得要进行⌊logn⌋+1次的partition,每次最差都要遍历长度为n的数组(被以前那些O(n^2)分析带偏了)。实际上每次partition平均来说只要遍历n/2的长度。时间复杂度分析不能想当然,还是要用数学的方式推导一下。

快速选择算法的时间复杂度为什么是O(n)?相关推荐

  1. 【算法】快速选择算法 ( 数组中找第 K 大元素 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  2. 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字

    去年写了一篇对快排进行改进的算法,可以在时间复杂度 O(n)O(n)O(n)的情况下,找到第kkk小的数字. 那时候,我还不知道这个算法叫BFPRT算法--现在知道了,还知道它又被称为中位数的中位数算 ...

  3. BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)

    我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...

  4. 快速选择算法(Quick Select Algorithm)

    文章目录 什么是快速选择算法? 代码演示 什么是快速选择算法? 快速排序的一种变形就是快速选择算法, 通常用来在未排序的数组中寻找第k小/第k大的元素. 快速选择的总体思路与快速排序相似,选择一个元素 ...

  5. 快速选择算法的C语言实现

    快速选择算法是一种基于快速排序算法而衍生出的一种选择算法,通常用于求出乱序数组中第K大或第K小元素,这种算法并不需要将数组完全排序,时间复杂度仅为O(n).下面先介绍快速排序算法. 一.快速排序算法 ...

  6. 快速选择算法Quick Select Algorithm(Java和C++代码实现)

    what is Quick select? 快速选择是一种从无序列表找到第k小元素的选择算法.它从原理上来说与快速排序有关.同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间 ...

  7. 快排亲兄弟:快速选择算法详解

    后台回复进群一起刷力扣???? 点击下方卡片可搜索文章???? 读完本文,可以去力扣解决如下题目: 215.数组中的第 K 个最大元素(Medium) 快速选择算法是一个非常经典的算法,和快速排序算法 ...

  8. Top K 问题的最优解 - 快速选择算法(图解详细教程)

    文章目录 Leetcode 215. Kth Largest Element in an Array 1.1:快速选择算法流程 1.2:注意事项 1.3:python实现 Leetcode 973. ...

  9. 快速选择算法-基于快排

    目录 快速选择算法 例题 算法思路 代码实现 快速选择算法 快速选择,就是在一个无需的数组中查找第k个小的数.我们可以很快的想到可以先将数组排序在进行选择,但时间复杂度为O(nlog⁡n)O(n\lo ...

最新文章

  1. Mybatis入门:2(xml形式的增删改查)
  2. 数组去重,ES6数组去重 new Set()
  3. LVS负载均衡的简单实现
  4. 老李分享:jvm垃圾回收
  5. how is SAP OData count implemented in the backend
  6. python爬虫基础扫盲之URL
  7. oracle 去重_超详细的四类数据库去重实现方案汇总,值得收藏
  8. 解决VScode安装Babel转码器报错:无法将“cnpm“项识别为cmdlet\函数、脚本文件或可运行程序的名称的问题
  9. eclipse中支持python
  10. M6A rna甲基化最新研究成果进展、论文合集(2021年)
  11. [Python版]2019税改税后工资计算法
  12. 有损脑健康的七种坏习惯
  13. 关于Matlab在雷达数据处理中的一些经验分享
  14. 在网上打印双面和单面的资料哪里打印价格便宜
  15. 机器人与视觉,基于TCP(工具坐标)偏移
  16. Echarts结合百度地图API
  17. IT30: IT项目之20年软技能
  18. PowerBI visuals共计246组2020年1月31日扒取(Power BI 视觉对象)
  19. TCPIP详解Protocol 读书笔记(三) IP协议讲解
  20. 惠普服务器硬件检测软件吗,惠普服务器没法开机,怎么检测硬盘状况

热门文章

  1. 技术的真相 | 提高照片清晰度的黑魔法竟然是..
  2. 如何跟进客户,才能越跟越近?
  3. [日推荐]『吸猫君』冬日取暖吸猫大法 好!
  4. 宝物志分享:金店库存被抢空,黄金抄底机会来了?
  5. 人工智能、机器学习、深度学习三者之间的联系
  6. ARIMA--基于python实现的代码
  7. Drools 将DSLR转化为DRL
  8. 突破QQ2009的nprotect键盘加密技术
  9. U盘安装CentOS7出现问题的解决方案
  10. unity工程统一管理Pico和oculus项目