Давайте определим f (m) как число операций задачи с размером m.«Проблема» - это, конечно, возведение в степень (пау), как x^n
или pow(x,n)
.Функция long pow( long x, int n ) {
не должна выполнять больше или меньше работы, если я изменяю x.Таким образом, размер возведения в степень не зависит от x.Это, однако, зависит от п.Скажем, 2 ^ 4 имеет размер 4, а 3 ^ 120 имеет размер 120. (Имеет смысл, если вы видите, что 2^4=2*2*2*2
и 3^120=3*3*3*3*..*3
) Таким образом, размер проблемы равен n
, второму параметру.Мы могли бы, если хотите, сказать, что размер проблемы равен 2 * log (n), но это было бы глупо.
Теперь у нас есть f (m) - число операций для вычисления pow(x,m)
для любогоИкс.Потому что pow(x,m)
это как раз проблема с размером m. Итак, если у нас есть pow(x,y)
, то количество операций по определению равно f(y)
. Например, pow(3,3*m/2)
имеет f(3*m/2)
операций.
Наконец, давайте посчитаемоперации
long pow( long x, int n ) {
if (n == 0) //1
return 1;
if (n == 1) //1
return x;
if(isEven(n)) //1
return pow(x, n / 2 ) * //that is f(n/2), y=n / 2
pow(x, n / 2); //also f(n/2)
else
return x * pow(x * x, n / 2); //1+1+f(n/2)
}
Принимая это вместе: f(n) = 2*f(n/2) + c1
(n четное) и f(n) = f(n/2) + c2
(n четное).Если вас интересует только наихудший сценарий, обратите внимание, что в нечетном случае меньше работы.Таким образом, f (n) ограничено сверху четным случаем: f(n) <= 2*f(n/2)+c
.