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

来源:互联网 发布:如何清除手机淘宝缓存 编辑:程序博客网 时间:2024/05/24 03:23

这道题目的思路其实很简单,与在数组中找出现次数大于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算法基于桶的思想,我觉得也是受到数组中找频繁项的启发。

原创粉丝点击