Algorithm 为什么堆栈的深度可以是O(lgn)在快速排序算法介绍书

Algorithm 为什么堆栈的深度可以是O(lgn)在快速排序算法介绍书,algorithm,quicksort,clrs,Algorithm,Quicksort,Clrs,现在我正在读算法简介,快速排序章节。据说尾部递归可以用于优化 QUICKSORT'(A, p, r) while p < r do ▸ Partition and sort left subarray. q ← PARTITION(A, p, r) QUICKSORT'(A, p, q - 1) p ← q + 1 快速排序(A、p、r) p

现在我正在读算法简介,快速排序章节。据说尾部递归可以用于优化

QUICKSORT'(A, p, r)
    while p < r
     do ▸ Partition and sort left subarray.
    q ← PARTITION(A, p, r)
    QUICKSORT'(A, p, q - 1)
    p ← q + 1
快速排序(A、p、r) p 但是,如果每次迭代的枢轴数为[1,n-1][n],则上述代码的堆栈深度将为O(n)

QUICKSORT (A, p, r )
    while p < r
        do Partition and sort the small subarray Þrst
        q ← PARTITION(A, p, r )
        if q − p < r − q
            then QUICKSORT (A, p, q − 1)
                    p ← q + 1
        else QUICKSORT (A, q + 1, r )
                    r ← q − 1
快速排序(A、p、r) p
我在上面的代码中理解的是,它将首先处理长度较小的子阵列。但为什么它可以简化为O(lgn)?如果每次轴仍然是[1,n-1][n],我认为它保持O(n)堆栈深度。

想想二叉树。任何二叉树

现在,在每个节点上,您选择使用较少的节点遍历子树,直到到达一片叶子

你走的路有多长?O(logn)?是吗


这里也是一样。

不要递归求解较大的部分。只需递归到较小的部分,并在当前级别上处理较大的部分。主要要实现的是尾部递归调用不会增加堆栈的深度。可能会重复,但如果我选择遍历更多节点,它也应该是o(logn),对不对>