【问题标题】:Are there any interesting algorithms using both a stack and queue (deque) ADT?是否有任何有趣的算法同时使用堆栈和队列(deque)ADT?
【发布时间】:2011-07-14 07:33:01
【问题描述】:

我们在算法中经常使用栈或者队列,但是有没有使用双向链表来实现算法中栈和队列的情况呢?例如,在一个阶段,我们将 6 个项目 push() 到堆栈上,pop() 2 个项目,然后从双向链表的尾部 dequeue() 其余项目 (4)。我正在寻找的是在这种方法中实现某些东西的晦涩有趣的算法,甚至是更奇怪的算法。伪代码、链接和解释会很好。

【问题讨论】:

  • +1 我不知道有什么想法。我很想看看人们想出了什么。

标签: c algorithm data-structures stack queue


【解决方案1】:

这个结构叫做双端队列,它是一个队列,元素可以从头部或尾部添加或删除。在1 上查看更多信息。

【讨论】:

  • 谢谢!我完全忘记了它的名字,尽管我已经读过好几遍了。除了实现出队的 A-Steal 之外,您还知道哪些算法?
  • @malfy 我现在不记得具体的名字了,但是你需要一个优先级机制,第一个元素(头部)具有最高优先级。
【解决方案2】:

Melkman 算法 (用于在线性时间内计算简单多边形链的凸包)使用双端队列(又名deque) 为已处理的顶点存储增量外壳。

Input: a simple polyline W with n vertices V[i]

    Put first 3 vertices onto deque D so that:
    a) 3rd vertex V[2] is at bottom and top of D
    b) on D they form a counterclockwise (ccw) triangle

    While there are more polyline vertices of W to process
    Get the next vertex V[i]
    {
        Note that:
        a) D is the convex hull of already processed vertices
        b) D[bot] = D[top] = the last vertex added to D

        // Test if V[i] is inside D (as a polygon)
        If V[i] is left of D[bot]D[bot+1] and D[top-1]D[top]
            Skip V[i] and Continue with the next vertex

        // Get the tangent to the bottom
        While V[i] is right of D[bot]D[bot+1]
            Remove D[bot] from the bottom of D
        Insert V[i] at the bottom of D

        // Get the tangent to the top
        While V[i] is right of D[top-1]D[top]
            Pop D[top] from the top of D
        Push V[i] onto the top of D
    }

    Output: D = the ccw convex hull of W.

来源:http://softsurfer.com/Archive/algorithm_0203/algorithm_0203.htm

乔·米切尔:Melkman’s Convex Hull Algorithm (PDF)

【讨论】:

  • 感谢有趣的算法。
  • 很高兴对您有帮助/感兴趣 :)
【解决方案3】:

我们可以修改广度优先搜索(通常用于在具有 1 权重边的图中查找最短路径)以处理 0-1 图(即边权重为 0 和 1 的图)。我们可以这样做:当我们使用 1-edge 时,我们将顶点添加到后面,而当我们使用 0-edge 时,我们将顶点添加到 begin。

【讨论】:

    【解决方案4】:

    我不确定这是否符合条件,但您可以使用双端 优先级 队列将快速排序应用于太大而无法放入内存的文件。这个想法是,在常规快速排序中,您选择一个元素作为枢轴,然后将元素分成三组 - 小于枢轴的元素,等于枢轴的元素,以及大于枢轴的元素。如果您不能一次将所有项目都放入内存,则可以按如下方式调整此解决方案。与其选择单个元素作为枢轴,不如选择大量元素(例如,尽可能多地放入 RAM 中)并将它们插入到双端优先级队列中。然后,一次一个地扫描其余元素。如果元素小于双端优先级队列的最小元素,则将其放入小于所有枢轴的元素组中。如果它大于优先级队列的最大元素,则将其放入一组大于枢轴的元素中。否则,将元素插入双端优先级队列,然后从队列中踢出最小或最大元素并将其放入适当的组中。完成此操作后,您将元素分成三部分 - 一组可以递归排序的小元素,中间的一组元素现在完全排序(因为如果你将它们全部出列从双端优先级队列中将它们按排序顺序提取),以及一组大于中间元素的元素也可以排序。

    有关此算法和一般双端优先级队列的更多信息,请考虑查看this link 以查看有关该主题的章节。

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 2011-12-18
      • 2012-05-02
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多