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