1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# теория · шаг 3 из 7

Когда теорема молчит: зазоры и чужие формы

Коротко

Три случая не покрывают всё. Если f(n) меньше n^(log_b a), но не ПОЛИНОМИАЛЬНО (отстаёт лишь на множитель-логарифм), - зазор между случаями 1 и 2; если больше, но не полиномиально, - зазор между 2 и 3. В зазоре теорема молчит. И она вообще не про формы, где вход убывает вычитанием (T(n-1)) или делится неровно (T(n/3)+T(2n/3)). Тогда возвращаются к дереву и подстановке, а для неравных разбиений есть отдельная теорема.

Если понимаешь, что такое зазор между случаями и почему теорема не берёт T(n-1) и неравные разбиения, листай до «Теперь сам».

Как думаешь, всякую ли 2·T(n/2)+f возьмёт теорема

T(n) = 2·T(n/2) + n·log n. Водораздел n^(log_2 2) = n. Работа одного вызова вне рекурсии n·log n больше n - хочется сказать «случай 3, ответ Θ(n·log n)». Но проверь, НАСКОЛЬКО больше: f(n)/n^(log_b a) = (n·log n)/n = log n. Это множитель-логарифм, а не n^ε. Для случая 3 нужно, чтобы f обгоняла водораздел на степень n, а здесь - лишь на логарифм. Теорема этот случай не берёт.

На что это похоже

Три случая - три полки, между ними щели. Полка «листья больше», полка «поровну», полка «корень больше» - но между ними есть зазор, куда f проваливается, если отличается от водораздела слишком слабо, всего на логарифм. Как гиря чуть тяжелее эталона не ляжет ни на одну из трёх маркированных полок, так и n·log n не попадает ни в случай 2 (не поровну), ни в случай 3 (не полиномиально больше).

Механизм: почему решает именно «полиномиально»

Теорема стоит на геометрическом ряде: работа по уровням должна убывать (или расти) в число раз, чтобы сумму задавал один конец. «Полиномиально больше» значит f обгоняет водораздел на множитель n^ε - а n^ε при любом ε > 0 растёт быстрее любой степени логарифма. Только такой разрыв делает ряд по-настоящему геометрическим, и один конец - корень или листья - перевешивает остальные.

Множитель-логарифм для этого слишком слаб: log n растёт медленнее n^ε, сумму по уровням надо вычислять отдельно: универсального добавочного множителя здесь нет. Например, для f(n) = n/log n получается Θ(n·log log n): вклады уровней дают гармоническую сумму по логарифму входа. Для T(n) = 2·T(n/2) + n·log n деревом получается Θ(n·log² n) - на логарифм больше, чем дал бы наивный случай 3. Именно поэтому зазор выделен: наивно применить случай 3 - значит потерять этот log n.

Правило

Проверяй разрыв между f(n) и n^(log_b a) на ПОЛИНОМИАЛЬНОСТЬ (множитель n^ε, ε > 0). Разрыв лишь на логарифм - зазор, теорема неприменима, решай деревом. И теорема - только для a·T(n/b) + f(n) с постоянными a, b и равными подзадачами: вычитание и неравные разбиения не её.

Разбор: зазор между случаями 2 и 3

T(n) = 2·T(n/2) + n·log n. Водораздел n, f = n·log n, отношение log n - не n^ε. Зазор между случаями 2 и 3, теорема молчит. Решаем деревом: на уровне i вызовов 2ⁱ, размер n/2ⁱ, работа у каждого (n/2ⁱ)·log(n/2ⁱ), вместе на уровне n·log(n/2ⁱ) = n·(log n − i). Складываем по i от 0 до log n: n·(log n + (log n − 1) + ... + 1) = n·(сумма первых log n чисел) = n·Θ(log² n). Ответ Θ(n·log² n). Наивный случай 3 дал бы Θ(n·log n) - на множитель log n меньше, и это была бы ошибка.

Разбор: чужие формы, которые теорема не берёт

Теорема требует ровно a·T(n/b) + f(n). Не подходят:

Вычитание и переменные a, b берут дерево или подстановка из прошлой главы, неравные разбиения - теорема Акры-Бацци из следующего урока.

Что ломается без этого

Две ошибки. Применить случай 3 к зазору n·log n и потерять множитель log n (верный ответ n·log² n, а не n·log n). И «подогнать» под теорему форму с вычитанием: увидев 2·T(n-1)+1, подставить a = 2, b = 1 - но b > 1 обязательно, b = 1 теорема запрещает, и правильный ответ (экспонента) она бы не дала.

Зачем это в работе

Зазоры и чужие формы - не редкость: T(n) = 2·T(n/2) + n·log n возникает, когда уже отсортированные куски сливают с логарифмической работой на элемент; неравные разбиения дают многие геометрические алгоритмы. Знать границы теоремы важнее, чем саму теорему: применить её вне области - значит уверенно назвать неверный порядок, а это хуже, чем честно нарисовать дерево.

Теперь сам

Можно ли решить главной теоремой T(n) = 3·T(n-1) + 2? Если нет - почему и каким методом решать?

Ответ. Нельзя. Теорема требует a·T(n/b) с делением входа (b > 1), а здесь вход убывает ВЫЧИТАНИЕМ единицы - формы T(n/b) нет вовсе. Решаем разворачиванием (как Ханой в прошлой главе): три вызова на каждом из n уровней дают рост как 3ⁿ - экспонента. Дерево ветвится втрое и имеет глубину n, поэтому узлов порядка 3ⁿ; никакая главная теорема этого не покрывает, потому что она про деление, а не про вычитание.

Главное

Три случая теоремы не покрывают всё: если f(n) отличается от n^(log_b a) лишь на множитель-логарифм (не на n^ε), это зазор, и теорема молчит - как у 2·T(n/2)+n·log n, где деревом выходит Θ(n·log² n), а наивный случай 3 терял бы log n. Полиномиальность разрыва нужна, чтобы ряд по уровням был геометрическим. Вычитание входа (T(n-1)), неравные разбиения (T(n/3)+T(2n/3)) и переменные a, b - вообще не её форма: первое и последнее решают деревом и подстановкой, неравные разбиения - теоремой Акры-Бацци.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.