【问题标题】:time complexity for a sorting technique for stacks?堆栈排序技术的时间复杂度?
【发布时间】:2015-12-20 19:17:21
【问题描述】:

假设我有以下伪代码:

while A is not empty and stack top of A is less than x:
    pop A and push the returned value onto B
push x onto A
while B is not empty:
    pop B and push the returned valued onto A

假设堆栈 A 和 B 最初是空的。使用上述算法,每次插入 n 个数字和一个新数字 x,时间复杂度最差。

我能够得到这个算法会将长度为 n 的插入数字从最小(顶部)到最大(底部)排序,最好的情况是 n 当插入的数字已经排序时,从大到小。但我不明白最坏的情况是如何O(n^2)

【问题讨论】:

  • x 是从哪里来的。
  • 抱歉我遗漏了一些细节。 x是每次插入的数字。
  • 这是一种笨拙的(可能是正式形式的)插入排序。这就是众所周知的 O(n^2)

标签: algorithm sorting stack big-o time-complexity


【解决方案1】:

如您所见,此算法使用 2 个堆栈对项目集合进行排序。

在每一步,它都会从 A 中弹出项目,然后将其推入 B,直到找到正确的位置。然后它从 B 弹出并推回 A。

这意味着在步骤 n 处,最多有 2*(n-1)+1 个操作。

如果初始集合是反向排序的,每次插入都会发生这种情况,使得复杂度 O(N2)

【讨论】:

    【解决方案2】:

    插入 n 个元素而不进行排序将是 o(n)。由于每个排序是 o(n),所以总数是 O(n^2)。 最坏的情况:数字以相反的顺序显示。

    【讨论】:

      【解决方案3】:

      对于每次插入,最好的情况是当 StackTop[A]>x 时,它只会将 x 推入 A 并且 B 会为空。因此,在最佳情况下,每次插入的时间复杂度为 o(1)。所以对于 n 个元素 o(n)

      现在假设元素以递增的顺序插入,那么每次插入都会导致堆栈 A 被清空并放入 B。
      在此之后将 x 插入到 A 中,然后将堆栈 B 元素放入 A 弹出并一一推送。每次插入都需要 o(n)。所以对于 n 插入 o(n^2)。

      【讨论】:

        【解决方案4】:

        在最坏的情况下:
        让我们以输入 {1,2,3,4}
        step1:(x=1)
        为例 最初 A,B 是空的。所以通过算法A{1}B{}
        step2:(x=2)
        通过算法B={1}, A ={2} 然后A={1,2} B={}
        step3:(x=3)
        通过算法最初B={2,1}A={3}然后A={3,2,1}B={}
        step4:(x=4)
        通过算法最初B={1,2,3} A={4} 然后A={4,3,2,1} B={} 每个步骤的成本是(2*(n-1)),其中n 是输入的大小。
        所以如果我们总结最坏情况时间复杂度是 O(n^2)

        【讨论】:

          猜你喜欢
          • 2017-01-24
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          相关资源
          最近更新 更多