【问题标题】:Is there such a data-structure that combines queue and hashmap?有没有这样一种结合了队列和哈希图的数据结构?
【发布时间】:2017-01-02 16:50:46
【问题描述】:

有没有这种结合QueueHashmap的数据结构?

除了队列通常具有的 FIFO (enqueue/dequeue) 行为之外,我还想要

  • 入队时,始终使用key 入队,
  • 在没有键的情况下查看时,返回队列的头部
  • 使用键查看时,返回使用该键入队的第一个元素
  • 在没有键的情况下出队时,删除第一个入队的元素
  • 使用键出队时,删除所有具有该键的元素

我想知道这样的数据结构是否已经存在于野外?

【问题讨论】:

  • 有key的队列是优先队列。但键必须是不同且可排序的。
  • @miparnisari 感谢您的指出。虽然可订购/可排序的键不是我要寻找的属性

标签: data-structures


【解决方案1】:

不,没有。但是您可以将两者结合起来以实现您想要的行为(尽管您必须在此过程中做出权衡)。

为此,您将存储:

  • 一个 HashMap,其中的值是对队列中项目的引用:HashMap<Key, ReferenceToFIFOElement>HashMap<Key, Set<ReferenceToFIFOElement>>
  • 实际的 FIFO 队列:FIFO<Item>

入队时,首先将元素添加到队列的顶部。然后,如果密钥尚未注册,则使用对这个新创建元素的引用来更新 hashmap(或将所述引用添加到映射到 set case 中给定密钥的引用存储桶)。

窥视很容易:只需检索密钥并访问引用的项目(或设置案例中的第一个引用项目,如果没有提供密钥,则为顶部)。

出队是真正权衡的地方:

  • 如果您只在哈希图中存储对使用给定键插入的第一个项目的引用,那么您将不得不从所述项目开始遍历所有队列。 这意味着总体上更高的时间复杂度。
  • 如果您将所有对具有给定键的项目的引用存储在哈希图中(使用集合),那么您只需遍历该集合并从队列中删除引用的元素。 这增加了数据结构的空间复杂度

然而,实际上它可能更复杂,具体取决于您选择放置在 FIFO 底层的数据结构:

  • 数组列表:缓存友好,随机访问...但在插入/删除元素时可能需要重新分配。这会使引用无效 -> 存储索引而不是实际引用。
  • 链表:缓存不友好,但插入和删除保证为 O(1)。

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多