地图和字典有什么区别?


Answers:


258

关于同一件事的两个术语:

  • Java,C ++使用“地图”
  • .Net,Python使用“字典”
  • PHP使用“关联数组”

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

某些语言还使用其他术语(Javascript中的“ Object”,Ruby中的“ Hash”,Lua中的“ Table”),但是它们在编程中也都具有单独的含义,因此我避免使用它们。

有关更多信息,请参见此处


7
JAVA是否同时具有Map和Dictionary?有什么区别?
vivek_jonam

35
@vivek_jonam:Dictionary在Java中已过时。这是一个抽象类,在Map创建接口之前使用。
BlueRaja-Danny Pflughoeft 2012年

7
我知道这个问题与语言无关,所以这是正确的答案,但是我最终还是在这里寻找Java兼具两者的原因,因此此注释对于我而言确实是完美的选择。
2014年

1
lua中使用“表”。
Deduplicator 2015年

1
在JSON中(由于与JavaScript有关的历史原因),它也有些令人困惑地称为“对象”
2015年

20

一个是另一个的旧术语。通常,在使用数学术语“地图”之前先使用术语“字典”。同样,字典通常具有字符串的键类型,但是并不是到处都是100%正确的。


9

我的2美分。

字典是Java中的抽象类,而Map是接口。因为Java不支持多重继承,所以如果一个类扩展了Dictionary,它就不能扩展任何其他类。

因此,引入了Map接口。

字典类已过时,首选使用Map。


9

程序员已经在使用的特定语言或系统中看到了赋予特定含义的特定术语,回答这个问题变得很复杂,但是这个问题要求“在理论上”与语言无关的比较,这是我在计算科学术语中的意思

术语解释

牛津大学计算机科学词典列出:

字典表示一组元素的任何数据结构,这些数据结构可以支持元素的插入和删除以及成员资格测试

  • 例如,我们有一组可以插入并可以开始删除的元素{A,B,C,D ...},并且可以查询“是否存在C?”

地图的计算科学概念虽然基于数学语言术语映射,但《牛津词典》将其定义为:

