Давайте докажем немного более общее утверждение. Если сложность алгоритма такова:
t(0) = c
t(n) = a*t(n-1) + b
при условии a>1
сложность алгоритма O(a^n)
.
Давайте выберем k1 = c
, d = b/(a-1)
(этот выбор d
станет понятным в конце) и k2 = a + d
. Давайте предположим, что a > c
(в противном случае это были бы k1 = min(a,c)
, d= b/(max(a,c)-1)
и k2 = max(a,c) + d
, но мне лень писать все эти max
и min
). Мы хотим доказать, что
k1*a^n <= t(n) <= k2*a^n
но вот поворот, давайте докажем немного более строгую верхнюю границу:
k1*a^n <= t(n) <= k2*a^n - d
Базовый корпус :
c <= c <= (a + d) - d
очевидно верно
Шаг индукции :
Мы знаем, что
k1*a^n <= t(n) <= k2*a^n - d
верно и хочет доказать, что
k1*a^(n+1) <= t(n+1) <= k2*a^(n+1) - d
С левой стороны легко:
t(n+1) = a*t(n) + b >= a*t(n) >= a*(k1*a^n) = k1*a^(n+1)
Правая сторона немного сложнее
t(n+1) = a*t(n) + b <= a*(k2*a^n - d) + b = a*k2*a^n - a*b/(a-1) + b = k2*a^(n+1) - b/(a-1) = k2*a^(n+1) - d
Последний шаг верен, потому что
a*b/(a-1) - b = b*(a/(a-1) - 1) = b*(a - (a-1))/(a-1) = b/(a-1)
другими словами
a*d - b = d