Answers:
关于同一件事的两个术语:
“映射”是正确的数学术语,但是避免使用它,因为它在函数式编程中具有单独的含义。
某些语言还使用其他术语(Javascript中的“ Object”,Ruby中的“ Hash”,Lua中的“ Table”),但是它们在编程中也都具有单独的含义,因此我避免使用它们。
有关更多信息,请参见此处。
Dictionary
在Java中已过时。这是一个抽象类,在Map
创建接口之前使用。
程序员已经在使用的特定语言或系统中看到了赋予特定含义的特定术语,回答这个问题变得很复杂,但是这个问题要求“在理论上”与语言无关的比较,这是我在计算科学术语中的意思。。
牛津大学计算机科学词典列出:
字典表示一组元素的任何数据结构,这些数据结构可以支持元素的插入和删除以及成员资格测试
地图的计算科学概念虽然基于数学语言术语映射,但《牛津词典》将其定义为:
映射将给定集合(域)的每个元素与第二个集合(范围)的一个或多个元素相关联的操作。
因此,使用上面严格的Comp Sci术语,如果接口恰好支持每个字典不需要的其他操作,则字典仅是映射:
存储具有不同键和值组成部分的元素的能力
仅给出键即可检索值的能力
小变化:
⚠尽管有上述所有内容,但是如果您按照上述严格的计算机科学的含义使用词典,请不要期望您的听众最初跟随您,也不要指望您分享和捍卫术语时会留下深刻的印象。该问题的其他答案(及其投票)表明,在大多数程序员的经验中,“词典”与“地图”同义的可能性有多大。尝试选择将被更广泛和明确理解的术语:例如
map
,multimap
,unordered_map
,unordered_multimap
set
,multiset
,unordered_set
,unordered_multiset
std::find
您可以在擦除元素和测试的会员array
,vector
,list
,deque
等,但容器接口不直接支持,因为找到一个元素是O(N)壮观低效,在某些情况下,插入/擦除效率低下,并且支持这些操作会破坏容器所暗示的故意有限的API-例如,deque
s仅应支持正面和背面的擦除/弹出操作,而不是某些键的支持。必须在代码中做更多的工作来温和地组织搜索,这鼓励程序员使用更有效的搜索切换到容器数据结构。...以后可能会添加其他语言/随时可以在...中进行编辑...
通常,我假设地图由哈希表支持;它表示无序存储。词典表示预定的商店。
有一个称为Trie的基于树的字典。
在Lisp中,它可能看起来像这样:
(a (n (d t)) n d )
其中包含以下单词:
从顶部到叶子的遍历产生一个单词。
Dictionary
在.Net中是无序的。
std::map
命令其标准中未指定std::unordered_map
其实现,它是在c ++ 11中引入的,它是通过哈希实现的
std::map
”,但是请尝试使用其他任何东西。AVL树不起作用;它的插入费用不符合标准。散列将不起作用;哈希是无序的,因此不符合标准。该标准几乎没有说“您应使用红黑树来实现std::map
”。
其实不一样。地图是词典的子集。字典在这里定义为具有插入,删除和查找功能。Java使用的Map(根据this)是一个字典,要求将映射到值的键严格映射为一对一函数。一本字典可能有多个键映射到一个值,或一个键映射到多个值(例如,在hasthtable中的链接),例如Twitter主题标签搜索。
作为一个更“现实世界”的示例,在字典中查找一个单词可以为我们提供相同单词的多个定义,并且当我们找到一个将我们指向另一个条目的条目(请参见另一个单词)时,就会有多个单词对于相同的定义列表。在现实世界中,地图范围更广,可以让我们找到名称的位置或坐标的名称,但是我们也可以找到最近的邻居或其他属性(人口等),因此恕我直言,有人可能会主张扩大映射类型可能具有基于图的实现,但是最好始终仅假设键值对,尤其是因为距离值最近的邻居和其他属性都可能只是该值的数据成员。
尽管一对一的要求,但java映射可以实现更类似于广义字典的功能,如果该值被概括为一个集合本身,或者该值仅是对存储在其他位置的集合的引用。
请记住,Java维护者不是ADT定义的维护者,并且Java决策专门针对Java。
此概念的其他相当普遍的术语:关联数组和哈希。
是的,它们是相同的,您可以在混合中添加“关联数组”。
使用Hashtable
或优惠是Hash
指实施。
因此在纯理论层面上。
字典是可用于查找链接值的值。映射是提供有关如何定位其他值的说明的值
所有允许非线性访问(即,仅第一个或最后一个)的集合都是一个Map,因为即使一个简单的Array都具有一个映射到正确值的索引。因此,虽然“字典”是地图的一种类型,但地图的可用功能范围更广。
在实践中,它通常是用于定义名称的映射函数,因此HashMap是一种映射的数据结构,该结构使用哈希算法将键链接到值,而在Dictionary中,它不指定键如何链接到值因此可以通过链表,树或任何其他算法进行存储。从使用端开始,您通常并不在乎仅使用哪种算法,因此您使用通用字典,并且仅在需要确定算法类型时才转移到其他结构之一
这是同一概念的两个不同术语。
Hashtable
并且HashMap
也指相同的概念。