【发布时间】:2015-10-21 17:44:40
【问题描述】:
整数列表的排列也应该保留在哈希中——即,包含不同顺序的相同数字的列表应该有不同的哈希。
这样做的一种方法是将整数列表连接成一个字符串,但如果列表很大,这可能是一个昂贵的比较测试。
上下文:如果我已经对 5 个大型数组进行了“分析”和哈希处理,我将能够快速检查传入的数组是否是新的。
【问题讨论】:
标签: arrays performance hash integer comparison
整数列表的排列也应该保留在哈希中——即,包含不同顺序的相同数字的列表应该有不同的哈希。
这样做的一种方法是将整数列表连接成一个字符串,但如果列表很大,这可能是一个昂贵的比较测试。
上下文:如果我已经对 5 个大型数组进行了“分析”和哈希处理,我将能够快速检查传入的数组是否是新的。
【问题讨论】:
标签: arrays performance hash integer comparison
https://en.wikipedia.org/wiki/Pigeonhole_principle
“在数学中,鸽笼原理指出,如果将 n 件物品放入 m 个容器中,且 n > m,那么至少一个容器必须包含多于一件物品”
当然可以创建一个唯一的数字,只是它非常大。
考虑
[1,2,3]
一个简单的列表,但是为了确保我们的鸽子有足够的洞,我们需要在每个槽中为最大的整数留出空间,所以假设每个项目有 4 个字节,我们需要一个 12 字节的整数来存储唯一地散列,或 ~3.4028237e+38 个不同的值。这只是 3 个整数。
不,有效的散列很少是唯一的,但好的散列不太可能发生相似值的冲突。
要回答有关检查存在性的问题,请考虑以下几点:
如果你有一个包含 n 项的数组,为了对它进行哈希处理,你需要执行 n 步。为了检查是否存在,您最多需要 n 个步骤依次检查每个项目。
在任何一种情况下,您将花费大约相同的时间比较数组。
【讨论】:
数组结构似乎是索引区分元素的完美选择,或者您可以使用元素列表,其中元素在插入之前分配了索引值。
永远不要将字符串用作列表结构,因为它有自己的属性,比如不变性(在 Java 的情况下)。
【讨论】: