【问题标题】:Custom Data Structure for Push, Pop and Dequeue operations in Constant Time用于在恒定时间内推送、弹出和出列操作的自定义数据结构
【发布时间】:2012-12-23 08:21:12
【问题描述】:

我在一次采访中问过这个问题。复制它。

编写自定义 DS,其中 Push()、Pop() 和 Dequeue() 操作将在恒定时间内完成。 例如输入是 1,2,3,4 然后我们调用 pop(),应该返回 4。如果我们调用 dequeue,应该返回 1。一切都在 O(1) 中。

我已经回答了,但不确定这是否是最好的 w.r.t.空间复杂度。

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

    doubly Linked List可以提供。

    通过同时指向头部和尾部的指针,您可以有效地实现dequeue()pop() (O(1))。

    类似于以下内容:(假设垃圾收集语言和简化版本,不是 null/empty safe):

    push(e):
      n = new Node(e)
      last.next = n
      n.previous = last
      last = n       
    pop():
      e = last.value
      last.previous.next = null
      last = last.previous
      return e
    dequeue():
      e = head.value
      head = head.next
      head.previous = null
      return e
    

    关于空间复杂度:
    解决方案是Theta(n) 空间,很容易看出任何亚线性解决方案都无法存储所有数据 - 并且在某些情况下会失败。

    【讨论】:

    • 这正是我的回答。寻找更好的解决方案,如果有的话。
    • @VallabhPatade xor 链表?
    • @amit:你不认为你应该在 pop() 例程中更新 last=last.previous 吗?
    • @amit :我也是,想不出比这更有效的解决方案。让我们假设这是这个问题可以有的最佳解决方案。
    • @VallabhPatade:您也许可以使用动态循环数组。您可以确定space <= 2 * n * sizeof(element) + CONST,但它会使空间复杂度O(1) 摊销而不是最坏的情况。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2012-02-19
    • 2013-07-23
    • 2012-07-02
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多