这是我们要解决的问题。 我们正在处理大量项目的大量流数据。我们还有一个预定义的项目列表。我们需要检查流中的每个项目是否属于我预定义的列表,这个列表非常庞大(大约400万个项目)。查找/检查操作应尽可能高效
如果这里的人能够帮助我指出我能读到的论文/算法以便以正确的方式解决这个问题,那将是很棒的。
谢谢,
答案 0 :(得分:0)
在提出解决方案之前,您可能希望缩小一些假设
一般来说,您需要维护对象的哈希表(或表示这些对象的唯一键),并在通过您的流进入时查找每个对象。散列表提供快速查找,如果您的数据集是静态的,则它们非常适合您描述的用例。然而,在某些情况下,其他解决方案可能表现更好,上述问题应该揭示是否是这种情况。
如需进一步阅读,我将引导您阅读维基百科上的Data Structures和Big-O符号文章
编辑:我将这个快速程序整合在一起,以测量python中的哈希查找性能:
#!/usr/bin/python
import random
import string
import time
# return a random username, all lowercase, between n and m characters long
def generate_username(min_length = 5, max_length = 10):
n = random.randint(min_length, max_length)
return ''.join(random.sample(string.ascii_lowercase, n))
# Build a hash table of 4mil usernames (the 'predefined items')
users = set()
for i in xrange(4000000):
users.add(generate_username())
# Build a 'stream' of usernames to check against the hash table
stream = []
for i in xrange(10000000):
stream.append(generate_username())
# Measure performance of hash lookups for 10mil usernames
start = time.clock()
for name in stream:
if name in users:
pass #print "%s is present" % name
end = time.clock()
print "%fs (%f - %f)" % (end - start, start, end)
结果:
3.660000s (238.100000 - 241.760000)
因此在Python中,您可以在4秒内检查1000万个用户名,相当于流媒体> 17MB / s。你真的需要多快? :)