【问题标题】:What does "bucket entries" mean in the context of a hashtable?在哈希表的上下文中,“桶条目”是什么意思?
【发布时间】:2012-02-22 20:08:33
【问题描述】:

在哈希表的上下文中,“桶条目”是什么意思?

【问题讨论】:

  • How does a hash table work? 的可能重复项
  • 不要相信他们——“桶条目”是哈希表在被释放之前所做的事情。

标签: hashtable


【解决方案1】:

存储桶只是一个快速访问位置(如数组索引),它是散列函数的结果。

散列的想法是将复杂的输入值转换为可用于快速提取或存储数据的不同值。

考虑以下用于将人名映射到街道地址的哈希函数。

首先取名字和姓氏的首字母并将它们都转换为数值(025,从 AZ)。将第一个乘以 26 并加上第二个,这将为您提供一个从 0675 的值(26 * 26 不同的值或存储桶 ID)。然后,此存储桶 ID 将用于存储或检索信息。


现在您可以拥有一个 完美 哈希(其中每个允许的输入值都映射到一个 distinct 存储桶 ID),这样一个简单的数组就可以满足存储桶的需求。在这种情况下,您只需维护一个包含 676 个街道地址的数组,并使用存储桶 ID 来查找您想要的地址:

+-------------------+
| George Washington | -> hash(GW)
+-------------------+      |
                           +-> GwBucket[George's address]
+-------------------+
|  Abraham Lincoln  | -> hash(AL)
+-------------------+      |
                           +-> AlBucket[Abe's address]

但是,这意味着 George Wendt 和 Allan Langer 将来会引起问题。


或者您可以有一个 不完美 哈希(例如 John Smith 和 Jane Seymour 最终使用相同的存储桶 ID 的哈希)。

在这种情况下,您需要一个比简单数组更复杂的后备数据结构来维护地址的集合。这可以像链表一样简单,也可以像 另一个哈希一样复杂:

+------------+       +--------------+
| John Smith |       | Jane Seymour |
+------------+       +--------------+
      |                     |
      V                     V
   hash(JS)              hash(JS)
      |                     |
      +-----> JsBucket <----+
                 \/
+-----------------------------------+
| John Smith   ->  [John's address] |
| Jane Seymour ->  [Jane's address] |
+-----------------------------------+

然后,除了初始哈希查找之外,还需要在存储桶本身内执行额外级别的搜索,以查找特定信息。

【讨论】:

    【解决方案2】:

    来自Wikipedia

    散列表或散列映射是一种数据结构,它使用散列函数将识别值(称为键(例如,人名))映射到相关值(例如,电话号码)。因此,哈希表实现了关联数组。哈希函数用于将键转换为要查找对应值的数组元素(槽或桶)的索引(哈希)。

    数组/向量中的每个条目都称为一个桶。

    【讨论】:

      【解决方案3】:

      我认为 Bucket 是一个至少包含哈希值的结构,它作为索引,(哈希值由哈希函数生成),但结构本身可能包含条目(数据)或不.

      插图:

      [哈希值][指向实际数据] ---> [实际数据]
      ||

      [哈希值][实际数据]
      |-----bucket结构--->|

      它是 [hash value] 部分作为索引。


      我发现这些来自hash_table Wikipedia 的照片非常简单。

      下面的照片表明条目(数据)可以存储在桶中,也可以用自己的数据结构存储,而桶只是指向数据。

      【讨论】:

        【解决方案4】:

        重新散列和合并散列都假定预先确定的固定表大小。如果记录的数量增长到超过表位置的数量,则在不分配更大的表并重新计算散列的情况下就不可能插入它们。

        解决哈希冲突的另一种方法是分离链接Bucket 一词通常与单独的链接一起使用。单独的链接涉及为键散列为特定值的所有记录保留一个不同的链接列表。

        假设散列函数产生介于 0 和 tablesize - 1 之间的值。然后声明大小为 tablesize 的头节点的 array bucket。该数组称为哈希表

        Bucket[i],bucket entry,指向所有key hash入i的记录列表。插入记录,访问列表头bucket[i],在尾部插入记录。

        【讨论】:

          猜你喜欢
          • 2014-02-24
          • 2016-11-07
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 1970-01-01
          • 2018-06-27
          • 2018-02-05
          • 2012-05-12
          相关资源
          最近更新 更多