|
发表于 2016-7-9 05:27:00
|
显示全部楼层
ElementType DeleteMin( PriorityQueue H ){ int i, Child; ElementType MinElement, LastElement; if( IsEmpty( H ) ) { printf( "Queue is empty.\n" ); return H->Elements[0]; } MinElement = H->Elements[1]; LastElement = H->Elements[H->Size--]; for( i = 1; i*2 Size; i = Child ) { /* Find smaller child. */ Child = i*2; if( Child != H->Size && H->Elements[Child+1] Elements[Child] ) Child++; /* Percolate one level. */ if( LastElement > H->Elements[Child] ) H->Elements[i] = H->Elements[Child]; else break; } H->Elements[i] = LastElement; return MinElement;}
7.算法设计的分析技术
算法是对问题求解过程的准确描述,由有限条指令组成,这些指令能在有限时间内执行完毕并产生确定性的输出。
进行算法的时间复杂度分析,就是求其T(n),并用O、Ω或是Θ以尽可能简单的形式进行表示。
理想情况下,希望能够使用Θ表示算法的时间复杂性。退而求其次,可以使用O或是Ω。
使用O时,希望估计的上界的阶越小越好。
使用Ω时,希望估计的下界的阶越大越好。
树的高度为ëlognû,所以将一个元素插入大小为n的堆所需要的时间是O(logn).
delete(H,i) 所需要的时间是O(logn).
make-heap(A): 从数组A创建堆
方法1:从一个空堆开始,逐步插入A中的每个元素,直到A中所有元素都被转移到堆中。
时间复杂度为O(nlogn).
方法2:
MAKEHEAP(创建堆)
输入:数组A[1…n]
输出:将A[1…n]转换成堆
1. fori← ën/2û downto 1
2. Sift-down(A,i){使以A[i]为根节点的子树调整成为堆,故调用down过程}
3. endfor
时间复杂度为O(n). |
|