当一个算法中含有对其自身的递归调用时,其运行时间可以用一个递归方程来表示。设T(n)为一个规模为n的问题的运行时间,我们认为当n小于某个常数c时T(n)为一个常量O(1),假设我们把原问题分解为a个子问题,每一个子问题的大小是原问题的1/b(有时a不等于b),且a、b为常数,分解问题与合并问题所需时间分别为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()来表示渐近下界]