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

递归树

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


例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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,979评论 0 13
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,222评论 0 52
  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 907评论 0 6
  • 归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题。 归并排序 归并排序的核心...
    被吹落的风阅读 1,353评论 0 3
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 2,555评论 0 40