【问题标题】:Collision Checking in Hashing哈希中的冲突检查
【发布时间】:2012-10-27 02:43:45
【问题描述】:

我对 Hashing 概念有一些理解问题,如下所示:

假设,我已经实现了将键作为数字的哈希表(一维数组,比如 A[100])。我有一个简单的散列函数 H(Key) % Table_Size,它将目标索引返回到散列表中(同时访问与此特定键关联的值)。

假设,我想将 0(key) 存储到表中。当我将此键传递给 H(散列函数)时,它会返回随机索引,例如 25。

数组 A(索引为 25)中的此位置有 2 种可能性:

  1. A[25] 包含 0 以外的一些键,因为已经存储(以前)
  2. A[25] 包含 0

第一种可能有冲突,很容易识别(因为当前key:0和已经存储的key:k不同),所以第一种没问题。

但是,第二个,我怎么知道天气有没有碰撞?

据我所知,哈希表或数组将是主内存的一部分。假设 A[25] 存储在内存位置 500 中。

我怎么知道这个位置(500)实际上是还是已经被其他键填充

内存单元的什么状态或值代表EMPTYNULLUNUSED位置?

而且,如果我想将 0 作为密钥存储到此位置进行碰撞检查,该怎么办?

我目前假设如果任何内存位置是 EMPTYNULLUNUSED,那么它将处于 RESET 状态(所有单元格是 0)。这是真的吗?

这可能是个愚蠢的问题,但我想知道在这种情况下如何检查碰撞。

--

提前致谢!! (海得拉巴海泰因)

【问题讨论】:

    标签: c memory data-structures hash-collision integer-hashing


    【解决方案1】:

    这里的想法是您必须为空单元格找到一个表示。 通常有三个:

    第一个是: 选择一个值,通常为 0 或 -1,您知道该值永远不会出现在表格中以表示空单元格。那么如果值在那里,你就知道你有一个空闲空间,你可以在那里放一些东西。

    第二个是: 使用指针数组:例如 int *array[100]。将指针初始化为 NULL。如果它们为 NULL,您可以分配一个整数并将位置设置为指向那里。

    第三个是: 使用辅助数组来判断位置 i 是否是有效位置。然后将所有初始化为空。每当您将某人放入数组 [i] 时,您就设置为有效的有效 [i] 位置。

    【讨论】:

      【解决方案2】:

      要么用你知道永远不会出现的数字填充你的哈希表,显然不是 0,也许是 -1,或者使用指向 int 的指针并将它们设置为 null 为空。

      【讨论】:

        【解决方案3】:

        这是一个节省内存并允许整数键的所有值的建议。

        将您的哈希表一分为二,使用您的密钥中的一个位,该位具有大约相等的概率为 0 或 1,并使用它来选择要搜索的哈希表的哪一半。从密钥中删除该位...如果您的密钥是 32 位,那么您现在有一个 31 位 tag 可以在哈希表中搜索。使用哈希表条目中的一位来表示空 (0) 或有效 (1),最初都是 0。当您添加条目时,您设置标签(键减去用于选择哪一半的位)并设置有效位。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-24
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 2016-07-30
          • 1970-01-01
          • 1970-01-01
          • 2015-11-24
          相关资源
          最近更新 更多