count-min草图数据结构的非平凡用法

时间:2014-06-03 14:40:25

标签: algorithm stream-processing

我有一个增加值的大数组 - 像这样:

array = [0, 1, 6, 6, 12, 13, 22, ..., 92939, 92940]

我想在它上面使用插值搜索算法。数组的大小是可变的,新元素被添加到数组的末尾。

我需要找到某个元素的索引,让我们称之为X。

Y = find(X in array)

Y必须是数组中元素的索引,以便数组[Y]> = X. find可以使用二进制搜索实现,但出于某些复杂的原因,我想使用插值搜索来实现它。插值搜索试图通过查看数组的边界来猜测X的正确位置。如果第一个数组值为0且last为100并且我想要找到值25的位置,如果数组长度为1000,我需要首先查看索引250处的值。如果数组的值均匀分布,则这可以作为魅力。但如果它们不均匀分布,插值搜索的工作速度可能比二进制搜索慢(可以进行一些优化)。

我正在尝试使用Count-Min Sketch数据结构在这种情况下加快搜索速度。当我将新元素附加到数组时,我只是将一些数据添加到count-min草图数据结构中。

Z = 1005000 
elements_before_Z = len(array)
array.append(Z)
count_min_sketch.add(Z, elements_before_Z)  
# Z is the key and elenents_before_Z - is count

使用这种方法我可以近似猜测搜索到的元素X的位置。如果猜测正确,这可以导致搜索加速,但我遇到了一些问题。

  1. 我不知道X是否在数组中,而我的count_min_sketch已经看到了这个值。如果是这种情况,我可以从count_min_sketch数据结构中获得正确的值。如果不是 - 我将获得0或其他值(最坏情况)。

  2. 碰撞。如果我的count_min_sketch对象看到了值X,那么我会返回正确的值或更大的值。如果计数min sketch用于计算文档中的单词出现之类的东西 - 这不是问题,因为碰撞很少见,并且错误小于或等于碰撞次数(通常使用如下:count_min_sketch.add(Z,1))。在我的情况下,每次碰撞都会导致很大的错误,因为我通常会为每个键添加大数字。

  3. 是否可以这样使用count-min草图(每次添加大量条目)?

0 个答案:

没有答案