当前课程知识点:数据结构(下) > 第十二章 排序 > (b1)选取:众数 > 12b1-4: 减而治之
在这里我们需要再次的应用
减而治之的策略
也就是说从问题的规模上
不断的缩小众数的求解范围
这里我们不妨约定
所有的元素都是按照随机
无序的次序
存放于某个向量A中
我们希望能够依照某种准则
安全的从A中减除掉某个前缀P
从而将原先在A中选取众数的问题
转化为在A减P中寻找众数的问题
其实这里的准则非常简明
也就是在P中存在某一类元素x
而且x出现的次数
恰好就是P的长度的一半
也就是说如果A中的确存在众数
那么相对于每一个这样的前缀P
A减P也必然存在众数
而且进一步的A减P的众数
必然也是原先A的众数
也就是说在这种情况下
A减P的众数
构成了A的众数的必要条件
实际上既然我们最终
总是要花费on的时间
通过一次线性扫描
来确定候选者是否的确为众数
所以我们只需考虑
A的确含有众数的情况
于是如果将A中的众数记作M
那么无非两种情况
也就是随着P被减除的元素X
等于或者不等于M
先来考察X与M相等的情况
在这种情况下既然X
当然也就是现在的M
在P中
恰好占据半壁江山
所以在将这些M以及同等数量的
其它元素减除之后
在A减P中M与其它元素
在数量上的差距
将与此前在A中一样保持不变
第二种情况
也就是X并非中位数的情况
其实更为简单
同样的因为X在P中已经占据半壁江山
所以即便其它的元素
都是中位数M
在A减P中
M与其它元素的数量差
相对于此前在A中
与其它元素的数量差也不至于缩小
也就是说在这种情况下
M依然是A减P的众数
基于这样一个必要条件
我们就自然可以导出一个相应的算法
具体来说这个算法
将反复迭代的进行
每一次都能够从A中减除掉一个
非空的前缀P
从而使得问题的规模
能够得到有效的缩减
这个过程将持续下去
直到最终的平凡情况
而在每一步迭代中
为了确定这样的一个前缀P
我们只需将它的首元素作为X
然后随着接下来的不断扫描
不断统计X的数量
直到某个时刻X在P中
恰好占据一半的比例
那么这样一个总体的思路
又该如何具体的兑现为代码呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试