算法复习——分而治之篇之次序选择问题

以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!

1. 问题背景

最小值查找

  • 例如给定数组 A [ 1..16 ] A[1..16] A[1..16],寻找其中最小值,如下图所示。

  • 依次扫描,记录最小值

    那么,对问题稍加改变,如何求得数组中第 k k k小的元素

2. 问题定义

次序选择问题(Selection Problem)

输入:

  • 包含 n n n个不同元素的数组 A [ 1.. n ] A[1..n] A[1..n]
  • 整数 k ( 1 ≤ k ≤ n ) k(1\leq k \leq n) k(1≤k≤n)

输出:

  • 数组 A [ 1.. n ] A[1..n] A[1..n]中第 k k k小的元素 ( 1 ≤ k ≤ n ) (1 \leq k \leq n) (1≤k≤n)

3. 排序求解

​ 对数组排序,求得所有元素的次序,就很容易得到第 k k k小的元素,时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)。

​ 但这似乎不是最好的算法,因为我们只想要第 k k k小的元素;但是排序把所有第 k k k小的都得到了,这似乎是没有必要的,浪费了时间复杂度。

4. 问题分析

​ 受启发于快速排序的数组划分。其中,我们的任务是用分界线分割数组,分界线左边的元素都比它小,右边的元素都比它大;但是,左边无需排序,右边也无需排序。

​ 如果我们想求得的第 k k k个元素恰恰就落在分界线上,则直接获得结果;如果不能,就需要略作修改。

5. 固定位置划分求解

5.1 原理

  • 选取固定位置主元,小于主元的元素个数 q − p q-p q−p

  • 情况1: k = q − p + 1 k=q-p+1 k=q−p+1, A [ q ] A[q] A[q]为数组第 k k k小元素
  • 情况2: k < q − p + 1 k < q-p + 1 k<q−p+1,在 A [ p . . q − 1 ] A[p..q-1] A[p..q−1]中寻找第 k k k小元素
  • 情况3: k > q − p + 1 k > q - p + 1 k>q−p+1,在 A [ q + 1.. r ] A[q+1..r] A[q+1..r]中寻找第 k − ( q − p + 1 ) k-(q-p+1) k−(q−p+1)小元素

​ 相比于其他分而治之的问题,在次序选择问题中,子问题始终唯一且无需合并问题解

5.2 伪代码

固定位置划分:Partition(A, p, r)

输入:数组A,起始位置p,终止位置r

输出:划分位置q

x ← A[r]
i ← p - 1
for j ← p to r-1 dpif A[j] <= x thenexchange A[i+1] with A[j]i ← i + 1end
end
exchange A[i+1] with A[r]
q ← i + 1
return q

固定位置次序选择:Selection(A, p, r, k)

输入:数组A,起始位置p,终止位置r,元素次序k

输出:第k小元素x

q ← Partition(A, p, r)
if k = (q - p + 1) thenx ← A[q]
end
if k < (q - p + 1) thenx ← Selection(A, p, q-1, k)
end
if k > (q - p + 1) thenx ← Selection(A, q+1, r, k-(q-p+1))
end
return x

5.3 时间复杂度分析

最好情况: T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)

最坏情况: T ( n ) = ∑ i = 1 n i ≤ n 2 = O ( n 2 ) T(n)=\sum_{i=1}^{n}i \leq n^2 = O(n^2) T(n)=∑i=1n​i≤n2=O(n2),如下图所示。

6. 随机位置划分求解

6.1 伪代码

随机位置划分:Randomized-Partition(A, p, r)

输入:数组A,起始位置p,终止位置r

输出:划分位置q

s ← Random(p, r)
exchange A[s] with A[r]
q ← Partition(A, p, r)
return q

随机位置次序选择:Randomized-Selection(A, p, r, k)

输入:数组A,起始位置p,终止位置r,元素次序k

输出:第k小元素x

q ← Randomized-Partition(A, p, r)
if k = (q - p + 1) thenx ← A[q]
end
if k < (q - p + 1) thenx ← Randomized-Selection(A, p, q-1, k)
end
if k > (q - p + 1) thenx ← Randomized-Selection(A, q+1, r, k-(q-p+1))
end
return x

6.2 期望时间复杂度分析

​ 使用代入法,可证明随机位置次序选择的期望时间复杂度是 O ( n ) O(n) O(n)。

算法复习——分而治之篇之次序选择问题相关推荐

  1. 算法复习——动态规划篇之最长公共子序列问题

    算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...

  2. 算法复习——动态规划篇之钢条切割问题

    算法复习--动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: ​ 现有一段长度为10的钢条,可以零 ...

  3. 【经典算法学习-排序篇】直接选择排序

    一.选择排序 1.基本概念和介绍 选择排序的核心思想是:每一趟从无序区中选出关键字最小(或最大)的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止. 换句话说就是: ...

  4. 排序算法理解总结篇——冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、计数排序、基数排序、桶排序

  5. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

  6. Java入门算法(贪心篇)丨蓄力计划

    本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...

  7. RSA算法原理简介,非对称加密,公开密钥算法(易懂篇)

    RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...

  8. 【数据结构与算法】第二篇:算法部分

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.程序的时间和空间复杂度分析 (1)理解算法时间复杂度的表示法 ( ...

  9. 次序选择问题 java代码完整实现 分治法

    什么是次序选择: 就是需要找出给定序列中第k小元素(其中k大于等于1小于等于n). 比如当k=3时,我们需要找出该序列中第三小元素. 分治法解决次序选择问题: 我们可以借用随机主元的快速排序的思维去解 ...

最新文章

  1. UVa512 - Spreadsheet Tracking
  2. Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
  3. 假如有人在今天炸了支付宝的存储服务器...
  4. vim显示行号、多行复制和删除
  5. 连载 | 知识图谱发展报告 2018 -- 前言
  6. android 释放bitmap fragment,,为什么重复Replace Fragment会内存泄漏
  7. 表数据都删了一半,可我的表文件咋还是那么大
  8. 一印度学生Asp.net源码分享讨论
  9. Java J2EE中的依赖查找
  10. jsp开发教程之 仿MOP论坛 二(数据库,界面设计篇)
  11. Vue中异步组件(结合webpack,转载)
  12. 第15章-使用远程服务
  13. python 移动平均线_如何使用NumPy计算移动平均线?
  14. linux c获取进程状态,Linux C 获取进程的退出值
  15. 判断当前打开的是手机还是pc浏览器还是微信浏览器
  16. MEncoder的基础用法—6.5. 编码为MPEG格式
  17. Contrast Preserving Decolorization
  18. Invalid bound statement (not found): com.xx.dao.TypeMapper.selectAll
  19. OpenGL字体绘制
  20. MNS支持JMS协议的方案

热门文章

  1. Oracle函数----数字函数
  2. 大疆无人机二次开发进阶-DJI mobile SDK和DJI onboard SDK联合开发行业应用项目
  3. Python程序设计之列表
  4. 04 pandas 分组
  5. 终端安全管理防护的措施之一
  6. Tak and Cards dp
  7. 项目管理(PMP学习些什么)
  8. 热敏电阻PT100,NTC转0-10V/4-20mA转换器
  9. QuizCardGame
  10. bugku你从哪里来