Open散列和闭合散列的含义

har*_*ddy 89 hash

Open Hashing(单独链接):

在开放散列中,密钥存储在附加到散列表的单元格的链接列表中.

封闭散列(开放寻址):

在封闭散列中,所有键都存储在散列表本身中,而不使用链接列表.

我无法理解为什么他们被称为开放,封闭和分离.有人可以解释一下吗?

Ken*_*nde 114

"封闭"与"开放"的使用反映了我们是否被锁定使用某个位置或数据结构(这是一个非常模糊的描述,但希望其余的帮助).

例如,"开放寻址"中的"打开"告诉我们,对象将存储在哈希表中的索引(也称为地址)不完全由其哈希码确定.相反,索引可能会根据哈希表中已有的内容而有所不同.

"封闭散列"中的"封闭"是指我们从不离开散列表的事实; 每个对象都直接存储在哈希表的内部数组中的索引处.请注意,这只能通过使用某种开放寻址策略来实现.这解释了为什么"封闭散列"和"开放寻址"是同义词.

将此与开放散列进行对比 - 在此策略中,没有任何对象实际存储在散列表的数组中; 相反,一旦对象被散列,它就存储在一个与散列表的内部数组分开的列表中."open"是指通过离开哈希表并使用单独的列表获得的自由.顺便说一下,"单独列表"暗示了为什么开放散列也被称为"单独链接".

简而言之,"关闭"总是指某种严格的保证,就像我们保证对象总是直接存储在哈希表中一样(闭合哈希).然后,"关闭"的反面是"开放",所以如果你没有这样的保证,那么该策略被认为是"开放的".

  • 我们应该补充一点,Open Hashing(单独链接)并不局限于链接列表,这些链接列表不是缓存友好的,并且在对O(n/2)行为的冲突攻击中是不合适的.您还可以使用树或排序的数组作为碰撞桶. (15认同)
  • 有人可以提供资料来证明这是正确的历史词源吗? (3认同)
  • @MarwenTrabelsi 我从来没有说过“封闭”和“开放”是同义词。 (2认同)

小智 6

名称开放寻址是指元素的位置(“地址”)不由其哈希值确定。(这种方法也称为封闭散列)。

单独的链接中,每个存储桶都是独立的,并且具有某种具有相同索引的条目的 ADT(列表、二叉搜索树等)。在一个好的哈希表中,每个桶都有零个或一个条目,因为我们需要 O(1) 阶的操作来进行插入、搜索等。

这是使用 C++ 进行单独链接示例,其中包含使用 mod 运算符的简单哈希函数(显然,这是一个糟糕的哈希函数)


Ant*_*eev 5

您有一个数组,即“哈希表”。

在 Open Hashing 中,数组中的每个单元格都指向一个包含冲突的列表。散列为链表中的所有项目生成了相同的索引。

在 Closed Hashing 中,您只对所有内容使用一个数组。您将碰撞存储在同一个数组中。诀窍是使用一些聪明的方法从碰撞跳到另一个碰撞,直到找到你想要的。并以可重复/确定性的方式执行此操作。