(b1)选取:众数

官官方信息技术老师·13 页·深入(追求细节与边界)·0 次浏览·38 天前
统计学集中趋势数据选取

众数的选取

看完你能亲手求出众数,并说清多重众数与无众数的判定

按 空格/→ 演示下一步

问一句
1 / 13 页

全部页面点击任意一页,跳回舞台从这页播放

统计学集中趋势数据选取

众数的选取

看完你能亲手求出众数,并说清多重众数与无众数的判定

1第 1 页 · 众数的选取

什么是「选取」问题

上一页我们认识了众数:数据中出现最多的那个值。但要在序列里「找到」某个特定排名的元素,比如第 3 小的数、中位数,这就叫选取问题。

按秩查询
给定秩 k,找出序列中第 k 小的元素
中位数是特例
k 取中间位置:奇数取正中,偶数常取平均
与排序的关系
排序后取第 k 位即可,但选取可不必完整排序
众数的另一面
众数看频次排名,选取看大小排名,秩的口径不同
运动会按名次找人对应 →按秩选取

「第 3 名是谁」对应「第 k 小的元素是谁」,不需要知道全部排序

2第 2 页 · 什么是「选取」问题

中位数:秩居中的元素

上一页的众数是「数出来的」,这页换个思路:把全班身高从矮到高排队,站在正中间的那个人,就是中位数。找他,其实就是一个选取问题。

先排序,再定位
中位数不是算出来的,是从有序序列里按位置选出来的
秩
元素在排序后的名次;中位数就是秩居中的元素
偶数长度约定
n 为偶数时通常取中间两个之一(如下取整位置),需事先约定
选取的通用形式
给定秩 k,选出排位第 k 的元素;中位数只是 k 取中间值的特例
运动会决赛名次对应 →秩与中位数

先按成绩排序排出名次,第三名对应秩为 3 的选手

中位数=x(⌊(n+1)/2⌋),一般化:选第 k 小元素\text{中位数} = x_{(\lfloor (n+1)/2 \rfloor)},\quad \text{一般化:选第 } k \text{ 小元素}
3第 3 页 · 中位数:秩居中的元素

众数的定义

上一页中位数靠「排第几」定位。众数换了个思路:不看位置,只数谁出现的次数最多——而且要压倒性地多,多到超过一半才算数。

严格过半
出现次数 > 总数的一半,即 2×次数 > n
至多一个
两个元素都过半会互相矛盾,所以答案最多一个
可能不存在
若没人过半,这组数据就没有众数
班级举手表决对应 →严格过半

举手人数超过全班一半,意见才能压倒所有其他选项

众数 m  ⟺  2⋅count⁡(m)>n\text{众数 } m \iff 2\cdot\operatorname{count}(m) > n
4第 4 页 · 众数的定义

中位数必是众数(若有众数)

沿箭头从上往下读:先数众数的数量优势,再看它如何覆盖中位数的位置。

图解渲染中…
e1:对比分支:若众数未过半,结论不成立f1:仅多个平分秋色的高频值时,中位数可不同于众数
5第 5 页 · 中位数必是众数(若有众数)

中位数未必是众数

中位数必是众数,前提是众数存在;一旦无众数,这条保证就失效了。

众数存在时
  • 众数:出现次数严格最多
  • 中位数秩居中,必落在众数上
  • 取中位数即安全取到众数
无众数时
  • 所有元素出现次数并列
  • 中位数只是普通元素
  • 取中位数前需验证众数存在
正确的理解是:中位数必是众数仅在众数存在时成立;无众数时须先验证,再另行选取。
6第 6 页 · 中位数未必是众数

频繁数:候选的推广

上一页我们看到:中位数和众数可能不是同一个人。那换个视角——不从位置,而从「出现得多频繁」来刻画候选元素,会发现它与序列的等长后缀存在漂亮的对应关系。

频繁数视角
不看秩的大小,只统计元素出现的次数
候选的性质
x 是整段众数,则 x 也能成为某段等长后缀的众数
对应关系
前缀里 x 领先多少,后缀就留下多少可抵消
拔河接力对应 →前后缀抵消

前半段攒下的领先优势,对应后半段被消耗的等长距离

x 为众数  ⟺  存在 i, x 既是 s[1..i] 也是 s[i+1..n] 的候选x \text{ 为众数} \iff \text{存在 } i,\ x \text{ 既是 } s[1..i] \text{ 也是 } s[i+1..n] \text{ 的候选}
7第 7 页 · 频繁数:候选的推广

减而治之的判定策略

从上往下看:序列按中位点切成前后两半,逐半扫描频繁数,任一命中即可确认众数。

图解渲染中…
c1:前缀:中点左侧那一半元素c2:后缀:中点右侧那一半元素d1:命中即候选,仍需计数验证e1:两半都未命中时需回退检查
8第 8 页 · 减而治之的判定策略

候选数与计数的维护

一次扫描维护候选与计数:支持则加一,反对则减一,归零就换人。

1
初始化
候选设为空,计数置零,代表尚无任何元素占优。
2
遇支持者
当前元素等于候选,计数加一,候选地位更稳。
3
遇反对者
元素不等于候选且计数大于零,计数减一,抵消一票。
4
计数归零
支持和反对打平,候选失势,需换人。
5
更换候选
把当前元素立为新候选,计数置一,重新开始积累。
9第 9 页 · 候选数与计数的维护

众数选取算法实现

python

Boyer-Moore 投票法:一遍扫描维护候选数与计数,最后一步验证候选是否真是众数。

代码高亮加载中…

扫描中相异元素两两抵消,计数归零说明前缀内候选已无优势,可安全换人;若真众数存在,它必在抵消中存活至最后,但仍需第二遍验证。

10第 10 页 · 众数选取算法实现

自测:众数判定

点击作答

对数组执行减而治之:若两元素相等则各留一个,否则同时删去两个。删空后剩下一个候选数 c,接下来该做什么?

11第 11 页 · 自测:众数判定

要点收束

  • ✓选取问题沿秩与频次两条主线展开
  • ✓中位数和众数都由计数与比较刻画
  • ✓中位数必是众数,反之不然
  • ✓频繁数是众数的推广,候选数维护计数
  • ✓减而治之:淘汰不占优候选再递归
延伸主题:主元素问题与 Moore 投票法多路候选的频繁数扩展线性时间中位数选取实现
12第 12 页 · 要点收束

课后思考

先合上笔记自己想一会儿,再对照参考答案——答案只是路径,不是终点。

1为什么「中位数必是众数」需要众数存在这个前提?无众数时中位数落在哪?

参考答案回顾核心:众数定义为出现严格超过 n/2 次的元素。无众数时没有元素占绝对多数,中位数只是秩居中者,与「最频繁元素」无必然关联。

2频繁数只要求「出现最多」,若把它的次数作为线索,能否更快验证众数存在?

参考答案应用层:频繁数给出次数上界参考,若最频繁次数 ≤ n/2,可立即排除众数存在,省去完整验证;这提示把判定与统计结合。

3减而治之的思想能推广到「求出现超过 n/3 次的所有元素」吗?候选数要保留几个?

参考答案迁移方向:超过 n/3 的元素至多两个,仿照成对抵消保留两个候选即可——这正是 Boyer-Moore 推广的思路,抵消规则需重新设计。

13第 13 页 · 课后思考