地图和字典的区别是什么?

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


< p > <子> 1. 我不是问它们在语言X或Y中是如何定义的(这似乎是人们在这里问的),我想知道它们在理论上有什么不同。 < / sub > < / p >
133546 次浏览
这是同一个概念的两个不同术语 HashtableHashMap也指的是同一个概念

一个是另一个的旧说法。通常,“字典”一词是在数学术语“地图”占主导地位之前使用的。此外,字典倾向于有键类型的字符串,但这并不是100%正确的。

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

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

有一个基于树的字典叫做单词查找树

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

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

这句话概括为:

  • 一个
  • 而且
  • 蚂蚁
  • 一个
  • 广告

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

同一事物的两个术语:

  • “Map"被Java、c++使用
  • “Dictionary"被.Net, Python使用
  • “联想array"被PHP使用

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

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

更多信息请参见在这里

是的,它们是一样的,你可以添加“关联数组”到混合。

使用HashtableHash ofter表示实现。

我的2分钱。

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

因此,引入了Map接口。

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

所以在纯理论层面上。

字典是一个可以用来定位链接值的值。 Map是一个值,它提供了关于如何定位其他值

的说明

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

在实践中,它通常是定义名称的映射函数,因此HashMap是一种使用哈希算法将键链接到值的映射数据结构,而Dictionary没有指定键如何链接到值,因此可以通过链表、树或任何其他算法存储。从使用端,你通常不关心算法是什么,只关心它们工作,所以你使用一个泛型字典,只在需要执行算法类型时才转移到其他结构之一

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

作为一个更“真实”的例子,在字典中查找一个单词可以为我们提供同一个单词的许多定义,当我们找到一个指向另一个条目(参见other word)的条目时,为相同的定义列表提供多个单词。在现实世界中,地图更广泛,让我们为坐标位置的名称或名称,但是我们也可以找到一个最近邻(人口等)或其他属性,所以IMHO可能有理由更大的扩张映射类型可能有基于图的实现,但最好是总是假设键-值对,尤其是最近的邻居和其他属性的值都可以是数据成员的值。

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

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

主要的区别是地图要求所有的条目(value &密钥对)具有唯一的密钥。如果发生冲突,即当一个新条目与集合中已经存在的条目具有相同的键时,则需要冲突处理。

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

字典允许将多个条目链接到同一个键。

当Map实现了独立链接时,它就趋向于字典。

计算机科学<强> < / >强术语总结:

  • < >强字典< / >强是表示一组元素的数据结构,包含插入、删除和成员关系测试;元素可以是,但不一定是由不同的关键价值部分组成

  • a <强> < /地图强大>是一个联想数据结构,能够存储一组,每个都与一个(或多个-例如c++ multimap) 价值相关联,具有访问擦除现有项的能力,只给出键。


讨论

回答这个问题很复杂,因为程序员在他们使用的特定语言或系统中看到了术语被赋予了更具体的含义,但这个问题要求“理论上”进行语言不可知的比较,我认为这意味着in Computing Science terms

术语解释

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

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

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

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

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

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

字典和地图对比

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

  • 存储具有不同关键价值组件的元素的能力

  • 能力检索擦除的值只给定键

一个小插曲:

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

与听众清晰地沟通

机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场机场这个问题的其他答案(以及他们的赞)表明在大多数程序员的经验中< >强“dictionary"将等同于"map"是多么有可能。试着选择更广泛和更容易理解的术语。

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

交叉引用Comp Sci术语与具体实现

c++标准库

  • 地图:mapmultimapunordered_mapunordered_multimap
  • 其他字典:setmultisetunordered_setunordered_multiset
  • 注意:使用迭代器或std::find,你可以擦除一个元素并测试其在arrayvectorlistarray0等中的成员关系,但容器接口不直接支持这一点,因为在O(N)中查找元素的效率非常低,在某些情况下插入/擦除效率也很低,支持这些操作破坏了容器所隐含的刻意限制API——例如,__abc4应该只支持前面和后面的擦除/弹出,而不支持某些键。必须在代码中做更多的工作来编排搜索,这温和地鼓励程序员切换到具有更有效搜索的容器数据结构。

...以后可以添加其他语言/可以随意编辑…

我现在在一个数据结构类中,我的理解是dict()数据类型也可以初始化为dictionary ={}或键和值,基本上与列表/数组数据类型用于实现堆栈和队列相同。因此,dict()是类型,映射是一个结果数据结构,您可以选择用字典数据类型实现,就像您可以使用列表类型并选择用它实现堆栈或队列数据结构一样。