Ошибка в использовании асимптотической записи

10

Я пытаюсь понять, что не так со следующим доказательством следующего повторения

T(n)=2T(n2)+n
T(n)2(cn2)+ncn+n=n(c+1)=O(n)

Документация говорит, что это неправильно из-за индуктивной гипотезы, что Чего мне не хватает?

T(n)cn
эрб
источник
2
Повторения этой формы также могут быть решены с помощью основной теоремы .
Юхо
2
@Ran: Я не думаю, что мастер-теорема является подходящим тегом для этого вопроса. Вопрос не в том, как ее решить, а в том, чтобы указать на ошибку в конкретном аргументе. Кроме того, мастер-теорема, вероятно, слишком конкретна и, вероятно, не заслуживает того, чтобы иметь свой собственный тег. В общем, мы должны пометить на основе вопроса, а не возможных ответов. Например, вы бы назвали эту акру-бацци?
Арьябхата
«что не так со следующим доказательством» - я не вижу доказательства. Часто полезно записать полное доказательство (то есть сделать явную индукцию), чтобы обнаружить ошибки.
Рафаэль

Ответы:

12

Допустим, конечная цель - доказать . Вы начинаете с гипотезы индукции:T(n)=O(n)

i < nT(i)ci для всех .i<n

И чтобы завершить доказательство, вы должны показать, что .T(n)cn

Однако, что вы можете сделать вывод, так это , что бесполезно для завершения доказательства; вам нужна одна константа для (почти) всех . Следовательно, мы не можем ничего сделать, и не доказано.c n T ( n ) = O ( n )T(n)(c+1)ncnT(n)=O(n)

Обратите внимание, что вы запутались между результатом и процессом доказательства. И еще один момент, на самом деле в этом случае, поэтому вы можете рассмотреть соответствующую гипотезу индукции, чтобы иметь возможность доказать это.Θ ( n log n )T(n)Θ(nlogn)

подушечка
источник
если мы заменим c '= c + 1, это изменится?
Erb
@erb: нет, не будет Вы должны доказать для выбранной константы. Если заменить , вы в конечном итоге получите T ( n ) ( c + 1 ) n (или T ( n ) ( c + 2 ) n ), тогда результат будет тем же. c=c+1T(n)(c+1)nT(n)(c+2)n
колодка
8

Вы пропустили несколько шагов. Похоже, вы пытаетесь по индукции доказать, что , и ваше доказательство выглядит так :T(n)=O(n)

Предположим, что при k < n . Это означает, что T ( k ) cT(k)=O(k)k<n для некоторых с . Тогда T ( n ) = 2 T ( n / 2 ) + n 2 c n / 2 + n ( c + 1 )T(k)ckc , поэтому T ( n ) = O ( n ) .T(n)=2T(n/2)+n2cn/2+n(c+1)nT(n)=O(n)

Это доказательство с самого начала неверно: « для k < n » не имеет смысла. Big oh является асимптотическим понятием: T ( k ) = O ( k ) означает, что существует некоторая постоянная c и порог N такой, что k N , T ( k ) cT(k)=O(k)k<nT(k)=O(k)c . И снова, в конце, вы не можете сделать вывод, что « T ( n ) = O ( n ) », потому что это что-то говорит о функции T в целом, и вы только что-то доказали о конкретном значении T ( n ) ,kN,T(k)ckT(n)=O(n)TT(n)

Вы должны четко указать, что означает Так что, возможно, ваше доказательство идет:O

Предположим, что для всех k < n . Тогда T ( n ) = 2 T ( n / 2 ) + n 2 c n / 2 + n ( c + 1 )T(k)ckk<n .T(n)=2T(n/2)+n2cn/2+n(c+1)n

Это не доказывает индуктивный шаг: вы начали с , и вы доказаличто для к = п , Т ( к ) ( с + 1 )T(k)ckk=n . Это более слабая оценка. Посмотрите, что это значит: T ( k ) cT(k)(c+1)k означаетчто с является оценка скорости роста Т . Но у вас есть скорость c, которая растет, когда k растет. Это не линейный рост!T(k)ckcTck

Если вы внимательно посмотрите, вы заметите, что скорость увеличивается на 1, когда k удваивается. Итак, неофициально, если m = 2 p k, то c m = c k + p ; другими словами, c k = c 0 log 2 k .c1km=2pkcm=ck+pck=c0log2k

Это может быть сделано точно. Докажите по индукции , что для , Т ( к ) Ĉ войти 2 ( K ) .k1T(k)clog2(k)

Рекуррентное соотношение типично для алгоритмов «разделяй и властвуй», которые разделяют данные на две равные части за линейное время. Такие алгоритмы работают в время (не O ( n ) ).Θ(nlog(n))O(n)

Чтобы увидеть ожидаемый результат, вы можете сравнить рекуррентное соотношение с основной теоремой . Деление а дополнительная работа - n ; log 2 ( 2 ) = 1, так что это второй случай, когда рост равен Θ ( n2T(n/2)nlog2(2)=1 .Θ(nlog(n))

Жиль "ТАК - перестань быть злым"
источник
7

Я расширяю уже полученный ответ, возможно, только объясняя свой комментарий более подробно.

T(n)=aT(n/b)+f(n)a1b>1f(n)n/2n/2, Чтобы быть технически точным, наше повторение может быть не вполне определенным, потому что может не быть целым числом. Однако это разрешено, поскольку это не повлияет на асимптотическое поведение рецидива. Поэтому нам часто бывает удобно бросать полы и потолки. Формальное доказательство этого немного утомительно, но заинтересованный читатель может найти его, например, в Cormen et al. книга .n/2

a=2b=2f(n)=Θ(n)nlogba=nlog22=nf(n)=Θ(n)T(n)=Θ(nlogn)

Юхо
источник
Спасибо! Можно отметить, что «падение пола и потолка» соответствует предположению, что что обычно делается. Основное наблюдение состоит в том, что для неубывающих функций асимптотический рост подпоследовательностей равен асимптотическому росту всей последовательности. n=2k
Рафаэль