Answers:
“封闭”与“开放”的使用反映了我们是否被锁定使用某个位置或数据结构(这是一个非常模糊的描述,但希望其余部分会有所帮助)。
例如,“开放寻址”中的“开放”告诉我们将对象存储在哈希表中的索引(又称地址)并不完全由其哈希码确定。相反,索引可能会根据哈希表中已有的内容而有所不同。
“封闭式散列”中的“封闭”是指我们从不离开散列表。每个对象都直接存储在哈希表内部数组的索引处。请注意,这只能通过使用某种开放式寻址策略来实现。这解释了为什么“封闭式哈希”和“开放式寻址”是同义词。
将其与开放式散列进行比较-在这种策略中,实际上没有任何对象存储在散列表的数组中。取而代之的是,一旦对对象进行哈希处理,就将其存储在与哈希表的内部数组分开的列表中。“开放”是指我们通过保留哈希表并使用单独的列表来获得的自由。顺便说一句,“单独的列表”暗示了为什么开放哈希也被称为“单独的链接”。
简而言之,“封闭”始终指某种严格的保证,例如当我们保证对象始终直接存储在哈希表中(封闭哈希)时。然后,“封闭”的对立面是“开放”,因此,如果您没有这样的保证,则该策略被视为“开放”。
您有一个数组是“哈希表”。
在“公开哈希”中,数组中的每个单元格都指向包含冲突的列表。哈希为链表中的所有项目产生了相同的索引。
在封闭式哈希中,您仅使用一个数组来存储所有内容。您将冲突存储在同一数组中。诀窍是使用某种聪明的方法从碰撞中跳到碰撞单元,找到想要的东西。并以可重复的/确定的方式执行此操作。
名称开放寻址指的是元素的位置(“地址”)不是由其哈希值确定的事实。(此方法也称为封闭哈希)。
在单独的链接中,每个存储桶都是独立的,并且具有某种具有相同索引的ADT(列表,二进制搜索树等)条目。在一个好的哈希表中,每个存储桶都有零个或一个条目,因为我们需要执行O(1)顺序的操作才能进行插入,搜索等操作。
这是一个使用C ++ 进行单独链接的示例,该链接使用一个使用mod运算符的简单哈希函数(显然是一个错误的哈希函数)