打开哈希(单独链接):
在开放哈希中,密钥存储在附加到哈希表单元格的链表中。
封闭散列(开放寻址):
在封闭散列中,所有键都存储在散列表中,而不使用链接列表。
我无法理解他们被称为开放,封闭和分离的原因。有人可以解释一下吗?
答案 0 :(得分:108)
“封闭”与“开放”的使用反映了我们是否被锁定使用某个位置或数据结构(这是一个非常模糊的描述,但希望其余的帮助)。
例如,“开放寻址”中的“打开”告诉我们,对象将存储在哈希表中的索引(也称为地址)不完全由其哈希码确定。相反,索引可能会根据哈希表中已有的内容而有所不同。
“封闭散列”中的“关闭”是指我们从不离开哈希表的事实;每个对象都直接存储在哈希表的内部数组中的索引处。请注意,这只能通过使用某种开放寻址策略来实现。这解释了为什么“封闭散列”和“开放寻址”是同义词。
将此与开放哈希进行对比 - 在此策略中,没有任何对象实际存储在哈希表的数组中;相反,一旦对象被散列,它就存储在一个与散列表的内部数组分开的列表中。 “open”是指通过离开哈希表并使用单独的列表获得的自由。顺便说一下,“单独列表”暗示了为什么开放散列也被称为“单独链接”。
简而言之,“关闭”总是指某种严格的保证,就像我们保证对象总是直接存储在哈希表中一样(闭合哈希)。然后,“关闭”的反面是“开放”,所以如果你没有这样的保证,那么这个策略就被认为是“开放的”。
答案 1 :(得分:1)
名称开放式寻址是指元素的位置(“地址”)不是由其哈希值决定的。 (此方法也称为闭合散列)。
在单独链接中,每个存储桶都是独立的,并且具有某种具有相同索引的条目的ADT(列表,二叉搜索树等)。 在一个好的哈希表中,每个桶都有零个或一个条目,因为我们需要为插入,搜索等操作订单O(1)。
这是使用C ++的单独链接的example,使用mod运算符(clearly, a bad hash function)
使用简单的哈希函数答案 2 :(得分:0)
你有一个数组是"哈希表"。
在Open Hashing中,数组中的每个单元格都指向包含冲突的列表。散列为链表中的所有项目生成了相同的索引。
在Closed Hashing中,您只使用一个数组。您将冲突存储在同一个数组中。诀窍是使用一些聪明的方法从碰撞跳转到碰撞unitl你找到你想要的。并以可重现/确定的方式执行此操作。