【发布时间】:2016-03-07 01:33:15
【问题描述】:
有人可以解释字典和哈希表之间的区别吗?在 Java 中,我读过字典是哈希表的超集,但我一直认为它是相反的。其他语言似乎将两者视为相同。什么时候应该使用一个而不是另一个,有什么区别?
【问题讨论】:
标签: dictionary hashtable
有人可以解释字典和哈希表之间的区别吗?在 Java 中,我读过字典是哈希表的超集,但我一直认为它是相反的。其他语言似乎将两者视为相同。什么时候应该使用一个而不是另一个,有什么区别?
【问题讨论】:
标签: dictionary hashtable
牛津计算词典defines a dictionary as...
表示一组元素的任何数据结构,可以支持元素的插入和删除以及成员资格测试。
因此,字典是一个抽象概念,可以合理有效地实现,例如如果键是数字且不太稀疏,则二叉树或哈希表、尝试甚至直接数组索引。也就是说,python 在其 dict 实现中使用了一个封闭的哈希表,而 C# 似乎也使用了某种哈希表(因此需要一个单独的 SortedDictionary 类型)。
hash table 是一种更加具体和具体的数据结构:有多种实现选项(closed 与 open 散列可能是最基本的),但它们的特点都是 O(1)分期插入、查找和删除,并且没有任何借口比 O(n + #buckets) 更糟糕的 begin->end 迭代,而实现可能会更好(例如 GCC 的 C++ 库具有 O(n) 容器迭代。实现必然依赖于一个哈希函数,导致数组中的索引探针。
【讨论】:
在我看来,哈希表是实现字典的一种方式。指定键是 hashfunction(x),值是任何 Object。只要为该对象实现了 .equals(y),Java 字典就可以使用任何键。
“答案”也会根据您使用的语言(C#?Java?JS?)而改变。在 JS 中,“字典”被实现为哈希表,没有区别。 ---- 在另一种语言中(我相信是 C#),Dictionary 必须是强类型的固定类型键和固定类型值,而 Hashtable 的值可以是任何类型,并且两者不能相互扩展。
【讨论】: