【发布时间】:2011-12-08 10:38:50
【问题描述】:
按升序对堆栈进行排序的最佳方法是什么?我遇到了这个面试问题,我遇到了一些问题,以寻求最佳和最有效的解决方案。
我能想到的方法有两种。
将堆栈的所有内容弹出并存储在一个数组中,然后将数组排序为
O(nLog n),然后将内容推回堆栈。不是最好的方法....递归实现堆栈以对其进行排序
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