На этом шаге мы рассмотрим преобразования дробных аргументов рекурсивной функции.
Общий метод вывода формулы для рекуррентных соотношений применим лишь тогда, когда аргументы их T-членов представляют собой разности вида n - b, где b - некоторая целочисленная константа. Однако в отдельных случаях эту задачу можно решить, когда аргументы T-членов представляют собой дроби вида n/b, где b - некоторая целочисленная константа. Ключевая идея здесь заключается в предположении, что n - это степень b, и последующем преобразовании дроби в разность путём замены n = bk.
Рассмотрим рекуррентное соотношение (3.30) с рекурсивным условием
T(n) = 2T(n/2) + 1,
T(2k) = 2T(2k/2) + 1 = 2T(2k-1) + 1.
В этом новом определении T(2k) есть функция k. Поэтому её можно заменить на t(k) следующим образом:
t(k) = 2t(k - 1) + 1,
t(k) - 2t(k - 1) = 1 * 1n
(x - 2)(x - 1).
Тогда сама функция должна иметь следующий вид:
t(k) = С1 + С22k . (3.43)
Выполнив обратную замену, получаем общее решение рекуррентного соотношения от исходной переменной n:
T(n) = С1 + С2n . (3.44)
Последний шаг - определение констант С1 и С2. Их можно найти из (3.43) или из (3.44). Для T мы можем использовать начальные условия T(1) = 1 и T(2) = 3. Аналогичные начальные условия для t: t(0) = T(20) = T(1) = 1 и t(1) = T(21) = T(2) = 3. В любом случае, система линейных уравнений будет иметь вид:
C1 + C2 = 1 = T(1) = t(0) C1 + 2C2 = 3 = T(2) = t(1)
Её решение: C1 = -1 и C2 = 2, а формулой для T(n) будет:
T(n) = 2n - 1 ∈ Θ(n).
В следующем рекурсивном определении
1, если n = 1 T (n) = 2T(n/4) + log2n, если n > 1,
T(4k) = 2T(4k/4) + log24k = 2T(4k-1) + k log2 4 = 2T(4k-1) + 2k.
Следующий шаг - замена t(k) = T(4k):
t(k) = 2t(k - 1) + 2k.
Мы назовём эту операцию "заменой функции", чтобы подчеркнуть, что замена касается только T-членов (t-членами) и не влияет на все остальные члены (в данном случае - 2k). Приводим рекуррентное соотношение к каноническому виду
t(k) - 2t(k - 1) = 2k * 1k,
(х - 2)(х - 1)2.
Таким образом, формула для этого рекуррентного соотношения:
t(k) = C12k + C2 + C3k.
Чтобы вернуться к функции T, нужно произвести обратную замену k = log4 n. Однако нам необходимо выражение для 2k. Заметим, что n = 4k = (2 * 2)k = (22)k = (2k)2, поэтому 2k = √n, что даёт:
T(n) = C1√n + C2 + C3 log4 n.
Наконец, исходя из начального условия T(1) = 1, можно вычислить T(4) = 2T(1) + log2 4 = 4 и T(16) = 2T(4) + log2 16 = 12, что позволяет нам найти константы Ci из решения следующей системы линейных уравнений:
C1 + C2 = 1 = T(1) 2C1 + C2 + C3 = 4 = T(4) 4C1 + C2 + 2C3 = 12 = T(16).
Её решение: C1 = 5, C2 = -4 и C3 = -2, а формула для T(n):
T(n) = 5√n - 4 - 2 log4 n ∈ Θ(n1/2).
Если аргумент T в рекурсивном выражении - квадратный корень, можно воспользоваться заменой n = 2(2k). Рассмотрим следующее рекуррентное соотношение:
Поэтому новое рекуррентное соотношение будет иметь вид:
Для отмены замены переменной нужно применить подстановку k = log2(log2 n) или 2k = log2 n.
Таким образом, рекуррентное соотношение как функция n будет иметь вид:
Наконец, чтобы найти константы, используем начальные условия T(2) = 1 и T(4) = 4. Для этого нужно решить следующую систему линейных уравнений:
Её решение: C1 = C2 = 1. Поэтому конечная формула для T(n):
На следующем шаге мы рассмотрим многократные замены переменной или функции.
T(n) = 2T(√n) + log2 n, (3.45)
T(2(2k)) = 2T(2(2k/2)) + log2 2(2k) = 2T(2(2k-1)) + 2k,
t(k) = t(k - 1) + 2k,
(х - 2)(х - 2).
t(k) = C12k + C2k2k.
T(n) = C1 log2 n + C2(log2(log2 n)) log2 n. (3.46)
C1 = 1 = T(2)
2C1 + 2C2 = 4 = T(4)
T(n) = log2 n + (log2(log2 n)) log2 n ∈ Θ((log(log n)) log n). (3.47)