def merge_sort(arr, p, r): if p < r: q = (p + r) // 2 merge_sort(arr, p, q) merge_sort(arr, q + 1, r) merge(arr, p, q, r)
递归式
如果 n=2k\displaystyle{ n = 2 ^{ k } }n=2k
举例
k=logn\displaystyle{ k = \log n }k=logn
其中,a⩾1,b>1\displaystyle{ a \geqslant 1 , b > 1 }a⩾1,b>1 是两个常数,f(n)\displaystyle{ f \left( n \right) }f(n) 是一个渐近非负函数
主定理
T(n)=2T(n/2)+10n\displaystyle{ T \left( n \right) = 2 T \left( n {/} 2 \right) + 10 n }T(n)=2T(n/2)+10n
f(n)=Θ(nclogkn),c=1,k=0\displaystyle{ f \left( n \right) = \Theta \left( n ^{ c } \log ^{ k } n \right) , c = 1 , k = 0 }f(n)=Θ(nclogkn),c=1,k=0
T(n)=Θ(nlogbalogk+1n)=Θ(n1log1n)=Θ(nlogn)\displaystyle{ T \left( n \right) = \Theta \left( n ^{ \log _{ b } a } \log ^{ k + 1 } n \right) = \Theta \left( n ^{ 1 } \log ^{ 1 } n \right) = \Theta \left( n \log n \right) }T(n)=Θ(nlogbalogk+1n)=Θ(n1log1n)=Θ(nlogn)
主定理的另一种形式
Bellman最优性原理:
动态规划的思想实质是分治思想和解决冗余,分支中有共同的部分被重复计算了很多次,动态规划将这部分结果保存,避免重复计算