Шаг 59.
Рекурсия на Python. ... . Общий метод решения разностных уравнений. Многократные замены переменной или функции

    На этом шаге мы рассмотрим использование таких замен.

    Предыдущее рекуррентное соотношение (3.45) можно решить, применив две последовательные замены переменной (и функции). Во-первых, замена n = 2k приводит к

                __
    T(2k) = 2T(√nk) + log2 2k = T(2k/2) + k.

    Заменив T(2k) на t(k), получаем следующее рекуррентное соотношение:

    t(k) = 2t(k/2) + k,
которое всё ещё нельзя решить общим методом, так как оно не является разностным уравнением. Но зато можно произвести ещё одну замену переменной k = 2m, чтобы привести его к нужному виду:
    t(2m) = 2t(2m-1) + 2m,
что после замены функции t(2m) = u(m) сводится к разностному уравнению
    u(m) = 2u(m - 1) + 2m.
Его характеристический полином (х - 2)2, а это значит, что рекуррентное соотношение будет иметь вид:
    u(m) = C12m + C2m2m.

    Отмена последней замены переменной приводит к

    t(k) = C1k + C2(log2(k))k
и в итоге к
    T(n) = C1 log2 n + C2(log2(log2 n))log2 n,
что равносильно (3.46). Поэтому решением является (3.47).

    Стратегия применения нескольких замен переменных или функций может использоваться для решения более сложных рекуррентных соотношений, таких, например, как следующее нелинейное соотношение:

         1/3,      если = 1
T (n) =	
         nT(n/2)2, если n > 1,
где n - степень двух. Сначала можно применить замену переменной n = 2k, что приводит к
    T(2k) = 2kT(2k/2)2 = 2kT(2k-1)2.

    После замены функции T(2k) = t(k) получаем

    t(k) = 2kt(k - 1)2,
что всё ещё невозможно решить общим методом. Но после логарифмирования обеих частей равенства
    log2 t(k) = log2 2kt(k - 1)2 = k + 2log2 t(k - 1)
можно произвести более сложную замену функции log2 t(k) = u(k), которая даст рекуррентное соотношение
    u(k) = k + 2u(k - 1),
которое уже можно решить общим методом. Его характеристический полином
    (x - 2)(x - 1)2,
который подразумевает, что u(k) имеет следующий вид:
    u(k) = C12k + C2 + C3k.

    Отменив замены, получим сначала

    t(k) = 2C12k + C2 + C3k,
а затем
    T(n) = 2C1n + C2 + C3log2 n.

    Последний шаг, как обычно, состоит из определения констант. Используя начальное условие T(1) = 1/3, получаем T(2) = 2[T(1)]2 = 2/9 и T(4) = 4[T(2)]2 = 4(2/9)2 = 16/81. Воспользуемся этими значениями для составления следующей системы (нелинейных) уравнений:

    2С12 = 1/3 = T(1)
    22Cl+C23 = 2/9 = T(2)	,
    24Cl+C2+2С3 = 16/81 = T(4)
которую (после логарифмирования по основанию 2 обеих частей уравнений) можно привести к системе линейных уравнений:
    C1 + C2 = -log23
    2C1 + C2 + C3 = 1 - log29 = 1 - 2log23	.
    4C1 + C2 + 2C3 = 4 - log281 = 4 - 4log23.

    Её решение:

    C1 = 2 - log2 3 = log2(4/3), 
    C2 = -2, 
    C3 = -1.

    Таким образом, T(n) можно выразить следующей формулой:

    T(n) = 2(log2(4/3))n - 2 - log2n = 2log2(4/3)n * 2-2 * 2log2(1/n) = (4/3)n(1/4)n ∈ Θ((4/3)nn).

    Со следующего шага мы начнем рассматривать основные алгоритмы линейной рекурсии.




Предыдущий шаг Содержание Следующий шаг