地图和字典有什么区别?

dev*_*ium 168 language-agnostic dictionary key-value data-structures

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


1.我不是在询问它们是如何在X或Y语言中定义的(这似乎是人们通常在这里提出的问题),我想知道它们在理论上的区别.

Blu*_*eft 236

同一件事的两个术语:

  • "Map"由Java,C++使用
  • "Dictionary"由.Net,Python使用
  • PHP使用"关联数组"

"Map"是正确的数学术语,但它被避免,因为它在函数式编程中具有独立的含义.

有些语言还使用其他术语(Javascript中的"Object",Ruby中的"Hash",Lua中的"Table"),但这些术语在编程中也有不同的含义,所以我会避免使用它们.

有关详细信息,请参见此处

  • @vivek_jonam:Java中的`Dictionary`已经过时了.它是一个抽象类,在创建`Map`接口之前使用. (28认同)
  • 我知道这个问题与语言无关,所以这是正确的答案,但我最终在这里寻找Java兼得的原因,所以这个评论对我来说真的是完美的. (6认同)
  • 是不是JAVA既有地图又有字典?那里的差异是什么? (5认同)
  • Javascript 现在也有一个“Map”数据结构(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) (3认同)

Edw*_*uck 20

一个是另一个较旧的术语.通常,在数学术语"地图"占据之前使用术语"字典".此外,字典往往有一个关键类型的字符串,但这并非在所有地方100%真实.


Ton*_*roy 13

计算机科学术语总结:

  • 一个字典是表示一组元素的数据结构,具有插入,缺失,和用于会员资格测试; 元素可能但不一定由不同的部分组成

  • 一个地图关联的数据结构能够存储一组密钥,各自与一个(或有时多于一个-例如,C ++多重映射)关联,具有的能力,以访问擦除只给出密钥现有条目。


讨论

程序员在他们使用的特定语言或系统中看到了具有更具体含义的术语,因此回答这个问题很复杂,但该问题要求“理论上”进行与语言无关的比较,我认为这是计算科学术语中的意思.

术语解释

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

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

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

计算机科学中的map概念基于数学语言术语mapping,牛津词典将其定义为:

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

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

字典和地图对比

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

  • 能够存储具有不同组件的元素

  • 仅给定密钥即可检索擦除值的能力

一个微不足道的转折:

  • map 接口可能不直接支持测试 {key,value} 对是否在容器中,这是对字典的迂腐要求,其中元素恰好是 {key,value} 对;地图甚至可能没有测试键的函数,但最坏的情况是您可以查看尝试的按键值检索是成功还是失败,然后如果您关心您可以检查您是否检索到了预期值。

明确地与您的听众沟通

? 尽管如此,如果您在上面解释的严格的计算科学含义中使用字典,请不要指望您的听众最初会跟随您,或者在您分享和捍卫术语时会留下深刻印象。这个问题的其他答案(以及他们的赞成票)表明,在大多数程序员的经验中,“字典”与“地图”同义的可能性有多大。尝试选择更广泛和更明确地理解的术语:例如

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

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

C++ 标准库

  • 地图:map, multimap, unordered_map,unordered_multimap
  • 其他词典:set, multiset, unordered_set,unordered_multiset
  • 注:迭代器或者std::find您可以在擦除元素和测试的会员arrayvectorlistdeque等,但容器接口不直接支持,因为找到一个元素是O(N)壮观低效,在某些情况下,插入/擦除低效,并且支持这些操作会破坏容器所暗示的故意限制的 API - 例如deques 应该只支持前后的擦除/弹出而不是某些键。必须在代码中做更多的工作来编排搜索,这会温和地鼓励程序员切换到具有更高效搜索的容器数据结构。

...稍后可能会添加其他语言/随时编辑...

  • @DavidBooth:我将首先解决你的最后一句话,指出没有特别要求讨论“传统自然语言词典”时的用法与计算科学中的用法相匹配。这使得你的句子的其余部分成为“牛津 CS 定义完全错误”,因为你不以这种方式使用或理解这个术语。很难令人信服。要合理地反驳这样的参考文献,您需要调查重要的计算机科学。教科书或演讲,看看这个术语在学术背景下是如何实际使用的——我希望牛津大学做了一项调查。 (3认同)
  • 牛津计算机科学的定义完全是错误的,因为根据该定义,“字典”仅仅是“集合”的同义词,而它显然不是。“字典”的显着特征是每个条目都有一个键(遵循设定语义)和一个关联的_值_。这对应于传统的自然语言词典,其中每个术语都有一个定义 (2认同)

Nis*_*hit 6

我的2美分。

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

因此,引入了Map接口。

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

  • 虽然这个答案是正确的,但问题发布者表示:“我并不是问它们在 X 或 Y 语言中是如何定义的”。这个答案是特定于 Java 的。 (2认同)