《编程之美》中的一个问题,在数组中找到出现频率大于1/4的数

这道题目的思路其实很简单,与在数组中找出现次数大于1/2的元素经典算法非常类似,O(n)的时间复杂度。

定义出现频率大于1/4的数为频繁项,这样的频繁项最多有3个。

算法的核心思想很简单,每次删去不同的4个数,最后剩下的元素有可能是频繁项。

假设数组有15个元素,若一个元素的出现频率大于1/4,其必须出现4次。不妨设数组为{1,2,1,4,1,4,2,9,1,7,4,3,9,4,3},d表示删去该数。我们来模拟一下算法的过程。

第一次 1d,2d,1,4d,1,4,2,9d,1,7,4,3,9,4,3 剩下 1,1,4,2,1,7,4,3,9,4,3

第二次 1d,1,4d,2d,1,7d,4,3,9,4,3 剩下 1,1,4,3,9,4,3

第三次 1d,1,4d,3d,9d,4,3 剩下 1,4,3

那么 1,4,3 即为候选频繁项

对 1,4,3 逐个进行检验,统计其再数组中出现的次数,若其超过出现频率阈值,则输出。

代码如下:

 

流数据频繁项挖掘中,有一个经典的算法是Lossy Counting算法。LC算法基于桶的思想,我觉得也是受到数组中找频繁项的启发。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值