美文网首页
【算法笔记】递归树应用实例:计算归并排序平均时间复杂度

【算法笔记】递归树应用实例:计算归并排序平均时间复杂度

作者: w8ed | 来源:发表于2019-03-23 23:13 被阅读0次

递归树

递归树是迭代的图形表示,可用于求解递推方程。


例1:利用递归树计算归并排序的平均时间复杂度。

归并排序伪代码:

MergeSort(A,p,r)
{
    if(p<r)
    {
        q = (p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r); //合并两个子数组
    }
    
}

根据以上的伪代码,可以写出归并排序的递推方程:
W(n) = 2W(n/2) + n-1
W(1) = 0
其中,2W(n/2)表示对2个子问题进行归并排序,n-1表示合并2个有序的子数组的工作量(需要进行n-1次比较)。

假设则递归树总共有k层, 则有n = 2^k

举例,假设k=3,也就是n=8,则递归树有3层。

  • 第一层,每个节点的工作量为8,求W(8),对2个长度为4的有序数组进行合并,需要8-1=7次比较。
  • 第二层,每个节点的工足量为4,求2个W(4),对2个长度为2的有序数组进行合并,各需要4-1=3次比较
  • 第三层,每个节点的工足量为2,求4个W(2),对2个长度为1的有序数组进行合并,各需要2-1=1次比较,毕竟2个数比大小,1次比较就够了。

回到一般情况,画出递归树:


上述递归树共有k层,将右侧的所有值相加,结合等比数列求和公式,得到:
\begin{aligned} W(n) &= (n-1) + (n-2) + (n-4) +...+ (n-2^{k-1})\\ &=kn - (1+2+4+...+2^{k-1})\\ &=kn-(2^k-1) \end{aligned}

因为n = 2^k,有
\begin{aligned} W(n) &= n\log_2n-n+1 \end{aligned}
所以,
T(n) = \Theta(n\log n)


参考资料:https://www.icourse163.org/course/PKU-1002525003

相关文章

  • 【算法笔记】递归树应用实例:计算归并排序平均时间复杂度

    递归树 递归树是迭代的图形表示,可用于求解递推方程。 例1:利用递归树计算归并排序的平均时间复杂度。 归并排序伪代...

  • 看图说话排序算法之归并排序

    归并排序和快速排序类似,都典型以递归方式实现的算法,归并排序的时间复杂度分析也和快速排序的时间复杂度分析类似。本文...

  • 归并排序

    归并排序是采用分治思想的算法应用 自上而下的递归 自下而上的迭代 空间复杂度为:O(nlogN) 0-归并排序动态...

  • 归并排序 merge sort

    归并排序 时间复杂度:平均、最好、最坏都是O(nlogn)空间复杂度:O(n)稳定性:稳定 算法解析 归并排序是使...

  • Rank

    快速排序不稳定算法。时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。 归并排序归并排序的时...

  • 常用排序算法

    排序 插入排序、冒泡排序、归并排序、快速排序,选择排序 算法的比较,需要从额外空间消耗,平均时间复杂度和最差时间复...

  • 排序:如何用快排的思想在O(n)内查找第k大的元素

    归并排序(分治) 代码实现 性能分析 是稳定算法吗 是稳定算法 时间复杂度 最好、最坏、平均时间复杂度都是O(nl...

  • 归并排序

    归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。时间复杂度是O(...

  • 归并排序的Java实现

    归并排序算法的原理如下: 归并排序的时间复杂度:,空间复杂度:,稳定性:稳定

  • [算法导论]归并排序

    时间复杂度 《算法导论》2.3.1 分治法。 归并排序采用了分治法的递归排序。分治法:分解子问题,解决子问题,合并...

网友评论

      本文标题:【算法笔记】递归树应用实例:计算归并排序平均时间复杂度

      本文链接:https://www.haomeiwen.com/subject/yvaevqtx.html