【发布时间】:2011-02-22 11:12:35
【问题描述】:
我知道映射是将键映射到值的数据结构。字典不一样吗?地图和字典有什么区别1?
1.我不是在问它们是如何用语言 X 或 Y 定义的(这似乎是人们在 SO 上通常所问的),我想知道它们在理论上有什么区别。
【问题讨论】:
标签: dictionary data-structures language-agnostic key-value
我知道映射是将键映射到值的数据结构。字典不一样吗?地图和字典有什么区别1?
1.我不是在问它们是如何用语言 X 或 Y 定义的(这似乎是人们在 SO 上通常所问的),我想知道它们在理论上有什么区别。
【问题讨论】:
标签: dictionary data-structures language-agnostic key-value
同一事物的两个术语:
“地图” 是正确的数学术语,但由于它在 functional programming 中具有单独的含义而被避免使用。
有些语言还使用其他术语(Javascript 中的“Object”,Ruby 中的“Hash”,Lua 中的“Table”),但这些在编程中也有不同的含义,所以我会避开他们。
请参阅here 了解更多信息。
【讨论】:
Dictionary 已过时。它是一个抽象类,在创建Map 接口之前使用。
一个是另一个的旧术语。通常在数学术语“地图”出现之前使用术语“字典”。此外,字典往往有一个键类型的字符串,但并非所有地方都 100% 正确。
【讨论】:
计算机科学术语摘要:
字典是表示一组元素的数据结构,具有插入、删除和成员资格测试;元素可能(但不一定)由不同的 key 和 value 部分组成
map 是一个 关联 数据结构,能够存储一组 键,每个键与一个相关联(或有时不止一个 - 例如 C++ 多图)value,仅在给定键的情况下,能够访问和擦除现有条目。 p>
回答这个问题很复杂,因为程序员已经看到在他们使用的特定语言或系统中赋予了更具体含义的术语,但这个问题要求“在理论上”进行与语言无关的比较,我的意思是 在计算科学术语中。
牛津大学计算机科学词典列出:
字典表示一组元素的任何数据结构,可以支持元素的插入和删除以及成员资格测试
map 的计算科学概念是基于数学语言术语 mapping,牛津词典将其定义为:
映射一种将给定集合(域)的每个元素与第二个集合(范围)的一个或多个元素相关联的操作。
因此,使用上面严格的 Comp Sci 术语,如果接口恰好支持并非每个字典都需要的附加操作,则字典只是一个映射:
能够存储具有不同 key 和 value 组件的元素
能够检索和擦除仅给定键的值
一个微不足道的转折:
⚠ 尽管如此,如果您在上面解释的严格的计算科学含义中使用 dictionary,请不要期望您的听众最初会关注您,或者在您分享和捍卫术语时留下深刻印象.这个问题的其他答案(以及他们的赞成票)表明,在大多数程序员的经验中,“dictionary”与“map” 同义的可能性有多大。尝试选择更广泛、更明确的术语:例如
map、multimap、unordered_map、unordered_multimap
set、multiset、unordered_set、unordered_multiset
std::find,您可以擦除元素并测试array、vector、list、deque 等中的成员资格,但容器接口不直接支持,因为发现一个元素在 O(N) 时效率非常低,在某些情况下插入/擦除效率低下,并且支持这些操作会破坏容器所暗示的故意限制的 API - 例如deques 应该只支持前后擦除/弹出,而不是某些键。不得不在代码中做更多的工作来编排搜索,这会温和地鼓励程序员切换到具有更高效搜索的容器数据结构。...以后可能会添加其他语言/随时编辑...
【讨论】:
我的 2 美分。
Dictionary 在 Java 中是一个抽象类,而 Map 是一个接口。由于 Java 不支持多重继承,如果一个类扩展了 Dictionary,它就不能扩展任何其他类。
因此,引入了 Map 接口。
字典类已过时,首选使用地图。
【讨论】:
I am not asking for how they are defined in language X or Y。这个答案是 Java 特定的。
通常我假设一个映射是由一个哈希表支持的;它意味着一个无序的商店。 字典意味着有序的商店。
有一个基于树的字典,称为Trie。
在 Lisp 中,它可能如下所示:
(a (n (d t)) n d )
里面封装了几个字:
从顶部到叶子的遍历产生一个单词。
【讨论】:
Dictionary 是无序的。
std::map 是有序的,标准中没有规定它的实现,std::unordered_map 是在 c++11 中引入的,它是通过哈希实现的
std::map”,但请尝试使用其他任何东西。 AVL 树不起作用;它的插入成本不符合标准。哈希不起作用;哈希是无序的,因此不符合标准。该标准几乎没有明确说明“你应该使用红黑树来实现std::map”。
其实不是一回事。地图是字典的子集。字典被定义为here 具有插入、删除和查找功能。 Java 使用的 Map(根据this)是一个字典,要求键映射到值被严格映射为一对一的函数。字典可能有多个键映射到一个值,或者一个键映射到多个值(如在哈希表中链接),例如 Twitter 主题标签搜索。
作为一个更“真实世界”的例子,在字典中查找一个单词可以为我们提供同一个单词的多个定义,当我们找到一个条目将我们指向另一个条目(参见另一个词)时,相同定义列表的单词数。在现实世界中,地图要广泛得多,允许我们有名称的位置或坐标的名称,但我们也可以找到最近的邻居或其他属性(人口等),所以恕我直言,可能有更大的扩展map 类型可能具有基于图形的实现,但最好始终只假设键值对,特别是因为最近的邻居和值的其他属性都可能只是值的数据成员。
尽管有一对一的要求,但如果值被概括为集合本身,或者如果值只是对存储在其他地方的集合的引用,则 java 映射可以实现更像通用字典的东西。
请记住,Java 维护者不是 ADT 定义的维护者,Java 决策专门针对 Java。
【讨论】:
这个概念的其他相当常见的术语:关联数组和哈希。
【讨论】:
是的,它们是相同的,您可以添加“关联数组”。
使用Hashtable 或Hash 通常指的是实现。
【讨论】:
这是同一个概念的两个不同术语。Hashtable 和 HashMap 也指同一个概念。
【讨论】:
在纯理论层面上。
字典是可用于定位链接值的值。 地图是一个值,它提供有关如何定位其他值的说明
所有允许非线性访问(即只获取第一个或最后一个)的集合都是一个映射,因为即使是一个简单的数组也有一个映射到正确值的索引。因此,虽然 Dictionary 是一种地图类型,但地图的可能功能范围要广得多。
实际上,它通常是定义名称的映射函数,因此 HashMap 是一种映射数据结构,它使用哈希算法将键链接到值,而字典没有指定键的链接方式到一个值,因此可以通过链表、树或任何其他算法存储。从使用端来看,您通常并不关心算法只知道它们的工作原理,因此您使用通用字典,并且仅在您需要执行算法类型时才转移到其他结构之一
【讨论】:
主要区别在于 Map 要求所有条目(值和键对)都具有唯一键。如果发生冲突,即当新条目与集合中已有的条目具有相同的键时,则需要进行冲突处理。
通常,我们使用分离链来处理冲突。或线性探测。
字典允许将多个条目链接到同一个键。
当地图实现了分离链时,它往往类似于字典。
【讨论】:
我现在在数据结构类中,我的理解是 dict() 数据类型也可以初始化为字典 = {} 或键和值,与列表/数组的方式基本相同数据类型用于实现堆栈和队列。因此,dict() 是类型,maps 是结果数据结构,您可以选择使用字典数据类型实现,就像您可以使用列表类型并选择使用它实现堆栈或队列数据结构一样。
【讨论】: