哈希和字典有什么区别?


Answers:


92

Hash是一个名称很差的数据结构,程序员在其中将接口与实现混淆了(并且懒得写全名,即HashTable求助于缩写Hash)。

Dictionary是接口的“正确”名称(= ADT),即将(通常是唯一的)键映射到(不一定是唯一的)值的关联容器。

哈希表是这种字典的一种可能的实现,它提供了很好的访问特性(就运行时而言),因此通常是默认实现。

这样的实现具有两个重要的属性:

  1. 密钥必须是可哈希的相等性可比
  2. 条目在字典中的显示顺序没有特别的顺序。

(对于可散列的键,意味着我们可以从键中计算出一个数值,该数值随后将用作数组中的索引。)

存在字典数据结构的替代实现,这些实现对键施加排序 –这通常称为排序字典(通常以搜索树的形式实现,尽管还存在其他有效的实现)。


总结一下:字典是一种ADT,它将键映射到值。此ADT有几种可能的实现,其中哈希表是其中之一。Hash是用词不当,但在上下文中等效于根据哈希表实现的字典。


4
以C ++为例,尽管下一个标准将具有有效的哈希表,但标准的关联容器模板无法实现为哈希。他们被要求unordered_map展示自己在做什么而不是在做什么。
David Thornley 2010年

6
根据什么权限“正确”?在某些语言中,例如Ruby和Perl,这些结构的正式名称为“正确”,即为“哈希”。
2010年

11
@nohat:注意我使用引号。此外,我已经解释了为什么名称选择错误,不是吗?因此,如果您需要授权,那么我会说这是理论计算机科学警察的授权。
康拉德·鲁道夫

9
有趣的是,在Ruby 1.9中,实际上不可能Hash用哈希表实现该类,因为Ruby 1.9 Hashes保留了插入顺序,而哈希表却没有。因此,在Ruby 1.9中,该名称Hash甚至不再反映实现。
约尔格W¯¯米塔格

7
@hippietrail您错了–首先,这些客观的描述。毕竟,我有资格说明为什么命名不佳且使用不当(见下文)。就我而言,“太懒”是艺术上的许可,但重点仍然是,缩短名称的原因是内在的,即,除了缩短名称之外,这里没有其他理由使用缩写。您对“字典”的看法是错误的:这仅仅是数据结构的正式名称。在计算机科学的上下文中,您对“字典”的定义是错误的,并且该名称早于Python几十年。
康拉德·鲁道夫

8

“字典”是概念的名称。哈希表是一种可能的实现。


1
哈希也是ADT。HashTable是Hash的实现
Sairam 2010年

3
@Sairam我认为对于“哈希”而言,它更常见的是表示哈希函数而不是哈希表。
jk。

@jk实际上,“哈希”是对某些输入应用“哈希函数/算法”的结果。一个“散列表”或“散列映射” omehoe涉及和哈希的目的是某个对象(对象在一个通用的形式,不限于OOP)
约翰

有些语言使用“哈希”来指代字典类型的结构,而不仅仅是哈希函数操作。以Ruby为例
肖恩·伯顿

7

字典是为用于快速查找/插入的任何数据结构实现提供的统称。这可以使用各种数据结构(例如哈希表,跳过列表,rb树等)来实现/实现。哈希表是一种特定的数据结构,可用于许多目的,包括实现字典。


哈希也是ADT。哈希和字典ADT之间有什么特定区别吗?
赛拉姆(Sairam)2010年

2
@Sairam:不,哈希是某种算法(哈希函数)的输出。

5

字典使用密钥来引用直接内的值的的关联阵列

(KEY => VALUE)

散列更经常被描述为一个散列表,它使用一个散列函数来计算在内存中的值将是的位置(或更易于阵列)。哈希将把KEY作为输入并给出一个值作为输出。然后将该值插入内存或数组索引。

KEY => HASH FUNCTION => VALUE

我猜一个是直接的,而另一个不是。散列函数可能也不完美,有时可能会提供引用错误值的索引。但这可以纠正。

最佳外观:Wikipedia(关联数组哈希表

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.