我有大量的整数列表。我想检查是否有任何列表是重复的。我认为这样做的一个好方法是计算一个基本校验和,然后只检查校验和是否一致的元素。但我找不到具有良好属性的校验和算法,即:
例如,函数check_sum在后面的5个调用中返回[0,65536]范围内的不同数字将是理想的。
check_sum([1,2,3,4,5])
check_sum([1,2,3,5,4])
check_sum([5,4,3,2,1])
check_sum([1,2,3,4,4])
我查看了IPv4标头校验和算法,该算法返回大小合适的结果但不检查顺序,因此不是我正在寻找的。 p>
我将在python中实现它,但任何格式都可以用于算法,或者指向一个好的参考材料。
答案 0 :(得分:0)
使用hash()
计算校验和:
checksums = \
list(
map(
lambda l:
hash(tuple(l)),
list_of_lists
)
)
要知道你有多少重复:
from collections import Counter
counts = Counter(checksums)
编制一个唯一的清单:
unique_list = list(dict(zip(checksums, list_of_lists)).values())
答案 1 :(得分:0)
如果你想要一些朴素的东西,可以使用Fletcher校验和版本。
def check_sum(l):
sum1 = sum2 = 0
for v in l:
sum1 = (sum1 + v) % 255
sum2 = (sum2 + sum1) % 255
return sum1*256 + sum2
print(
check_sum([1,2,3,4,5]),
check_sum([1,2,3,5,4]),
check_sum([5,4,3,2,1]),
check_sum([1,2,3,4,4])
)
答案 2 :(得分:0)
应该是mod 256吗?
def check_sum(l):
sum1 = sum2 = 0
for v in l:
sum1 = (sum1 + v) % 256
sum2 = (sum2 + sum1) % 256
return sum1*256 + sum2
print(
check_sum([1,2,3,4,5]),
check_sum([1,2,3,5,4]),
check_sum([5,4,3,2,1]),
check_sum([1,2,3,4,4])
)