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