关于散列图和术语 C++ 的一些确认

Some confirmation on hashmaps and terminology C++

我正在做一个介绍 C++ 的实验,我们已经开始使用用户名和密码数据库,我的教授希望我们将其实现为具有动态分配的 LinkedLists 数组的哈希图。我只是想确认一下我在做什么,这样我就知道我做的是正确的...

1) 存储桶是存储信息的地方。我假设每个桶都是一个单独的 LinkedList。

2) 哈希函数 % 桶数将决定我在数组中使用哪个索引来存储用户和密码信息。

3) Key-Value ...我对此有点困惑。密钥是我的用户名,值是我的密码吗?

4)负载因子是存储的键数除以桶数。所以在我的例子中,如果我有 50 个用户存储在我的 hashmap 中,它会是 50/100 吗?我的头脑很难理解这个概念。这是否意味着有时不会使用每个桶?

1) 正确。理想情况下,每个 "bucket" 只包含一个值。如果哈希算法存在冲突,那么多个值将存储在同一个桶中,因此使用链表。

2) 正确。散列算法让您知道散列图中 store/retrieve 数据的位置。

3) 正确。

4) 正确。你不希望 hashmap 的负载因子太高,否则 inserting/retrieving 的 运行 时间开始接近 O(N)。散列的有用方面是它(理想情况下)允许在负载因子较低时在 O(1) 时间内插入和检索。

通常,一旦负载因子达到一定水平,散列图的大小就会增加并重新散列以降低负载因子。 hashmap 使用的 space 比典型数组多,但这通常被来自它的 inserting/retrieving 数据的速度所抵消。

1) 是的。每个桶都包含一个链表。单链很常见。

2) 是的,听起来很典型。

3) 是的。

4) 是的。如果您有 100 个桶和 50 个条目,那么您的平均链表长度为 0.5。必然意味着至少一半将没有条目。