【问题标题】:Some confirmation on hashmaps and terminology C++关于哈希图和术语 C++ 的一些确认
【发布时间】:2015-11-19 05:41:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你的教授拒绝回答这些问题,也没有向你介绍哈希图的概念?
  • 他对它们很模糊。如果您不想回答这些问题,请随时继续。不,他没有。
  • 他给出了理论上的解释,但没有太身临其境的感觉。
  • “桶”是什么意思,这不是 C++ 术语。链表是std::list、数组(可能)std::array 和hashmap std::map。可以阅读这些天的结构来回答您的问题。是的,你的老师应该和那些问题,但这不是你的错。
  • 我完全可以按照自己的方式继续前进。这意味着,我想指出您甚至没有发布任何自己的代码。

标签: c++ linked-list hashmap


【解决方案1】:

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

2) 正确。哈希算法可以让您知道在哈希图中存储/检索数据的位置。

3) 正确。

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

通常,一旦负载因子达到一定水平,哈希图的大小就会增加并重新散列以降低负载因子。哈希图比典型数组使用更多空间,但这通常会被插入/检索数据的速度所抵消。

【讨论】:

  • 附录 2:有趣的部分是以最大化唯一性的方式计算哈希值(从而最大限度地减少冲突 - 同一存储桶中的多个值),而不会使计算过于密集以至于它黯然失色检索存储项目的低成本。
【解决方案2】:

1) 是的。每个桶将保存一个链表。单链接很常见。

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

3) 是的。

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

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多