【问题标题】:Maps (hashtables) in the real world现实世界中的地图(哈希表)
【发布时间】:2013-05-11 06:47:44
【问题描述】:

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

【问题讨论】:

  • SortedMap 是用 Java 排序的,我猜 !!!!
  • 您使用地图的唯一原因是例如键值对的数组列表是因为查找速度快,这就是为什么您无法解释它的原因(它没有执行物理上不同的任务,它只是一种优化)。除非你讨论为什么地图存在,否则讨论地图是没有意义的。
  • 我刚刚意识到“字典/电话簿类比”作为现实世界的类比也没有意义!很高兴你问这个!

标签: javascript python data-structures map


【解决方案1】:

我见过一些案例,根据他们识别号的最后 N 位数字对大量人员进行分类,以节省关键搜索。这种分箱有点类似于散列,可能有助于解释它。

【讨论】:

    【解决方案2】:

    也许你第一次见面就像一个人:

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

    因此,对于一个人来说,她可以拥有shoesize=38hair_color=browneye_color=blue,并且在向其他人背诵 (human_dict.get('shoe_size')) 时,除了按属性名称外,您可以不按特定顺序提及这些属性。

    【讨论】:

    • -1 这更像是一条记录,其中键的集合是已知的并且(在某种程度上)恒定并且值是异构的。一旦人们了解到许多动态语言使用哈希表实现对象,人们就已经倾向于将地图和对象混为一谈,无需进一步加深这种混淆。
    【解决方案3】:

    您是否成功地以合乎逻辑的方式解释了数组...该数组是一种存储元素,其中元素保留在第一个位置。第二个位置,第三个位置....first,second.third 基本上是键...

    现在扩展它说地图是存储,其中键不一定是数字..可以说它们是字符串...甚至是不连续或不具有任何关系的数字

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

    【讨论】:

      【解决方案4】:

      在某些餐厅,当您在柜台点餐时,他们会给您一个编号来识别您的订单。数字:

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

      这些数字的唯一含义是他们可以轻松找到您的订单。在地图/哈希表/关联数组世界中,数字是键,您的订单是值。

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

      【讨论】:

        【解决方案5】:

        我同意 delnan 的观点,因为人类的例子可能与物体的例子太接近了。如果您试图过渡到解释对象是如何在松散类型的语言中实现的,这很有效,但是映射也是 Java 和 C# 中存在的一个概念。如果他们开始使用这些语言,这可能会非常令人困惑。

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

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

        列表:要添加,您只需附加到列表的底部。要退出,您只需将自己从列表中删除。如果您想查看谁带来了某些东西以及他们带来了什么,那么您必须扫描整个列表,直到找到他们。如果扫描后没有找到,那么很明显他们不在名单上,也没有带任何东西。该列表将清楚地允许具有相同名字的人重复。

        字典(做作的人):你不附加到列表的末尾,你只是告诉他某人的名字和他们带来了什么。如果你想知道某人带来了什么,只要问名字,他就会立即告诉你。同样,如果两个同名的人告诉他他们要带东西,他会认为是同一个人只是改变了他们要带的东西。如果有人没有注册,你会问名字,但他会很困惑,问你在说什么。此外,当你告诉那个人某人不再带来某样东西时,你不得不说他会失去对他们的所有记忆,所以是的,非常做作。

        如果您不关心谁带来了什么,而只需要知道所有带来了什么,那么您可能还想说明为什么这份清单就足够了。甚至可以将名称从列表中删除,以使用字典强调键/值对。

        【讨论】:

        • 这很有意义。感谢您的回答,欢迎来到 StackOverflow!
        猜你喜欢
        • 1970-01-01
        • 2012-06-03
        • 2012-10-30
        • 2016-03-25
        • 2018-01-25
        • 2011-10-14
        • 2011-09-15
        • 1970-01-01
        相关资源
        最近更新 更多