字典与哈希表

Dictionary vs. hashtable

谁能解释一下字典和哈希表之间的区别?在 Java 中,我读到字典是哈希表的超集,但我一直认为它是相反的。其他语言似乎将两者视为相同。什么时候应该使用一个而不是另一个,有什么区别?

在我看来,哈希表是实现字典的一种方式。指定键是 hashfunction(x),值是任何对象。 Java 字典可以使用任何键,只要为该对象实现了 .equals(y)。

'answer' 也会根据您使用的语言(C#?Java?JS?)而改变。在 JS 中,'dictionary' 被实现为哈希表,没有区别。 ---- 在另一种语言中(我相信是 C#),Dictionary 必须是强类型的固定类型键和固定类型值,而 Hashtable 的值可以是任何类型,并且两者不能相互扩展。

牛津计算机词典 defines a dictionary 作为...

Any data structure representing a set of elements that can support the insertion and deletion of elements as well as a test for membership.

因此,字典是一个抽象的概念,可以合理有效地实现,例如二叉树或散列 tables,尝试,如果键是数字且不太稀疏,甚至直接数组索引。也就是说,python 在其 dict 实现中使用闭散列散列 table,而 C# 似乎也使用某种散列 table(因此需要一个单独的SortedDictionary类型)。

A hash table is a much more specific and concrete data structures: there are several implementations options (closed vs. open 散列可能是最基本的),但它们的特点都是 O(1) 分摊插入、查找和删除,并且没有理由让开始->结束迭代比 O 更糟(n + #buckets),而实现可能会更好(例如 GCC 的 C++ 库具有 O(n) 容器迭代。实现必然依赖于导致数组中索引探测器的哈希函数。