地图和字典有什么区别?
Map
和Dictionary
什么区别? 我不是要求他们是如何在X或Y语言中定义的(这似乎是人们一般在这里问到的),我想知道它们在理论上有什么不同。
我知道一个Map
是一个将键映射到值的对象。 不是一个Dictionary
是一样的吗? 他们有什么区别?
两个术语是相同的东西
Java,C ++使用“Map”
“Dictionary”被.Net,Python使用
Javascript,PHP使用“关联数组”
“映射”是一个正确的math术语,但是它被避免了,因为它在函数式编程中有着不同的含义。
看到这里 。
一个是另一个的老一届。 通常术语词典是在math术语“地图”被采纳之前使用的。 而且,字典往往有一个关键stringtypes,但这并不是100%真实的。
通常,我假设一张地图是由一个哈希表支持的; 它意味着一个无序的商店。 字典意味着一个有序的商店。
有一个名为Trie的树型字典。
在Lisp中,它可能看起来像这样:
(a (n (dt)) nd )
其中封装的话:
- 一个
- 和
- ant
- 一个
- 广告
从顶部到叶子的遍历产生一个词。
我的2美分。
Dictionary是Java中的一个抽象类,而Map是一个接口。 因为Java不支持多重inheritance,所以如果一个类扩展了Dictionary,它就不能扩展任何其他的类。
因此引入了Map接口。
Dictionary类是过时的,使用Map是首选。
是的,他们是一样的,你可以添加“关联arrays”的组合。
使用Hashtable
或Hash
ofter是指执行。
如此纯粹的理论层面。
字典是一个可以用来定位链接值的值。 地图是提供如何定位其他值的说明的值
所有允许非线性访问的集合(即只得到第一个或最后一个)都是一个Map,因为即使是一个简单的Array也有一个映射到正确值的索引。 所以,虽然字典是一种types的地图,地图是一个更广泛的可能的function。
在实践中,它通常是定义名称的映射函数,所以HashMap是一种映射数据结构,它使用散列algorithm将键链接到该值,其中Dictionary不指定键与链接的值所以可以通过链表,树或任何其他algorithm来存储。 从使用结束你通常不关心什么algorithm只是他们的工作,所以你使用通用字典,只有当你需要在types的algorithm之前转移到其他结构之一
不是真的一样的事情。 地图是字典的一个子集。 字典在这里定义为具有插入,删除和查找function。 Java所使用的映射(根据这个 )是一个字典,要求映射到值的键被严格映射为一对一的函数。 一个字典可能有多个关键映射到一个值,或者一个关键映射到几个值(如链接在一个hasthtable),例如Twitter标签search。
作为一个更“现实世界”的例子,在字典中查找单词可以给我们多个关于同一个单词的定义,并且当我们find一个指向另一个条目的条目时(参见另一个单词),一些单词对于相同的定义列表。 在现实世界中,地图更广泛,使我们有名称或名称坐标位置,但也可以find最近的邻居或其他属性(人口等),所以恕我直言,可以有一个更大的扩张地图types可能有基于graphics的实现,但最好总是假设只有键 – 值对,特别是因为最近的邻居和其他属性的值可能都只是该值的数据成员。
Java地图,尽pipe一对一的要求,可以实现更像广义字典的东西,如果价值被普遍化为一个集合本身,或者如果这些值只是参考存储在其他地方的集合。
请记住,Java维护者不是ADT定义的维护者,而Java决策是专门针对Java的。
这个概念的其他术语是相当普遍的:关联数组和散列。
主要区别在于Map需要所有条目(值和密钥对)具有唯一的密钥。 如果碰撞发生,即当一个新的条目与已经在集合中的条目具有相同的键时,则需要冲突处理。
通常,我们使用分离链处理冲突。 或线性探测 。
字典允许将多个条目链接到相同的密钥。
当一个Map实现了单独的链接时,它往往类似于一个Dictionary。
对于相同的概念,这是两个不同的术语。
Hashtable
和HashMap
也指的是相同的概念。