'k'最频繁出现的数字的算法


19

我一直在寻找最有效的(streaming ??)算法,该算法可以告诉我在任何时间点数据流中最常出现的“ k”个元素。这篇文章:“分而治之”的数据流算法使我对此感兴趣。

例如,假设有数字:(4,3,5,1,6,2,4,3,3,8,9,1)并且我查询了3个最频繁出现的数字(例如),那么我应该得到(3,4,1)作为答案。

我尝试在线搜索,但找不到任何可以提供方法的地方,并说那是最好的。一个简单的解决方案是使用堆或平衡的二叉树,但是我认为有更好的方法,我想知道它是否在某处记录了。

编辑:我正在寻找一种始终能给出正确答案的算法,而不是依赖某种或其他方式依赖数据分布的混合算法(其中很多出现在搜索结果中)


实际上,存在三种算法:精确算法,近似算法和“数据相关”算法。您排除了最后一种,但是是否允许不依赖于数据分布的近似算法?如我所指出的,如果不是这样,那么您会遇到麻烦,因为流设置中此问题的已知下限。
Suresh Venkat

1
我对使用有限内存的算法(流算法)是否可以真正实现我想要的功能感到好奇,似乎您无法指出这些方法。另外,是否已知一种非流式精确算法可以解决O(n)保证的最坏情况下的时间问题,这在这里提到(citedererx.ist.psu,引用于Cormode和Hadjileftheriou的论文)。 edu / viewdoc / summary?doi = 10.1.1.106.7889
dhruvbird 2010年

Answers:


20

关于这个问题有大量文献。首先,即使对于,问题也很棘手:正如Alon,Matias和Szegedy所表明的那样,即使在空间中,您也无法获得比常数因子更好的近似于空间中最流行元素的频率的方法。愿意被随机化。o n k=1o(n)

但是,如果您保证一个元素严格地超过50%的时间出现,那么有一个简单的技巧可以使用恒定的空间并找到它(这是一个受欢迎的Google难题)。更一般而言,使用此技巧的概括,您可以找到出现次以上的元素。n/k

VLDB 2008的Cormode和Hadjileftheriou撰写了一篇有关该问题的权威文章。它涵盖了上述方法和许多最新方法。通常的想法是,您可以生成前项目的近似列表(此处近似表示您可能会得到计数接近前项目的计数的项目)。ķkk


1
+1。我认为> 50%的时间算法是您所提到的一种众所周知的算法(多数元素算法)
dhruvbird

2
谢谢!!您提到的Cormode和Hadjileftheriou撰写的论文引用了该论文:citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.106.7889,它具有我正在考虑的相同技术。它维护2个链表;一个按频率显示,另一个包含具有相同频率的所有元素的列表。
dhruvbird

您能否详细说明50%以上的算法?和谷歌拼图?我不能遵循这种草率的推理,因为您刚刚谈到它,而没有完全花在“众所周知的技巧”上。谢谢。


这是对Suresh Venkat的链接userweb.cs.utexas.edu/users/misra/scannedPdf.dir/…的评论(信誉欠佳):似乎此处显示的算法需要第二次通过数据,这是不允许的这里。实际上,我看不到具有O(1)空间要求的单遍算法如何存在。
TonyK 2010年

2

我还建议阅读以下书籍的第8.1.3节“数据流中的频繁模式挖掘”:

韩佳玮,米雪莲·坎伯(Micheline Kamber)。数据挖掘---概念和技术,第二版,Morgan Kaufmann出版社,2006年。

它引入了一种称为有损计数的算法,该算法以任意精度近似频繁项(支持度高于min_support的项)。

并不是您想要的,但是我认为这可能会有所帮助。


也许你可以帮助我在我的问题在这里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.