【问题标题】:Good hash function to remove duplicates from array用于从数组中删除重复项的良好哈希函数
【发布时间】:2012-03-23 22:27:01
【问题描述】:

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

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

【问题讨论】:

  • C 还是 C++?这肯定会有所作为。你使用什么实现的哈希表?
  • 如果没有关于哈希键的任何信息,很难回答这个问题。字符串、整数?
  • 数组中有哪些类型,取值范围是多少?
  • 它们是什么整数?他们的范围是多少?你能告诉他们关于他们的任何其他事情吗?
  • @AbdulSamad:你搞错了。哈希函数的目标是将输入映射到指定范围内的整数。但是哈希本身不使用 raw,而是用作哈希表的提示,哈希表的大小仅取决于其元素的数量。

标签: c++ c algorithm


【解决方案1】:

您的问题缺乏细节,所以我将弥补它们。

散列一个整数通常是没有用的。整数是它自己的哈希。

最重要的是整数的大小(多少位),不同元素的数量(以便我们知道边表会增长多少)和数组中的元素数量(估计有多少操作会的)。

消除重复的最简单的解决方案通常是排序+统一。或者在 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,您可以轻松获得它们。
  • 如果范围扩大,则更多取决于范围的稀疏程度。
    • 对于稀疏范围,哈希表确实是一个不错的方法
    • 但是,对于一个完整的范围(例如,非常少的重复项和大量元素),哈希表将大幅增长并且可能变得太大,在这种情况下,可能比布隆过滤器(即概率方法)效果更好。

【讨论】:

    【解决方案2】:

    散列一个整数的意义很小,因为它已经小到可以进行比较了。您可以对数组进行排序并轻松删除相等的后续元素。例如,如果您真的想对它们进行哈希处理,只需将前两个字节转换为一个短字节,这就是您的哈希值。

    【讨论】:

      【解决方案3】:

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

      h(k) = |ak + b|模数,

      其中 N 是质数,a 和 b 是随机选择的非负整数,因此 a mod N != 0。但您仍然需要处理冲突。

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多