现实世界中的映射(哈希表)

Maps (hashtables) in the real world

本文关键字:哈希表 映射 世界      更新时间:2023-09-26

我试图解释地图(又名哈希表,字典)的人谁是新的编程。虽然Array (=list of things)和Set (=bag of things)的概念对每个人来说都很熟悉,但我很难找到一个真实世界的地图比喻(我对python dicts和Javascript Objects特别感兴趣)。经常使用的字典/电话簿的类比是不正确的,因为字典是排序的,而map不是——这一点对我很重要。所以问题是:什么样的现实世界现象或设备在计算中表现得像Map ?

我同意delnan的观点,人类的例子可能太接近物体的例子了。如果你试图转换到解释对象是如何在松散类型语言中实现的,那么这个方法就很有效,然而映射这个概念也存在于Java和c#中。如果他们开始使用这些语言,这可能会非常令人困惑。

本质上,您需要理解映射是依赖于一组唯一值作为键的即时查找。这两件事确实需要强调,所以这里有一个体面但高度人为的例子:

假设你要开一个派对,每个人都应该带一样东西。为了帮助组织者,每个人都说出自己的名字和要带的东西。现在让我们假设有两种存储这些信息的方法。第一种方法是把它写在一张清单上,第二种方法是告诉一个有说教记忆的人。人为的部分是,他们只能通过你的名字来识别你(所以他是盲人,植入了人工耳蜗,所以每个人听起来都像机器人,这是我能想到的最好的)。

List:要添加,只需添加到列表的底部。你只要把自己从名单上除名就行了。如果你想知道谁带了东西,他们带了什么,那么你必须浏览整个名单,直到找到他们。如果扫描后没有找到他们,那么很明显他们不在名单上,没有带任何东西。这个名单显然允许名字相同的人重复出现。

字典(做作的人):你不用在名单后面加上,你只要告诉他某人的名字和他们带来的东西就行了。如果你想知道某人给你带来什么,只要问他的名字,他就会立刻告诉你。同样地,如果两个同名的人告诉他他们要带一样东西,他会认为是同一个人在改变他们要带的东西。如果有人没有注册,你可以问他的名字,但他会很困惑,问你在说什么。你还得说,当你告诉他某人不再带东西时,他会失去对他们的所有记忆,所以是的,高度人为的。

如果你不关心谁带来了什么,而只需要知道所有的东西,你可能还想说明为什么这个列表是足够的。甚至可以将名称从列表中删除,以便在字典中强调键/值对。

也许这将是一个人类的类比,你的第一次会议:

每个人都有一个无序数量的属性,每个属性只能有一个值,这个值是唯一的(如hair=long, eye_color=blue)。你会发现这些属性没有特定的顺序。

所以对于一个人来说,她可以有一个shoesize=38, hair_color=browneye_color=blue,当背诵(human_dict.get('shoe_size'))给别人时,你会提到属性,除了属性名称,没有特别的顺序。

我曾见过这样的情况:为了节省关键字搜索,根据他们的身份号码的最后N位数字对一个大列表进行分类。这种分组有点类似于散列,并且可能有助于解释它。

你是否成功地用逻辑方式解释了数组,数组是一个存储,其中元素保存在第一个位置。第二名,第三名....第一,第二名。第三基本上是键…

现在扩展它说映射是存储,其中键不一定是数字,我们说它们是字符串…或不连续或没有任何关系的偶数

反过来说,在数组A(int)是映射,其中索引1映射到A的地址,2映射到A + 4的地址,以此类推....

在一些餐馆,当你在柜台点餐时,他们会给你一个号码来标识你点的餐。数字:

  • 不需要排序
  • 不需要连续

数字的唯一含义是他们可以很容易地找到你的订单。在映射/哈希表/关联数组世界中,数字将是键,您的顺序将是值。

当你完成你的订单后,他们可以使用相同的号码为另一个订单。因此,数字基本上是在特定时间点的订单标识符,这将适合Javascript对象示例,其中对象的属性可以改变其值。