交叉比较列表中数百万哈希值的最有效方法
Most efficient way to cross compare millions of hash values in a list
我有一个包含 900 万个哈希值的列表。我需要将列表中的每个值 (hash0) 与其余值进行比较:
for i, hash0 in enumerate(hashes_list):
for hash1 in hashes_list[i:]:
if hash0 -hash1 < threshold:
#do something
上面的这个解决方案具有二次复杂性,它永远需要 运行(即使在服务器中)。交叉匹配这 900 万个哈希值的有效方法是什么?
这是 hashes_list 值的示例:
8c59ac5169e673a6
ab9f545497b05683
9590ee98373e1e19
c1274a5e1e150e7f
938f7c782dc6241b
假设减法只是常规减法,先尝试排序,排序可以是O(n Ln(n))时间复杂度,比n^2好一点
这样你就可以用两个指针迭代一次,找到彼此接近的散列组。这将是 n*k 的复杂性,其中 n 是散列的数量,k 是匹配的平均数。
伪代码看起来像
sort(hashes_list) #large to small
count = size(hashes_list)
i = 0
while i < count:
j = i + 1
while hashes_list[i] - hashes_list[j] < threshold:
#do something
j += 1
i += 1
在某些情况下,您可以跳过检查。例如,如果 0 - 10 都在阈值内,那么 1-10 也将在阈值内,并且只需为每个调用“#do something”而无需再次检查
由于您不想比较值的精确匹配,因此很容易排除使用集合或字典的可能性 -
但是您当然可以从使用更适合该目的的更好的数据结构中受益。
如果您需要的值比较是数字,就像您的代码中显示的那样,看起来只是对列表进行排序(并且对 900 万个值进行排序是非常可行的),并且比较结果中的邻居就足以减少你的复杂度从 O(n**2) 到 O(n)。
我有一个包含 900 万个哈希值的列表。我需要将列表中的每个值 (hash0) 与其余值进行比较:
for i, hash0 in enumerate(hashes_list):
for hash1 in hashes_list[i:]:
if hash0 -hash1 < threshold:
#do something
上面的这个解决方案具有二次复杂性,它永远需要 运行(即使在服务器中)。交叉匹配这 900 万个哈希值的有效方法是什么?
这是 hashes_list 值的示例:
8c59ac5169e673a6
ab9f545497b05683
9590ee98373e1e19
c1274a5e1e150e7f
938f7c782dc6241b
假设减法只是常规减法,先尝试排序,排序可以是O(n Ln(n))时间复杂度,比n^2好一点
这样你就可以用两个指针迭代一次,找到彼此接近的散列组。这将是 n*k 的复杂性,其中 n 是散列的数量,k 是匹配的平均数。
伪代码看起来像
sort(hashes_list) #large to small
count = size(hashes_list)
i = 0
while i < count:
j = i + 1
while hashes_list[i] - hashes_list[j] < threshold:
#do something
j += 1
i += 1
在某些情况下,您可以跳过检查。例如,如果 0 - 10 都在阈值内,那么 1-10 也将在阈值内,并且只需为每个调用“#do something”而无需再次检查
由于您不想比较值的精确匹配,因此很容易排除使用集合或字典的可能性 -
但是您当然可以从使用更适合该目的的更好的数据结构中受益。
如果您需要的值比较是数字,就像您的代码中显示的那样,看起来只是对列表进行排序(并且对 900 万个值进行排序是非常可行的),并且比较结果中的邻居就足以减少你的复杂度从 O(n**2) 到 O(n)。