HashMap 和 HashTable 的区别纯粹在数据结构上

Posted

技术标签:

【中文标题】HashMap 和 HashTable 的区别纯粹在数据结构上【英文标题】:Difference between HashMap and HashTable purely in Data Structures 【发布时间】:2015-11-23 08:17:48 【问题描述】:

HashTableHashMap 之间有什么区别纯粹是在数据结构的上下文中(而不是在 Java 或任何其他语言中)

我看到人们在同一概念上交替使用这些术语。 纯粹在数据结构的上下文中是否完全没有区别?

【问题讨论】:

C 中没有标准的 HashTable 或 HashMap 类型。这两个术语通常可以互换使用。 我知道在 C 中没有这样的标准 HashTable 或 HashMap。我的意思是在用 C 编程它的概念时两者之间有什么区别。 那么这与C无关。C没有“HashMap”或“HashTable”的概念。 我提到 C 的原因是这个问题可能不会被误认为是另一个询问它在 java 中的区别的问题。 看不出 lnk 如何令人信服它的相似性!我不知道它是如何与提到的链接重复的。 【参考方案1】:

在计算科学术语中,map 是从键到值的关联容器映射。换句话说,您可以执行“for key K remember value V”和稍后的“for key K get the value”之类的操作。映射可以通过多种方式实现 - 例如,使用(可选平衡的)二叉树、哈希表,甚至是存储键/值的连续结构数组。

哈希表是一种用于存储任意数据的结构,并且该数据不一定由单独的键和值组成。例如,我可以有一个包含值 1, 10, 33, 97 的哈希表,这将是它们自己的键。当没有与键不同的值时,这有时称为“集合”,而哈希表实现称为“哈希集合”。散列表的定义质量是散列函数从键数据计算数组索引,不同的键倾向于产生不同的索引,允许恒定时间访问数组元素可能包含键.这是一种实现/性能质量,而不是像定义 map 这样的功能质量。

因此,哈希表存储元素,每个元素不必由不同的键和值组件组成,但如果包含,那么它也是哈希映射

【讨论】:

所以hashmap 只是hash table 的一种特定类型(具有不同的键和值)? @NickZuber:是的,这是正确的——对我最后一段的合理解释。干杯 感谢您终于成为第一个清楚解释哈希表和哈希图+1之间区别的人 这是一个高质量的答案,但仍然无法明确区别。在哪种情况下,我们可以在二叉树中实现您解释为 map(key-value) 的内容?如果计算机科学的定义就像您解释的那样,为什么人们不只调用 map 而不是 hashmap 呢?您对 os Hashtable 的解释非常模棱两可,它为没有键值的解释留下了余地,事实并非如此,您的示例只是传达了键和值可以相同。 @RollRoll:我重读了我的答案,我认为它很清楚,但我可以看到英语不是你的第一语言,所以让我们来解决你的问题:“在哪种情况下我们可以在二叉树中实现您解释为 map(key-value) 的内容吗?” - 只要二叉树的内存使用和性能影响对您的应用程序来说是可以的,您就可以这样做。使用树(例如 C++ std::map),您将进行 O(log N) 查找、插入和擦除,而哈希表 (std::unordered_map) 摊销 O(1)。使用向量对 CPU 缓存最友好,并且通常具有最低的内存开销。【参考方案2】:

我是这样理解的: 哈希表:我们在计算机科学中所说的概念 哈希映射:它在 Java 中的名称 哈希集(HashSet):我们只关心唯一键的情况(或者你可以把它看成一个哈希表,我们忽略值,我们只想知道唯一键的集合是什么)

或者简单地说, 哈希表 (CS) = HashMap (Java) = 字典 (Python) 哈希集 (CS) = 哈希集 (Java) = 集 (Python)

【讨论】:

我也这么理解 :)【参考方案3】:

C 没有任何内置容器(除了数组),因此取决于个人实现者他们想要调用它。就 C 而言,HashMap vs. HashTable 没有真正的意义。

一个可能的区别可能在于后备存储的设置方式。散列可以是一个简单的键和值线性数组,由散列索引。散列 map 可能是按键排序的平衡树,以及将散列映射到树节点的表,允许快速 (O(1)) 查找 按关键顺序遍历数据的能力。

或者它可能是完全不同的东西。同样,C 没有任何类型的内置容器来处理这类事情,因此这些名称在 C 上下文中并没有真正的意义。

【讨论】:

【参考方案4】:

hashmap 和 hashtable 之间的解释是非常正确的,因为它也适合 strmap.c 中实现的字符串 hash map 的 header,其中 stringmap 是满足键值结构属性的字符串的 hashtable。这里说:

/*
 *    strmap version 2.0.1<br>
 *
 *    ANSI C hash table for strings.
 *
 *    Version history:
 *    1.0.0 - initial release
 *    2.0.0 - changed function prefix from strmap to sm to ensure
 *        ANSI C compatibility 
 *    2.0.1 - improved documentation<
 *
 *    strmap.c
 *
 *    Copyright (c) 2009, 2011, 2013 Per Ola Kristensson.
 *
 *    Per Ola Kristensson <pok21@cam.ac.uk> 
 *    Inference Group, Department of Physics
 *    University of Cambridge
 *    Cavendish Laboratory
 *    JJ Thomson Avenue
 *    CB3 0HE Cambridge
 *    United Kingdom
 *
 *    strmap is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU Lesser General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    strmap is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public License
 *    along with strmap.  If not, see <http://www.gnu.org/licenses/>.
 */
#include "strmap.h"
typedef struct Pair Pair;
typedef struct Bucket Bucket;
struct Pair 
    char *key;
    char *value;
;

【讨论】:

【参考方案5】:

我仅从数据结构的角度理解 Hashmap 和 Hashtable 之间的区别,不考虑实现它的技术如下:

哈希图: 是一种更高级别的数据结构,它以键值对的方式组织数据。例如:黄页;

哈希表: 是一种 Hashmap 类型,其关键信息与值直接相关,通常通过使用该值作为源应用散列函数生成,但不一定要被视为散列表。如上所述,具有与值相同的键仍将被视为散列表。

【讨论】:

"Hashtable: Is a type of Hashmap" 并非如此:哈希表不必是 any 类型的映射 - 它可以简单地存储一个一组不涉及任何映射的值。其次,“关键信息与值直接相关,通常是通过使用该值作为源应用散列函数生成的” - 这是非常错误的,因为当将散列函数应用于不同的值时,通常获得相同哈希值结果的统计上很小但非常真实的风险:您通常不能将哈希值用作键。

以上是关于HashMap 和 HashTable 的区别纯粹在数据结构上的主要内容,如果未能解决你的问题,请参考以下文章

HashMap和HashTable的区别是什么

HashMap和Hashtable的区别?

HashMap和Hashtable的区别

hashMap和hashTable区别

hashMap和hashTable的区别

HashMap和Hashtable的区别 源码分析