【发布时间】:2016-09-19 22:33:03
【问题描述】:
我有大量的整数列表。我想检查是否有任何列表重复。我在想这样做的一个好方法是计算一个基本的校验和,然后只做一个元素一个元素的检查,如果校验和一致。但是我找不到具有良好属性的校验和算法,即:
- 有效验证订单;
- 快速计算;
- 返回一个小的结果,例如短整数;
- 分布相当均匀,不同列表重合的概率很低。
例如,为以下 5 次调用返回 [0,65536] 范围内不同数字的函数 check_sum 是理想的。
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中实现它,但是任何格式都可以用于算法,或者指向一个好的参考资料。
【问题讨论】:
-
hash( tuple([1,2,3,4,5]) )不够好吗? -
有多少个列表,它们有多大?
-
列表是搜索算法的结果,所以我试图尽可能地扩展列表的数量,也许是 100k。它们最长可达 100 条,平均为 50 条。
-
考虑到您相当合理的愿望清单,一个简单的 Adler-32 还不够吗?
-
@felih 那还不算大。你可以做
len(lists) > len(set(map(tuple, lists)))。这告诉你是否有任何重复。