当一个算法中含有对其自身的递归调用时,其运行时间可以用一个递归方程来表示。设T(n)为一个规模为n的问题的运行时间,我们认为当n小于某个常数cT(n)为一个常量O(1),假设我们把原问题分解为a个子问题,每一个子问题的大小是原问题的1/b(有时a不等于b),且ab为常数,分解问题与合并问题所需时间分别为D(n)C(n),则得到递归式:

T(n) = O(1) {n <= c }

T(n) = a*T(n/b) + D(n) + C(n) {n > c }

 

f(n) = D(n) + C(n),且n>=0

T(n) = a*T(n/b) + f(n) {n > c }

 

根据三种不同的情况,这时T(n)可能等于:

情况一:若存在某常数s > 0,有 f(n) = O( n ^ (log_b_a -s) ),则 T(n) = O( n ^ (log_b_a) ) [注:log_b_a 指以b为底的a的对数]

 

情况二:若 f(n) = O(n ^ (log_b_a) ),则T(n) = O(n ^ (log_b_a) * lg_n ) [注:lg_n 指以2为底的n的对数]

 

情况三:若存在常数s > 0、d < 1,有 f(n) = B( n ^ (log_b_a + s) ),且对所有足够大的n a*f(n/b) <= d*f(n) ,则T(n) = O( f(n) ) [注:我们用B()来表示渐近下界]

posted on 2008-08-22 09:27  刘永辉  阅读(457)  评论(0编辑  收藏  举报