【问题标题】:Data structure supporting O(1) remove/insert/findOldest?支持 O(1) 删除/插入/findOldest 的数据结构?
【发布时间】:2013-11-16 22:17:31
【问题描述】:

面试时问过这个问题:

提出并实现一种数据结构,该结构适用于来自最终和连续整数范围的整数数据。数据结构应支持O(1) 插入和删除操作以及findOldest(插入数据结构的最旧值)。

不允许重复(即如果某些值已经在里面 - 它不应该再次添加)

此外,如果需要,某些 init 可能会用于初始化。

我提出了一个解决方案,使用 1/0 的数组(大小作为范围大小)表示值在里面。它解决了插入/删除问题,需要O(range size)初始化。

但我不知道如何在给定的约束下实现findOldest

有什么想法吗?

附:不允许动态分配。

【问题讨论】:

  • 哈希表,其条目按插入顺序保持相互链接。可能会针对要存储的特定类型的数据进行优化;我只是选择了简单、通用的答案。
  • 我假设我们谈论的是一个类似集合的数据结构——即没有数据排序,在这种情况下哈希表是正确的。 ...或者它是有序的,但只插入+删除顶部,在这种情况下它是堆栈。或者是随机访问插入+删除,在这种情况下是不可能的(据我们所知)。

标签: algorithm data-structures


【解决方案1】:

如果我误解了您的问题,我深表歉意,但我的感觉是

  • 您正在考虑的值的范围是固定的(例如,[0, N))
  • 您需要支持不重复的插入和删除。
  • 您需要支持 findOldest。

一种选择是构建一个长度为 N 的数组,其中每个条目都存储一个布尔“活动”标志以及一个指针。此外,每个条目中都有一个双向链表单元格。直观地说,您正在构建一个位向量,其中包含一个链表,其中包含一个存储插入顺序的链表。

最初,所有位都设置为 false,并且指针都为 NULL。当您进行插入时,将相应单元格上的位设置为 true(如果已设置则立即返回),然后通过将此新单元格附加到它来更新元素的双向链接列表。这需要时间 O(1)。要执行findOldest 步骤,只需查询指向最旧元素的指针。最后,要执行删除步骤,清除相关元素上的位并将其从双向链表中删除,必要时更新头尾指针。

总而言之,所有操作都需要 O(1) 时间,并且不会执行动态分配,因为链表单元是作为数组的一部分预先分配的。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2011-06-17
    • 2015-05-22
    • 2011-01-10
    相关资源
    最近更新 更多