std::unordered_set 上下文中的哈希桶

问题描述 投票:0回答:1

我试图在

std::unordered_set
的背景下理解哈希。 Cppreference给出了这样的解释:

在内部,元素不按任何特定顺序排序,但是 整理成桶。元素被放入哪个桶取决于 完全取决于其值的哈希值。这允许快速访问 单个元素,因为一旦计算出哈希值,它就会引用 元素放入的确切存储桶。

我的问题是我无法理解它在内存中的样子。也许这个问题应该总体上解决哈希表,但这可能过多地依赖于实现,因为我设法找到的所有哈希表的解释都是抽象的。

据我猜测,buckets是动态分配的连续内存块,类似于数组,但它们不一定相对于彼此连续,而hashes类似于指向这些连续存储的数组的指针。

我的说法正确吗?

c++ hash unordered-set
1个回答
0
投票

std::unordered_set
/
std::unordered_map
的标准实现使用单独的链接哈希表。

这意味着哈希冲突可以通过链接列表将冲突的项目链接在一起来解决,可以使用唯一的搜索键遍历该列表来访问该项目。内存的内部组织取决于几个因素,包括各个库的实现选择,但它本质上是一个动态大小的指针数组,总是指向其链表的第一个元素(如果存在)。

这是一种常见且简单的方法,但通常会导致性能快速下降,尤其是在高过载(负载因子>0.8)的情况下,并且需要更多的内存使用来存储跟踪链表节点所需的信息.

© www.soinside.com 2019 - 2024. All rights reserved.