“存储区条目”在哈希表的上下文中意味着什么?
答案 0 :(得分:23)
存储桶只是一个快速访问位置(如数组索引),它是哈希函数的结果。
散列的想法是将复杂的输入值转换为可用于快速提取或存储数据的不同值。
考虑使用以下哈希函数将人名转换为街道地址。
首先从名字和姓氏中取出首字母并将它们都变成数字值(0到25,从'A'到'Z')。将第一个乘以26并添加第二个,这将为您提供从0
到675
(26 * 26
个不同值或存储区ID)的值。然后,此存储桶ID用于存储或检索信息。
现在您可以拥有完美哈希(其中每个允许的输入值映射到不同的桶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] |
+-----------------------------------+
然后,除了初始哈希查找之外,还需要在存储桶本身内执行额外的搜索,以查找特定信息。
答案 1 :(得分:9)
来自 Wikipedia :
散列表或散列映射是一种数据结构,其使用散列函数将标识值(称为密钥(例如,人名))映射到它们的相关值(例如,它们的电话号码)。因此,哈希表实现了一个关联数组。哈希函数用于将密钥转换为要搜索相应值的数组元素(槽或桶)的索引(哈希)。
数组/向量中的每个条目都称为Bucket。
答案 2 :(得分:1)
我认为 Bucket 是一个至少包含哈希值的结构,该哈希值用作索引(哈希值由哈希函数生成),但该结构本身可能包含条目(数据)
插图:
[哈希值] [指向实际数据] ---> [实际数据]
| <------------存储桶结构------> |
[哈希值] [实际数据]
| -----存储桶结构---> |
[哈希值]部分用作索引。
我发现hash_table Wikipedia的这些照片非常简单。
下面的照片指示条目(数据)可以存储在存储桶中,也可以使用其自己的数据结构存储,而存储桶只是指向数据。
答案 3 :(得分:0)
重新散列和合并散列都假定预先确定固定的表格大小。如果记录数增长超过表位数,则无法在不分配更大的表和重新计算哈希的情况下插入它们。
解决散列冲突的另一种方法是单独链接。术语 Bucket 通常与单独的链接一起使用。单独链接涉及为其键散列到特定值的所有记录保留不同的链接列表。
假设哈希函数产生的值介于0和tablesize之间 - 1.然后声明大小tablesize的头节点的数组桶。此数组称为哈希表。
Bucket [i] ,桶条目,指向键入哈希到i的所有记录的列表。要插入记录,访问列表头桶[i]并在尾端插入记录。