10月26号在看MIT算法导论的公开课,当天看完了前两节课,并于当晚写了总结。但不知道为什么,博客园并没有把我当时写的内容保留下来。所以现在,我重新温习下第一节第二节课的内容,并将其主要思想写在下面。
课程是以插入排序作为引言的,插入排序的主要思想是将下一个未知的数字与前面已经排序好的数列依次进行比较,当发现自己适合的位置时,就插入对应的位置(其具体的实现已经在另外一篇博客中实现)。分析表明,插入排序的时间复杂度为O(n2)。
然后老师提供了另外的一种排序方法——归并排序。归并排序算法的时间复杂度是O(nlgn)(具体实现待会写在博客里面),老师由归并排序引出了递归的思想,并引出了递归树(recurrence tree)的概念。
现证明T(n)=4T(n/2)+n=O(n2)
假设存在常数a,b,对于任意的k<n,有T(k)<an2-bn,也就是说:
T(n)=4T(n/2)+n
=4*[a(n/2)2-b*n/2]+n
=a*n2-bn+(1-b)n
所以当b>1时,有T(n)<an2-bn。(当然,要注意因为当n=1时,要保证a-b>T(1)成立,即要a>b+T(1))。
Master Method:有递归表达式T(n)=aT(n/b)+f(n)
(1)当f(n)=O(nlogba/nε)时,会有T(n)=Θ(nlogba)。
(2)当f(n)=Θ(nlogba*(lgn)k),则有T(n)=Θ[nlogba*(lgn)k+1]
(3)当f(n)=Ω(nlogba*nε)&af(n/b)<(1-ε')f(n),则有T(n)=Θ(f(n))。
由这个主定理可以推断出很多东西,比如mergesort T(n)=2T(n/2)+Θ(n) 则 T(n)=Θ(nlgn)。