Hashing中的碰撞检查

时间:2012-10-26 18:01:21

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

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

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

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

阵列A中有两种可能的位置(具有索引25):

  1. A [25]包含除 0 以外的其他键,因为已存储(之前)
  2. A [25]包含 0
  3. 第一种可能性是碰撞并且很容易识别(因为当前键:0和已经存储的键:k不同),所以第一种没有问题。

    但是,对于第二个,我怎么知道天气发生了碰撞?

    只要我知道,哈希表或数组就是主内存的一部分。假设A [25]存储在存储器位置500中。

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

    内存单元的哪个状态或值代表 EMPTY NULL UNUSED 位置?

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

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

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

    -

    提前致谢!! (Hitein,Hyderabad)

3 个答案:

答案 0 :(得分:2)

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

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

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

第三是: 使用辅助数组来判断位置i是否是有效位置。将所有的全部初始化为空。每当你把某人放在数组[i]中时,你设置为有效[i]位置。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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