java 众数 中位数_中位数和众数

列举一些中位数和众数的常见问题和解法

1. 众数

一个长度为$N$的列表,出现次数大于$\left \lfloor N/2 \right \rfloor$的数为这个列表的众数。

1.1 摩尔投票算法

摩尔投票算法(Boyer-Moore majority vote algorithm)的思路类似一个大乱斗,遇到不相同的数就抵消掉。维护两个变量:major和count,major是众数的可能值,count是这个数的得分,初值都是0,顺序遍历整个列表,通过下面的条件修改major和count。

05bfcbbe71d42940c061cfbf09e7107b.gif

如果众数存在,程序结束的时候major就是众数。从算法里面可以看出,不想等的数之间是存在竞争关系的,相等的数则没有。我们将一个列表(例如$[1,2,1,2,1,3,1]$)分成两个组,众数一组($[1,1,1,1]$),其他的数是一组($[2,2,3]$),那众数这一组由于数值一样,只和另一组数存在竞争关系,而另一组数不仅和众数这一组有竞争关系,组内也会由于数值不等存在竞争关系,最终一定不会在乱斗中存活下来,所以如果众数存在,最终的major只可能是众数。但是要注意,这是在众数存在的情况下,如果众数不一定存在,则还需要对算法筛选出来的结果进行计数验证。算法模版如下,时间复杂度$O(n)$,空间复杂度$O(1)$。

1 def Moore(nums: List) ->int:2 major, count =0, 03 for num innums:4 if count ==0:5 major, count = num, 1

6 elif major !=num:7 count -= 1

8 else:9 count += 1

10 #如果没有说众数一定存在,此处就要加上验证

11 return major

摩尔选举方法也可以进行拓展,用来求序列中出现次数大于$\left \lfloor N/K \right \rfloor$的数。以$K=3$举例,当出现3个互不相等的数时就抵消,最后剩下的数(不会超过$K-1$个)再进行验证就可以得到最终的结果。具体的代码见$1.4$。

1.2 随机选举

随机选举的方式比较有意思,可以用来求数据流中任意区间的众数。在知道众数一定存在的情况下,单次查询时间复杂度为$O(logn)$,此外记录下标需要$O(n)$的辅助空间。简单说一下流程:首先通过字典记录每个数的下标,例如$[1,2,1,3,1]$,记录下标的字典为$\{1:[0,2,4], 2:[1], 3:[3]\}$。给定区间$[l, r]$&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值