【发布时间】:2016-06-16 06:26:30
【问题描述】:
我知道以下针对重击手的算法:
Algorithm findHeavyHitters(epsilon, inputStream)
integer k = ceiling(1 / epsilon) - 1
initialize hashmap H of size k
while an item i from the input stream arrives:
if H[i] exists
increment the value associated with H[i]
elsif number of items in H < k
put H[i] into map with value of 1
elseif there exists an entry j with a value of 0
remove j and put H[i] into map with value of 1
else
decrement all values in H by 1
endwhile
return H
如果我错了,请纠正我,但这个算法不会在 O(n) 中运行。是否可以修改此算法,使其在 O(n) 中运行,同时保持 O(1/epsilon) 的空间使用?
对于数据流,算法的重点是返回顶部的 epsilon*t 项。 Epsilon 以百分比形式给出(例如,对于至少出现 10% 时间的数据,输入 0.1)。
【问题讨论】:
-
是什么让你认为它不能在 O(n) 中运行?
-
在 else 块中,我们需要遍历所有现有的重量级人物,以将每个重量级人物递减 1。
-
我认为这是您的反对意见,所以我在回答中涵盖了它。哈希表查找是最坏情况 O(n) 的可能反对意见不能轻易解决; afaik,你不能让最坏的情况小于 O(n log n)。
-
@fluffychaos 我打算使用 count-min 草图来实现重击手。您能否解释一下 else 块(将所有值减 1)处理哪些情况?另外,在答案中建议的解决方案中添加新的变量基础有何帮助?
标签: algorithm streaming-algorithm bigdata