当前课程知识点:数据结构(下) > 第十二章 排序 > (b3)选取:通用算法 > 12b3-2: quickSelect
我们接下来尝试的方法
将采用简而知之的策略
为此我们需要借用快速排序中的
(英文)算法
因此这一算法也称作quickselect
你应该记得快速排序中的
(英文)算法的功能
就是在当前的序列中
构造出一个轴点
我们也知道
这个轴点具体的位置是随机的
取决于我们的运气
或者更准确的说
取决于它相对于整个数据全集而言
所拥有的秩
在此我们不妨来设想一种
最好的情况
是什么呢
是的
有可能这个后选轴点
就是我们在K选取问题中的
查找目标
也就是说它的秩恰好就是K
果真如此的话
我们的计算量只不过是一趟(英文)
我们知道它所对应的运行时间
不过on
在一般的情况下
我们又当如何处理呢
不要紧 在一般的情况下
尽管这个后选轴点
未必就是我们要查找的目标
但是根据它我们却可以
对搜索的范围进行有效的裁减
具体的如这个图所示
假设我们的查找目标K
对应于这个位置
而在经过(英文)操作
使得我们的后选轴点
变成名副其实的轴点之后
如果它所对应的i不是我们的目标k
那么根据i与k的大小关系
无非两种情况
我们知道在经过(英文)操作之后
这个轴点之所以成为一个
名副其实的轴点
是因为在它左侧的元素
都不大于它
而在它右侧的元素
都不小于它
因此如果轴点的秩要比K更大
那么也就说明
我们的目标元素必然存在于
子序列L中
而与子序列G无关
这就意味着这种情况下
我们可以将G减除掉
对称的也同理
如果轴点的秩要小于k
那么由图也可看出
目标元素必然来自于子序列G中
而与子序列L无关
也就是说在这种情况下
我们也可大胆的减除掉子序列L
综合起来无论是哪种情况
我们都可以有效的使得问题的规模
得到缩减
这样一个缩减的过程
将持续进行下去
在整个问题的规模
退化到平凡情况之前
我们迟早会找到目标元素
比如这就是quickselect算法的
一种可能实现
如我们刚才所言
整个算法就是一个反复迭代
不断减而治之的过程
在每一步迭代中
我们都需要仿照快速排序中的
(英文)算法
构造出一个轴点
而且我们可以确定这个轴点的秩为i
以下无非刚才我们所说的两种情况
如果轴点的秩不小于k
那么就意味着子序列G
可以被减除掉
为此我们只需将有效区间的
右边界更新为i减1
对称的如果轴点的秩不大于k
则意味着子序列L可以被减除掉
为此我们只需将有效区间的左边界
更新为i加1
很遗憾尽管这里旨在构造轴点的内循环
每趟只需线性的时间
但是我们却不能有效的控制
外循环的执行次数
尽管可以证明在通常的随机意义下
外循环平均只需执行常数次
但是我们依然不难看出
在最坏的情况下
它依然需要执行多达N次
因此就最坏情况而言
这个算法依然不是最优的
不过好消息是
这个算法已经为我们通往
最优的算法打开了通路
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试