HashMap 和 HashTable 的区别纯粹在数据结构上
Posted
技术标签:
【中文标题】HashMap 和 HashTable 的区别纯粹在数据结构上【英文标题】:Difference between HashMap and HashTable purely in Data Structures 【发布时间】:2015-11-23 08:17:48 【问题描述】:HashTable
和 HashMap
之间有什么区别纯粹是在数据结构的上下文中(而不是在 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 的区别纯粹在数据结构上的主要内容,如果未能解决你的问题,请参考以下文章