我知道map是一种将键映射到值的数据结构。字典不也是这样吗?地图和字典的区别是什么?


1. 我不是问它们在语言X或Y中是如何定义的(这似乎是人们在这里问的),我想知道它们在理论上有什么不同。


当前回答

通常我假设映射是由哈希表支持的;它意味着一个无序的存储。 字典意味着有序的存储。

有一个基于树的字典叫做Trie。

在Lisp中,它可能是这样的:

(a (n (d t)) n d )

这句话概括为:

一个 而且 蚂蚁 一个 广告

从顶部到叶的遍历产生一个单词。

其他回答

这个概念的其他术语相当常见:关联数组和哈希。

同一事物的两个术语:

“Map”被Java、c++使用 "Dictionary"被。net, Python使用 “关联数组”是PHP使用的

“Map”是正确的数学术语,但我们避免使用它,因为它在函数式编程中有单独的含义。

有些语言还使用其他术语(Javascript中的“对象”,Ruby中的“散列”,Lua中的“表”),但这些在编程中也都有不同的含义,所以我会避免使用它们。

更多信息请看这里。

所以在纯理论层面上。

字典是一个可以用来定位链接值的值。 Map是一个值,它提供了如何定位另一个值的指令

所有允许非线性访问的集合(即只有get first或get last)都是Map,因为即使是简单的Array也有一个映射到正确值的索引。因此,虽然字典是地图的一种类型,但地图具有更广泛的功能。

In Practice a its usually the mapping function that defines the name, so a HashMap is a mapped data structure that uses a hashing algorithm to link the key to the value, where as a Dictionary doesn't specify how the keys are linked to a value so could be stored via a linked list, tree or any other algorithm. from the usage end you usually don't care what the algorithm only that they work so you use a generic dictionary and only shift to one of the other structures only when you need to enfore the type of algorithm

其实不是一回事。映射是字典的一个子集。Dictionary在这里定义为具有插入、删除和查找函数。Java使用的Map(根据本文)是一个字典,它要求键映射到值严格地映射为一对一的函数。一个字典可能有多个键映射到一个值,或者一个键映射到几个值(如hashtable中的链接),例如Twitter标签搜索。

As a more "real world" example, looking up a word in a dictionary can give us a number of definitions for the same word, and when we find an entry that points us to another entry (see other word), a number of words for the same list of definitions. In the real world, maps are much broader, allowing us to have locations for names or names for coordinates, but also we can find a nearest neighbor or other attributes (populations, etc), so IMHO there could be argument for a greater expansion of the map type to possibly have graph based implementations, but it would be best to always assume just the key-value pair, especially since nearest neighbor and other attributes to the value could all just be data members of the value.

尽管有一对一的要求,但如果值被泛化为集合本身,或者值仅仅是对存储在其他地方的集合的引用,则Java映射可以实现更类似于广义字典的东西。

请记住,Java维护者不是ADT定义的维护者,Java决策是专门针对Java的。

通常我假设映射是由哈希表支持的;它意味着一个无序的存储。 字典意味着有序的存储。

有一个基于树的字典叫做Trie。

在Lisp中,它可能是这样的:

(a (n (d t)) n d )

这句话概括为:

一个 而且 蚂蚁 一个 广告

从顶部到叶的遍历产生一个单词。