我对哈希概念有一些理解问题,如下所示:
假设我已经实现了哈希表(1-D数组,比如 A [100] ),其中键为数字。我有一个简单的哈希函数 H(Key)%Table_Size ,它会将目标索引返回到哈希表中(同时访问与此特定键关联的值)。
假设我想将 0 (键)存储到表中。当我将此密钥传递给 H (哈希函数)时,它会返回随机索引,例如25。
阵列A中有两种可能的位置(具有索引25):
第一种可能性是碰撞并且很容易识别(因为当前键:0和已经存储的键:k不同),所以第一种没有问题。
但是,对于第二个,我怎么知道天气发生了碰撞?
只要我知道,哈希表或数组就是主内存的一部分。假设A [25]存储在存储器位置500中。
我怎么知道天气这个位置(500)实际上是空还是已被填充的其他键?
内存单元的哪个状态或值代表 EMPTY 或 NULL 或 UNUSED 位置?
而且,如果我想将 0 作为密钥存储到此位置进行冲突检查,该怎么办?
我目前假设如果任何内存位置 EMPTY 或 NULL 或 UNUSED ,那么它将处于RESET状态(所有单元格)是0的)。这是真的吗?
这可能是一个愚蠢的问题,但我想知道在这种情况下如何检查碰撞。
-
提前致谢!! (Hitein,Hyderabad)
答案 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.当您添加条目时,您设置标记(键减去用于选择哪一半的位)并设置有效位。