【问题标题】:Hash map and ordered traversal哈希映射和有序遍历
【发布时间】:2012-11-25 01:59:58
【问题描述】:

我将在 C++ 中从头开始实现一个哈希映射作为一个全功能的抽象数据类型。特别是,我将为这个数据容器提供一个迭代器,它能够以识别键的升序遍历所有记录。这部分让我感到困惑,我不知道该怎么做。顺便说一句,通过散列功能,我决定对单向列表使用单独的链接。我想到的一个解决方案是制作另一个列表,该列表将以适当的顺序完全绑定所有元素,该功能将在插入过程本身期间得到保护。但在我看来,它会损害散列本身的许多好处,至少在插入方面;尤其是看看我的ADT的用途,遍历功能会比较少用。长话短说,我应该提供什么样的解决方案?请注意,我不能使用任何专门的库。

注意:

我知道什么是哈希映射,并且它的学术定义本质上是无序的。也许我应该换个说法,我要构建一个混合的、实用的 ADT,它基本上由一个哈希映射加上一些额外的轻量级模块组成,这些模块将提供迭代器功能,以便这样一个 ADT 的用户可以遍历不时按键的升序对记录进行计时。

【问题讨论】:

  • 如果遍历不会经常发生,只需按存储顺序复制表并在必要时对其进行排序。
  • 如果这是概念证明/学校作业,请参阅下面我的回答。如果这是一个现实问题,您需要重新考虑您的要求,因为它没有多大意义
  • @Hilikus 很高兴听到这听起来很奇怪,当我被告知要实施它时,我的反应也是如此。这确实是一项学校作业。
  • 我想不出一种方法可以同时保持结构中的顺序并且保持inserts 比地图快。 (如果插入不比地图快,那就用地图代替)

标签: c++ iterator hashmap abstract-data-type


【解决方案1】:

哈希映射本质上是无序的。这就是为什么它们在 c++ 中通常被命名为 unordered_map。哈希映射的迭代器将访问每个成员一次,但顺序未定义。

在实践中,您可能不会使用哈希映射,而是使用其他一些关联映射容器,例如红黑树。或者,如果更新很少,您将维护一个并行有序索引。或者,如果更新频繁但遍历很少,则按需生成排序索引。

【讨论】:

    【解决方案2】:

    Hashmaps 不是按性质排序的,因为重点是使用散列来知道将值存储在哪里。

    我可以看到这个可能工作的唯一方法(以性能和现实世界可用性为代价)是如果你保证散列总是增加,即散列是顺序的函数插入,它给出了有序的哈希值。不过,这只会处理非冲突哈希。您仍然需要以正确的顺序在存储桶中遍历您的列表,因此只需在插入时保持您的列表排序

    也许这行不通,这只是一个想法

    如果不是,唯一的另一种方法是将所有值存储在排序友好的结构中并从那里进行迭代。如果您在 hashmap 类中执行此操作,看起来您正在迭代 hashmap,但实际上并非如此。请记住,这种方法会使您在迭代时的内存需求翻倍

    让我们知道它是怎么回事,这是一个奇怪的要求

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多