【问题标题】:Sorting a Stack in Ascending Order?按升序对堆栈进行排序?
【发布时间】:2011-12-08 10:38:50
【问题描述】:

按升序对堆栈进行排序的最佳方法是什么?我遇到了这个面试问题,我遇到了一些问题,以寻求最佳和最有效的解决方案。

我能想到的方法有两种。

  1. 将堆栈的所有内容弹出并存储在一个数组中,然后将数组排序为
    O(nLog n),然后将内容推回堆栈。不是最好的方法....

  2. 递归实现堆栈以对其进行排序

void sort(stack)
{
    type x;

    if (!isEmpty(stack)) {
        x = pop(stack);
        sort(stack);
        insert(x, stack);
    }           
}

void insert(x, stack)
{
    type y;

    if (!isEmpty(stack) && top(stack) < x) {
        y = pop(stack);
        insert(x, stack);
        push(y, stack);
    } 
    else {
        push(x, stack);
    }
} 

但是第二种方法似乎进行了太多的递归调用,如果堆栈恰好很大,开销将是一个问题。

是否有可能以更好的方式解决这个问题以获得最佳的空间和时间复杂度?

有这么多递归调用,(重叠的子问题),这是dynamic programming 类型问题的竞争者吗?

解决此问题的最佳方法是什么? ?

【问题讨论】:

  • 为什么O(n*log n) 排序时间不是最优的?对于一般情况,这是经过验证的限制。
  • 你不能做得比O(n)空间和O(n log n)时间更好。弹出到数组中,排序和推送是最优的。
  • @avakar:得到第一个声明的证明(“不能比O(n) space 做得更好”)?
  • @aix,当然,只需将最小(或最大,我不确定堆栈中的哪个元素是第一个)值放在堆栈底部。您必须弹出该值,因为它位于错误的位置,此时,您必须将这些 n 值存储在某处,需要 O(n) 空间。
  • @Blastfurnace - 或者,这是一个很好的面试问题,正确答案是“如果你需要一个有序的容器,那么使用不同的数据结构。”

标签: c sorting stack dynamic-programming


【解决方案1】:

这是一个堆栈。除了最高价值,你什么也看不到。您必须至少弹出一次所有内容,并至少推送一次。第一种方法很好。

如果堆栈操作很昂贵,但您有时间期限,请在弹出时使用插入排序,并且您可以在最后一次弹出完成后立即推送。但你说这是在 C++ 中,所以我怀疑我们是否正在考虑这种情况。

【讨论】:

    【解决方案2】:

    您可以通过消除递归来解决。为此,您只需在堆栈下使用循环迭代直到它为空。

    例如伪代码:

    Linekd Stack stack = new List ();
    
    while stack is not empty then
    
         element <- stack removes peek
    
         / / Recursiong
         push new elements on stack
    
    end
    

    【讨论】:

    • 您可以使用迭代循环和堆栈数据结构来模拟递归。
    • 不一样吗?递归使函数调用在栈内存中进行,它的实现方式是一样的。
    • 在使用递归原生语言的时候,除了数据之外,还需要堆放很多东西,需要对上下文、函数指针等进行堆栈。如果使用堆栈数据结构,根据堆积的数据量,您将获得内存的最佳使用。
    【解决方案3】:

    这个问题的复杂度不能低于 O(n^2)。如需进一步参考,请参阅here

    【讨论】:

    • 请再次参考问题。 (1) 已经完成了。
    • "此算法的时间复杂度为 O(N^2)。"并不意味着 O(N^2) 是最优的,在这种情况下,如问题本身所述,在 O(N lg N) 中完成它是微不足道的!
    猜你喜欢
    • 2021-11-02
    • 2023-04-11
    • 1970-01-01
    • 2014-09-06
    • 2013-05-30
    • 2019-07-23
    • 2015-01-14
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多