HashMap 和 HashTable 纯数据结构的区别

Difference between HashMap and HashTable purely in Data Structures

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

我见过人们将这些术语互换地用于同一概念。它完全没有区别吗纯粹在数据结构的上下文中

C 没有任何内置容器(数组除外),因此由各个实现者决定如何调用它。就C而言,HashMap vs. HashTable没有任何实际意义。

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

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

在计算科学术语中,map 是从键到值的关联容器映射。换句话说,您可以执行诸如“对于键 K 记住值 V”和稍后“对于键 K 获取值”之类的操作。映射可以通过多种方式实现 - 例如,使用(可选平衡的)二叉树或散列 table,甚至存储 key/value.

的连续结构数组

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

那样的功能质量

因此,散列 table 存储元素,每个元素不需要包含不同的键和值组件,但如果有,那么它也是 哈希映射.

hashmap 和 hashtable 之间的解释非常正确,因为它也适用于 strmap.c 中实现的字符串哈希映射的 header,其中 stringmap 是满足 a 属性的字符串的哈希表键,value-structure。这里说:

/*
 *    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;
};

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

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

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

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

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