开放式哈希和封闭式哈希的含义


94

公开哈希(单独链接):

在开放式哈希中,键存储在附加到哈希表单元格的链接列表中。

封闭式散列(开放式寻址):

在封闭式哈希中,所有键都存储在哈希表本身中,而无需使用链接列表。

我无法理解为什么将它们称为“打开”,“关闭”和“分开”。有人可以解释吗?


实际上,我们从不将键存储在哈希表中,我们取一个元组(键,值),然后使用键来计算应将值存储在何处。所以实际上我们将值存储在哈希表中
Suryaa Jha先生

Answers:


117

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

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

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

将其与开放式散列进行比较-在这种策略中,实际上没有任何对象存储在散列表的数组中。取而代之的是,一旦对对象进行哈希处理,就将其存储在与哈希表的内部数组分开的列表中。“开放”是指我们通过保留哈希表并使用单独的列表来获得的自由。顺便说一句,“单独的列表”暗示了为什么开放哈希也被称为“单独的链接”。

简而言之,“封闭”始终指某种严格的保证,例如当我们保证对象始终直接存储在哈希表中(封闭哈希)时。然后,“封闭”的对立面是“开放”,因此,如果您没有这样的保证,则该策略被视为“开放”。


17
我们应该补充一点,开放哈希(单独链接)不限于链表,链表对缓存的友好性不强,并且在对O(n / 2)行为进行碰撞攻击时会显得模棱两可。您还可以将树或排序后的数组用于碰撞桶。
rurban 2014年

由于信息冲突而
拒绝投票

1
@MarwenTrabelsi我从没说过“ closed”和“ open”是同义词。
肯·韦恩·范德林德

“这解释了为什么“封闭式哈希”和“开放式寻址”是同义词。
Marwen Trabelsi

1
有人可以提供资料证明这是正确的历史词源吗?
Santropedro

3

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

在“公开哈希”中,数组中的每个单元格都指向包含冲突的列表。哈希为链表中的所有项目产生了相同的索引。

在封闭式哈希中,您仅使用一个数组来存储所有内容。您将冲突存储在同一数组中。诀窍是使用某种聪明的方法从碰撞中跳到碰撞单元,找到想要的东西。并以可重复的/确定的方式执行此操作。


2

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

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

这是一个使用C ++ 进行单独链接示例,该链接使用一个使用mod运算符的简单哈希函数(显然是一个错误的哈希函数)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.