算法复习——分而治之篇之次序选择问题
算法复习——分而治之篇之次序选择问题
以下内容主要参考中国大学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=1ni≤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)。
算法复习——分而治之篇之次序选择问题相关推荐
- 算法复习——动态规划篇之最长公共子序列问题
算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...
- 算法复习——动态规划篇之钢条切割问题
算法复习--动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: 现有一段长度为10的钢条,可以零 ...
- 【经典算法学习-排序篇】直接选择排序
一.选择排序 1.基本概念和介绍 选择排序的核心思想是:每一趟从无序区中选出关键字最小(或最大)的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止. 换句话说就是: ...
- 排序算法理解总结篇——冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、计数排序、基数排序、桶排序
- 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法
公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...
- Java入门算法(贪心篇)丨蓄力计划
本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...
- RSA算法原理简介,非对称加密,公开密钥算法(易懂篇)
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...
- 【数据结构与算法】第二篇:算法部分
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.程序的时间和空间复杂度分析 (1)理解算法时间复杂度的表示法 ( ...
- 次序选择问题 java代码完整实现 分治法
什么是次序选择: 就是需要找出给定序列中第k小元素(其中k大于等于1小于等于n). 比如当k=3时,我们需要找出该序列中第三小元素. 分治法解决次序选择问题: 我们可以借用随机主元的快速排序的思维去解 ...
最新文章
- UVa512 - Spreadsheet Tracking
- Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
- 假如有人在今天炸了支付宝的存储服务器...
- vim显示行号、多行复制和删除
- 连载 | 知识图谱发展报告 2018 -- 前言
- android 释放bitmap fragment,,为什么重复Replace Fragment会内存泄漏
- 表数据都删了一半,可我的表文件咋还是那么大
- 一印度学生Asp.net源码分享讨论
- Java J2EE中的依赖查找
- jsp开发教程之 仿MOP论坛 二(数据库,界面设计篇)
- Vue中异步组件(结合webpack,转载)
- 第15章-使用远程服务
- python 移动平均线_如何使用NumPy计算移动平均线?
- linux c获取进程状态,Linux C 获取进程的退出值
- 判断当前打开的是手机还是pc浏览器还是微信浏览器
- MEncoder的基础用法—6.5. 编码为MPEG格式
- Contrast Preserving Decolorization
- Invalid bound statement (not found): com.xx.dao.TypeMapper.selectAll
- OpenGL字体绘制
- MNS支持JMS协议的方案