映射将给定集合(域)的每个元素与第二个集合(范围)的一个或多个元素相关联的操作。

  • 这样,地图数据结构提供了一种从给定集合的元素(称为地图中的“ ”)到第二个集合中的一个或多个元素(称为关联的“ ”)的方式。
  • “在第二组...或多个元素”方面可以通过实现支持是两个不同的方法:
    • 许多地图实现都强制键的唯一性,并且只允许将每个键与一个值相关联,但是该值可能本身就是一种数据结构,其中包含许多较简单数据类型的值,例如{{1,{“ one” ,“ ichi”},{2,{“ two”,“ ni”}}}}说明了由成对的字符串组成的值。
    • 其他映射实现允许重复的键,每个键映射到相同或不同的值-在功能上满足“关联...每个[键]元素...具有[多于[一个] [值]个元素”的情况。例如,{{1,“ one”},{1,“ ichi”},{2,“ two”},{2,“ ni”}}。

字典和地图对比

因此,使用上面严格的Comp Sci术语,如果接口恰好支持每个字典不需要的其他操作,则字典仅是映射

  • 存储具有不同组成部分的元素的能力

  • 仅给出键即可检索值的能力

小变化:

  • 地图界面可能不直接支持对容器中是否有{key,value}对的测试,这在字典上是必需的,因为字典中元素恰巧是{key,value}对;映射甚至可能没有测试键的功能,但在最坏的情况下,您可以查看尝试按键检索值是成功还是失败,然后如果您在意,可以检查键是否检索了期望值。

与听众明确沟通

⚠尽管有上述所有内容,但是如果您按照上述严格的计算机科学的含义使用词典,请不要期望您的听众最初跟随您,也不要指望您分享和捍卫术语时会留下深刻的印象。该问题的其他答案(及其投票)表明,在大多数程序员的经验中,“词典”与“地图”同义的可能性有多大。尝试选择将被更广泛和明确理解的术语:例如

  • 关联容器:任何存储键/值对并进行值检索和键擦除的容器
  • 哈希图:关联容器的哈希表实现
  • 强制唯一键的哈希集:存储元素/值的字典的哈希表实现,而不将其视为包含不同的键/值分量,其中不能插入元素的重复项
  • 平衡二叉树图,支持重复键:...

将Comp Sci术语与特定实现交叉引用

C ++标准库

  • 地图:mapmultimapunordered_mapunordered_multimap
  • 其他字典:setmultisetunordered_setunordered_multiset
  • 注:迭代器或者std::find您可以在擦除元素和测试的会员arrayvectorlistdeque等,但容器接口不直接支持,因为找到一个元素是O(N)壮观低效,在某些情况下,插入/擦除效率低下,并且支持这些操作会破坏容器所暗示的故意有限的API-例如,deques仅应支持正面和背面的擦除/弹出操作,而不是某些键的支持。必须在代码中做更多的工作来温和地组织搜索,这鼓励程序员使用更有效的搜索切换到容器数据结构。

...以后可能会添加其他语言/随时可以在...中进行编辑...


3

通常,我假设地图由哈希表支持;它表示无序存储。词典表示预定的商店。

有一个称为Trie的基于树的字典。

在Lisp中,它可能看起来像这样:

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

其中包含以下单词:

  • 一个
  • 蚂蚁
  • 一个
  • 广告

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


4
Dictionary在.Net中是无序的。
BlueRaja-Danny Pflughoeft,2010年

2
可可词典也是无序的。
肯(Ken)

C ++ std::map命令其标准中未指定std::unordered_map其实现,它是在c ++ 11中引入的,它是通过哈希实现的
Harald Scheirich 2014年

3
@HaraldScheirich-尽管C ++标准没有具体说“您应该使用红黑树来实现std::map”,但是请尝试使用其他任何东西。AVL树不起作用;它的插入费用不符合标准。散列将不起作用;哈希是无序的,因此不符合标准。该标准几乎没有说“您应使用红黑树来实现std::map”。
David Hammen

+1。尽管在许多平台上字典都是无序的,但该词表示有序。我更喜欢术语地图。
nawfal 2015年

2

其实不一样。地图是词典的子集。字典在这里定义为具有插入,删除和查找功能。Java使用的Map(根据this)是一个字典,要求将映射到值的键严格映射为一对一函数。一本字典可能有多个键映射到一个值,或一个键映射到多个值(例如,在hasthtable中的链接),例如Twitter主题标签搜索。

作为一个更“现实世界”的示例,在字典中查找一个单词可以为我们提供相同单词的多个定义,并且当我们找到一个将我们指向另一个条目的条目(请参见另一个单词)时,就会有多个单词对于相同的定义列表。在现实世界中,地图范围更广,可以让我们找到名称的位置或坐标的名称,但是我们也可以找到最近的邻居或其他属性(人口等),因此恕我直言,有人可能会主张扩大映射类型可能具有基于图的实现,但是最好始终仅假设键值对,尤其是因为距离值最近的邻居和其他属性都可能只是该值的数据成员。

尽管一对一的要求,但java映射可以实现更类似于广义字典的功能,如果该值被概括为一个集合本身,或者该值仅是对存储在其他位置的集合的引用。

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


1

此概念的其他相当普遍的术语:关联数组和哈希。


1
哈希与此无关。这是一种快速检测对象是否不同的方法。您正在考虑使用散列来执行Map / Dictionary工作的散列图。
DJClayworth 2011年

5
@DJClayworth不,许多编程语言实际上称这些为哈希。参见Ruby。我没有设计它,我也不会这么称呼它,但不要射击信使。
汉克·盖伊


1

因此在纯理论层面上。

字典是可用于查找链接值的值。映射是提供有关如何定位其他值的说明的值

所有允许非线性访问(即,仅第一个或最后一个)的集合都是一个Map,因为即使一个简单的Array都具有一个映射到正确值的索引。因此,虽然“字典”是地图的一种类型,但地图的可用功能范围更广。

在实践中,它通常是用于定义名称的映射函数,因此HashMap是一种映射的数据结构,该结构使用哈希算法将键链接到值,而在Dictionary中,它不指定键如何链接到值因此可以通过链表,树或任何其他算法进行存储。从使用端开始,您通常并不在乎仅使用哪种算法,因此您使用通用字典,并且仅在需要确定算法类型时才转移到其他结构之一


-2

这是同一概念的两个不同术语。
Hashtable并且HashMap也指相同的概念。


3
实际上,Hashtable / Hashmap的名称暗示了一种特定的实现(例如,相对于平衡树,例如,在C ++ std :: map中使用了平衡树)。

通常,您无需关心实现。(出于性能的原因除外)此外,并非总是如此。以.Net为例。
SLaks 2010年

-2

主要区别在于Map要求所有条目(值和键对)都具有唯一键。如果发生冲突,即当新条目具有与集合中已有条目相同的键时,则需要进行冲突处理。

通常,我们使用“ 单独链接”来处理冲突。或线性探测

一个字典允许链接到同一个密钥的多个条目。

当地图实现了单独链接时,它往往类似于字典。

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.