良好的哈希函数,用于从数组中删除重复项

时间:2012-03-10 14:34:51

标签: c++ c algorithm

任何人都可以建议使用良好的函数从数组中删除重复项以便使用适度的内存消耗吗?请记住我正在使用哈希映射解决方案,但需要良好的哈希函数。否则,内存消耗取决于阵列的最大元素。

它是一个整数数组......

3 个答案:

答案 0 :(得分:4)

你的问题缺乏细节,所以我会把它们弄清楚。

散列整数通常是无用的。整数是它自己的哈希值。

最重要的是整数的大小(多少位),不同元素的数量(以便我们知道边表将增长多少)以及数组中元素的数量(估算运算量)它需要)。

消除重复的最简单的解决方案通常是排序+统一。或者在Unix中:

cat list | sort -u

在C ++中,这可以通过<algorithm>

来实现
std::sort(vector.begin(), vector.end());
vector.erase(std::unique(vector.begin(), vector.end()), vector.end());

然而,这显然会对阵列进行排序,因此可能并不理想。在这种情况下,您始终可以使用边表。

  • 如果整数的范围很小(比如说[0, 65536)中的全部),那么只需使用整数作为索引的常规表。使用bitset可以轻松获得它们。
  • 如果范围增大,事情更多地取决于范围的稀疏程度。
    • 对于稀疏范围,哈希表确实是一个很好的方法
    • 然而,对于全范围(例如,非常少的重复项和大量元素),哈希表将极大地增长并且可能变得太大,在这种情况下,可能比布隆过滤器(即概率方法)更好地工作。

答案 1 :(得分:0)

散列整数的要点非常小,因为它已经足够小以进行比较。您可以对数组进行排序并删除容易相同的后续元素。如果你真的想要哈希它们,那么就把前两个字节放到一个短片中,它就是你的哈希值。

答案 2 :(得分:0)

您可以使用MAD(乘法加法和除法)方法,这有助于消除一组整数键中的重复模式。

h(k)= | ak + b | mod N,

其中N是素数,a和b是随机选择的非负整数,因此mod N!= 0.但是你仍然需要处理碰撞。