我正在尝试向不熟悉编程的人解释Map(又名哈希表,dict)。虽然每个人都熟悉Array(=事物列表)和Set(=事物包)的概念,但我很难找到地图的真实世界隐喻(我对python {{1特别感兴趣)和Javascript dicts
)。经常使用的字典/电话簿类比不正确,因为字典是排序的,而地图不是 - 这一点对我来说很重要。
所以问题是:什么是现实世界现象或设备在计算中表现得像Map?
答案 0 :(得分:3)
我同意德尔南的观点,即人类的例子可能与物体的例子太接近了。如果您尝试过渡到解释如何在松散类型的语言中实现对象,那么这很有效,但是地图是Java和C#中存在的概念。如果他们开始使用这些语言,这可能会非常混乱。
基本上,您需要了解地图是依赖于一组唯一值作为键的即时查找。这两件事情真的需要强调,所以这里是一个体面但非常人为的例子:
让我们说你正在参加一个派对,每个人都应该带一件事。为了帮助组织者,每个人都说出他们的名字是什么以及他们带来了什么。现在让我们假装有两种方法来存储这些信息。第一种方法是将其放在列表中,第二种方法是告诉某人有一个教学内存。人为的部分是,他们只能通过你的名字来识别你(所以他是盲人并且有一个人工耳蜗,所以每个人听起来都像一个机器人,我能想出最好的)。
列表:要添加,您只需附加到列表底部即可。要退出,您只需从列表中删除自己。如果你想看看谁带来了什么以及他们带来了什么,那么你必须扫描整个列表,直到找到它们为止。如果你在扫描后没有找到它们,那么它们显然不在列表中而且没有带来任何东西。该列表显然允许具有相同名字的人的副本。
字典(做作的人):你没有追加到列表的末尾,你只要告诉他某人的名字和他们带来的东西。如果你想知道某人带给你什么,只需按姓名询问,他会立即告诉你。同样地,如果两个同名的人告诉他他们带来的东西,他会认为同一个人只是在改变他们带来的东西。如果有人没有注册,你会按名字询问,但他会感到困惑并问你在谈论什么。你也不得不说,当你告诉那个人不再带某些东西时,他会失去对它们的所有记忆,所以是非常做作的。
如果你不关心谁带来了什么,你可能还想表明为什么列表是足够的,但只需要知道所带来的是什么。甚至可能会将名字从列表中删除,以强调字典中的键/值对。
答案 1 :(得分:2)
第一次见面可能是人类的比喻:
每个人都有无序的属性,每个属性只能有1个值,这个值是唯一的(如hair=long
,eye_color=blue
)。你会发现这些属性没有特别的顺序。
因此,对于一个人,她可以拥有shoesize=38
,hair_color=brown
和eye_color=blue
,并且在向其他人背诵(human_dict.get('shoe_size')
)时,您会提到这些属性。订单除了属性名称。
答案 2 :(得分:1)
我见过大量人员根据他们识别号码的最后N位数进行分箱的情况,以节省关键搜索费用。这种分箱有点类似于散列,可能有助于解释它。
答案 3 :(得分:1)
您是否成功地以逻辑方式解释数组...该数组是一个存储元素保存在第一个位置的存储。第二个位置,第三个位置....第一个,第二个。第三个基本上是键......
现在扩展它说地图是存储,其中键不一定是数字..小子说它们是字符串......或者甚至是不连续或有任何关系的数字
反过来说在数组A(of int)中是索引1映射到A的地址,2到A + 4的地址等等的映射....
答案 4 :(得分:1)
在某些餐馆,当您在柜台下订单时,他们会给您一个号码来识别您的订单。数字:
数字的唯一想法是他们可以轻松找到您的订单。在map / hash table / associative array world中,数字将是键,您的顺序是值。
完成订单后,他们可以使用相同的号码进行其他订单。因此,该数字基本上是某个时间点的订单的标识符,这适合Javascript对象示例,其中对象的属性可以更改其值。