搜索大数据集

时间:2010-05-17 21:23:01

标签: python arrays search string duplicates

我如何通过列表搜索~5密耳128位(或256,取决于你如何看待它)字符串快速找到重复项(在python中)?我可以把字符串变成数字,但我认为这不会有多大帮助。由于我没有学到太多的信息理论,信息理论中有什么关于这一点的吗?

既然这些都是哈希值,那么再次对它们进行哈希就没有意义了

5 个答案:

答案 0 :(得分:3)

如果它符合memeory,请使用set()。我认为它会比排序更快。对于500万件物品的O(n log n)将花费你。

如果它不适合记忆,说你有超过500万的记录,分而治之。打破中间点的记录,如1 x 2 ^ 127。应用上述任何方法。我想信息理论有助于说明好的哈希函数会均匀地分配密钥。所以中间点划分方法应该很有效。

即使适合记忆,你也可以分而治之。对2 x 2.5 mil记录进行排序比分类5 mil记录更快。

答案 1 :(得分:2)

将它们加载到内存中(5M x 64B = 320MB),对它们进行排序,然后扫描它们以找到重复项。

答案 2 :(得分:2)

在Python2.7 +中,您可以使用collections.Counter来使用较旧的Python collections.deaultdict(int)。无论哪种方式都是O(n)。

首先制作一个包含一些哈希值的列表

>>> import hashlib
>>> s=[hashlib.sha1(str(x)).digest() for x in (1,2,3,4,5,1,2)]
>>> s
['5j\x19+y\x13\xb0LTWM\x18\xc2\x8dF\xe69T(\xab', '\xdaK\x927\xba\xcc\xcd\xf1\x9c\x07`\xca\xb7\xae\xc4\xa85\x90\x10\xb0', 'w\xdeh\xda\xec\xd8#\xba\xbb\xb5\x8e\xdb\x1c\x8e\x14\xd7\x10n\x83\xbb', '\x1bdS\x89$s\xa4g\xd0sr\xd4^\xb0Z\xbc 1dz', '\xac4x\xd6\x9a<\x81\xfab\xe6\x0f\\6\x96\x16ZN^j\xc4', '5j\x19+y\x13\xb0LTWM\x18\xc2\x8dF\xe69T(\xab', '\xdaK\x927\xba\xcc\xcd\xf1\x9c\x07`\xca\xb7\xae\xc4\xa85\x90\x10\xb0']

如果您使用的是Python2.7或更高版本

>>> from collections import Counter
>>> c=Counter(s)
>>> duplicates = [k for k in c if c[k]>1]
>>> print duplicates
['\xdaK\x927\xba\xcc\xcd\xf1\x9c\x07`\xca\xb7\xae\xc4\xa85\x90\x10\xb0', '5j\x19+y\x13\xb0LTWM\x18\xc2\x8dF\xe69T(\xab']

如果您使用的是Python2.6或更早版本

>>> from collections import defaultdict
>>> d=defaultdict(int)
>>> for i in s:
...  d[i]+=1
... 
>>> duplicates = [k for k in d if d[k]>1]
>>> print duplicates
['\xdaK\x927\xba\xcc\xcd\xf1\x9c\x07`\xca\xb7\xae\xc4\xa85\x90\x10\xb0', '5j\x19+y\x13\xb0LTWM\x18\xc2\x8dF\xe69T(\xab']

答案 3 :(得分:1)

此数组是否已排序?

我认为最快的解决方案可以是堆排序或快速排序,并在完成数组后找到重复项。

答案 4 :(得分:0)

您说您有大约500万个字符串的列表,该列表可能包含重复项。你没有说(1)你想要对重复项做什么(记录它们,删除除了一次出现的所有事件,......)(2)你想用非重复项做什么(3)这个列表是否是一个独立的结构或者字符串是否是您未提及的其他数据的关键字(4)为什么您没有在输入时删除重复项而是构建包含重复项的列表。

作为数据结构和算法101的练习,您接受的答案是无稽之谈。如果您有足够的内存,使用集合检测重复项应该比排序列表并扫描它更快。注意,从大小为N的列表中删除M项是O(MN)。每种替代方案的代码都很短而且相当明显;你为什么不试着写它们,计算它们并报告回来?

如果这是您遇到的真实问题,如果您需要明智的答案,则需要提供更多信息。