有效地删除重复项并降低内存开销


9

我想以一种只需要存储结果集的方式有效地过滤重复项的整数列表。

一种可见的方式:

  • 我们有一个整数范围其中大(例如)N 2 40S={1,,N}N240
  • 我们有一个函数,据说它有很多碰撞(图像均匀地分布在)Sf:SSS
  • 然后,我们需要存储,即{ f x | X 小号}f[S]{f(x)|xS}

我对有一个非常准确的(概率性)估计。是,因此可以预先分配数据结构(例如)。| f [ S ] | 2 30|f[S]||f[S]|230

我有一些想法,但是我不确定什么是最好的方法:

  • 由于输入集不适合内存,因此无法使用位集。
  • 哈希表,但是(1)它需要一些内存开销,例如 150%(2)建表时必须探索该表,由于内存开销,这需要额外的时间。|f[S]|
  • “即时”排序,最好具有复杂度(非比较排序)。关于这一点,我不确定bucket sortflashsort之间的主要区别是什么。O(N)
  • 一个带有二进制搜索树的简单数组,但这需要时间。O(Nlog|f[S]|)
  • 也许使用布隆过滤器或类似的数据结构在缓解问题(假阳性)方面可能很有用。

计算器上的一些问题似乎有了这样的东西来解决(/programming/12240997/sorting-array-in-on-run-time/programming/3951547/java -array-finding-duplicates),但似乎没有一个符合我的要求。


2
您是否需要枚举f [S](无论它是什么),还是能够快速判断其中是否包含x?
吉尔(Gilles)“所以,别再邪恶了”

@吉尔斯:我相信,由于在f [S]中找不到明显的结构,因此这两个解决方案是等效的。
doc 2012年

您的电话号码不加。大小为的域上的随机函数的期望图像大约为。另一个问题是,除非您拥有一台超级计算机或大型集群,否则通过将花费很长时间。1 1 / e N 2 56N(11/e)N256
Yuval Filmus 2012年

1
二进制搜索树的时间为,实际上可能接近或可能不接近,但仍然更准确。O N log N O(Nlog|f[S]|)O(NlogN)
jmad 2012年

1
使用,线性时间算法也不会令人望而却步吗?(根据我的计算,即使您在1纳秒内考虑一个元素,也要花2年的时间!)。小号N256S
Aryabhata 2012年

Answers:


1

为什么不串连?

我们的想法是为存储正整数所能表述由以阵列位2个ķ表示的值的范围条目:条目[ ÿ ]ÿ 0,表示范围[ 2 ÿ 2 ÿ + 1 - 1 ]。对于任何1 X < 2 Ñ我们可以写成X = 2 ÿn=k+mA2kA[y]y0[2my,2m(y+1)1]1x<2n其中 y k位, z m位。尝试将 z(不是 x!)存储在位置 yx=2my+zykzmzxy

  • ,什么也不做:x是重复项。A[y]=zx

  • 未初始化时,将z存储在A [ y ]中A[y]zA[y]

  • 否则,将索引存储到一个单独的数组中,该数组用于将链表中的(在y处发生碰撞)链接起来。您将必须线性搜索A [ y ]开头的列表,并根据搜索的内容,可能将z插入列表中。zyA[y]z

最后,通过遍历A的初始化项并仅连接两个位串,就很容易恢复在位置y处找到的每个z(直接或在其中引用的链中)重新组合成原始的值x = 2 m y + zf(S)Azyx=2my+z

当分布接近均匀并且超过,将不会有太多的链式连接(可以用常规方法进行评估),并且链式连接往往会很短。当分布不均匀时,该算法仍然有效,但是可以达到二次定时。如果有可能,请使用比链条更有效的东西(并为存储付出一些开销)。2kN

所需的存储是至多对位2个2 ķ为链(假定比特ķ)。这正是以存储所需的空间2个ķ的值Ñ每个比特。如果您对均匀性有信心,则可以为链分配不足的存储空间。如果可能出现不均匀性,则可能要增加k并充分主张链存储。2nA22kmk2knk

考虑该解决方案的另一种方法是,它具有特别好的哈希函数的哈希表(采用最高有效位),因此,我们只需要将最低有效m = n k位存储在桌子。km=nk

有多种方法可以用的存储空间来覆盖链的存储空间,但这似乎并不值得,因为它不会节省太多空间(假设mk小得多),并且会使代码难以开发,调试和维护。Amk


1
我认为倒数第二段是此处的中心部分,应该放在顶部(根据想法)。我不知道“ bin and chain”一词(尽管在阅读这篇文章后是有道理的)。这个想法可以扩展到尝试
拉斐尔

因此,这是分布较差的输入的。我不知道这有多有效。Θ(n2)
einpoklum

@einpoklum此答案明确描述了解决方案有效的条件。
whuber
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.