建立heap的复杂度和图的定长路径数量证明

建立heap的复杂度和图的定长路径数量证明

一.建立堆的复杂度证明

建立堆采用自下而上逐渐调整的方法,伪代码:
建立heap的复杂度和图的定长路径数量证明
考虑最大的交换次数:
设元素个数为n=2h1n=2^h-1,其中h是树高。一个第i层的元素最多向下走h-i步。所以最大交换总次数是T=i=0h12i(h(i+1))=hi=0h12ii=0h12i(i+1)T=\sum_{i=0}^{h-1}2^i(h-(i+1))=h\sum_{i=0}^{h-1}2^i - \sum_{i=0}^{h-1}2^i(i +1)
前一项是个等比数列和,结果是hnhn
后面那个把2看为自变量可以变成f(x)=i=0h1xi+1 f(x)=\sum_{i=0}^{h-1}x^{i+1}在x=2时的导数。结果是(h1)2h+1(h-1)2^h+1;
两者相减即可得T=2hh1=nhT=2^h-h-1=n-h
每一步时间时常数级别,所以时间复杂度O(n)。

二. 定长路径的条数证明

用数学归纳法即可。
设A为邻接矩阵,An[i,j]A^{n}[i,j]表示ij之间长度为n的路径条数。要证明An+1[i,j]A^{n+1}[i,j]表示ij之间路径长为n+1的路径条数。
An+1[i,j]=k=1k=nAn[i,k]A[k,j]A^{n+1}[i,j]=\sum_{k=1}^{k=n}A^n[i,k]*A[k,j]
长度为n+1的可以按路径上第n个节点分类,有n类。第n个节点为k的条数根据乘法原理就是An[i,k]A[k,j]A^n[i,k]*A[k,j],在根据加法原理把所有n类加起来就是上面的式子。所以An+1[i,j]A^{n+1}[i,j]表示ij之间路径长为n+1的路径条数。