【问题标题】:Why hashmap has 'hash' in its name? [closed]为什么 hashmap 的名称中有“hash”? [关闭]
【发布时间】:2020-09-04 03:57:47
【问题描述】:

Hashmap 只是一种使用自平衡二叉搜索树实现的数据结构,具有(键,值)对。因此,如果我们将字符串视为我们的键,那么仅通过比较字符串值来实现树的平衡/构造。

例如:(Ab, 1) (Aa,1)

这里的树构造是通过将 Ab 和 Aa 比较为字符串而不是某个散列值来进行的。

那么散列(函数)什么时候发生?还是只是以hashmap的名义,hashmap里面没有真正的hash?

【问题讨论】:

  • 什么是“hashmap”,C++标准库中没有这样的类。 std::map 通常实现为树,std::unordered_map 是哈希表实现。
  • 这是一个通用的计算机科学问题,而不是一个编程问题;专门针对术语而不是解决问题的问题;我希望通过教科书或网络搜索更好地回答。
  • 正如一些程序员老兄提到的,C++ 标准库中没有这样的东西。 hash_map 实际上是 STL 的一部分(此类是 SGI 扩展;它不是 C++ 标准的一部分。)您在此处编写的描述(工作,使用 RB 树)是的std::map。散列图确实涉及“散列”。您可以对“hashmap 的内部实现”进行简单的网络搜索。它将显示java.util.HashMap 的结果。但这与在 STL 中实现的数据结构相似。
  • 'Hashmap 只是一种使用自平衡二叉搜索树实现的数据结构,具有(键,值)对':不,不是。你的问题是基于一个错误的前提。

标签: c++ hashmap


【解决方案1】:

不,hashmap 不是自平衡树。

我们通常使用存储桶数组来实现哈希映射,其中条目存储在存储桶中,其在数组中的位置是根据其键的哈希值计算得出的。

由于多个不同的条目可以具有相同的哈希键,因此数组中的每个条目都可以存储具有相同哈希键的条目列表。

【讨论】:

  • 如果这是 std::unordered_map,它是 c++ 的“hashmap”,那么这听起来不对。 Since multiple, different entries can have the same hash key, each entry in the array can store a list of entries with the same hash key. -- 哈希键不同,但在内存中组织成组,以降低访问元素的成本。
  • 简单示例:您将整数存储在大小为 7 的哈希映射中,并像“取模 7”一样计算哈希。然后值 3 和 10 和 17 等都具有相同的哈希键 3,并存储在同一个桶列表中。为了减少这种“哈希冲突”,您可以更改数组的大小,使用另一种哈希算法等,但原理保持不变。
  • 啊,所以你不是指std::unordered_map
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2013-12-29
  • 2012-11-07
相关资源
最近更新 更多