Algorithm 哈希表和bucket数组
我把它读入一个哈希表,我们有一个bucket数组,但我不明白bucket数组包含什么 它是否包含哈希索引?条目(键/值对)?两者都有 对我来说,这个图像不是很清晰: ()Algorithm 哈希表和bucket数组,algorithm,data-structures,Algorithm,Data Structures,我把它读入一个哈希表,我们有一个bucket数组,但我不明白bucket数组包含什么 它是否包含哈希索引?条目(键/值对)?两者都有 对我来说,这个图像不是很清晰: () 那么,哪一个是bucket数组呢?实际上是一个链表,其中列出了(通过对键进行散列)计算后进入该bucket的条目。在散列表中,大多数时候都会发生冲突。也就是说,不同的元素具有相同的哈希值。具有相同哈希值的元素存储在一个bucket中。因此,对于每个哈希值,您都有一个包含所有具有此哈希值的元素的bucket。bucket数组中
那么,哪一个是bucket数组呢?实际上是一个链表,其中列出了(通过对键进行散列)计算后进入该bucket的条目。在散列表中,大多数时候都会发生冲突。也就是说,不同的元素具有相同的哈希值。具有相同哈希值的元素存储在一个bucket中。因此,对于每个哈希值,您都有一个包含所有具有此哈希值的元素的bucket。bucket数组中的内容在很大程度上取决于哈希表中存储的内容以及冲突解决策略 使用或其他时,bucket表存储键或键值对,具体取决于哈希表*的使用 使用时,bucket数组存储成对的键和链接结构的标题(例如链表) 关于bucket数组,需要记住的重要一点是,它在散列码和一组零或多个键之间建立映射。换句话说,给定一个哈希代码和一个bucket数组,您可以在固定时间内找出与此哈希代码相关联的可能键(枚举候选键可能是线性的,但找到第一个候选键需要固定时间,以满足哈希表平均摊销固定时间插入和固定时间搜索的性能保证)
*如果您的哈希表us用于检查成员资格(即,它表示一组键),则bucket数组存储键;否则,它存储键-值对。数组索引基本上与哈希值相等(哈希值调整数组的大小),因此根本不需要将其存储在数组中 至于实际数组包含的内容,有几个选项:
- 如果我们使用:
- 对具有该哈希值的所有元素的链接列表的引用。因此:
LinkedList<E>[]
- 可能还有一些其他的选择,但以上是最有名的,单独链接是最流行的(据我所知)
*我假设对泛型和Java/C#/C++语法有一定的了解-
这里只是我们正在存储的元素的类型,E
意味着LinkedList
存储LinkedList
E
是一个数组,包含类型为X[]
的元素。bucket是键值对的链接列表。散列索引是其中之一 告诉“哪个bucket”,键值对中的“key”就是告诉“该bucket中的哪个条目”的那个。 也请查看X
,我已经在那里讲了更多细节。为什么不打开HashTable/HashMap的实现/源代码并查看一下???。因此我们可以说,通过从hash函数返回的索引,我们可以找到存储在bucket数组中的条目…@xdevel2000是的,但您通常不直接使用它,通常使用
查找索引。@xdevel2000单独链接将返回一个与哈希值匹配的元素列表(修改数组大小),而使用开放寻址时,您可能需要环顾四周才能找到正确的元素(是的,这有点模糊,但要澄清它需要详细的解释)。对于单独的链接,索引处的列表=元素的哈希值将包含该元素。对于开放寻址,我们还将通过开始查看该索引来找到它。我不会说您的语句完全正确,因为在该索引处,SC有一个列表,而OA不一定是该元素。hashCode%bucket.Length
LinkedListNode<E>[]
E[]
- 对具有该哈希值的所有元素的链接列表的引用。因此: