Я пытаюсь решить эту проблему определенным образом, я уже знаю, что это сложность BigTheta (nloglogn), но я не получу того же ответа, если сделаю следующее:

let m = logn
then n = 2^m
we get T(2^m) = 2T(2^(m-1))+(2^m)*m
multiply by 1/(2^m)
we get T(2^m)/2^m = 2T(2^(m-1))/2^m + m
= T(2^(m-1))/(2^(m-1)) + m

Теперь, если я позволю S(m)=T(2^m)/2^m, у меня будет S(m)=S(m-1)+m.

Теперь решаю S(m)=S(m-1)+m методом обратной подстановки.

S(m) = S(m-1)+m=S(m-2)+(m-1)+m = S(m-3)+(m-2)+(m-1)+m = S(m-4)+(m-3)+(m-2)+(m-1)+m=... = S(m-k)+(m-k+1)+..+(m-3)+(m-2)+(m-1)+m = ... = S(1)+2+...+m = m(m-1)/2 = BigTheta(m^2)

Подключив обратно m=logn, я получаю BigTheta((logn)^2), что не то же самое.

0
user3100258 1 Янв 2018 в 16:39

2 ответа

Лучший ответ

Вы поступили правильно, мой друг. Однако есть небольшая ошибка.

S(m) = S(m-1) + m

Что верно, и мы получаем S(m) = BigTheta(m^2).

Теперь S(m) = T(2^m)/(2^m) = BigTheta(m^2). Это означает T(2^m) = T(n) = (2^m) * BigTheta(m^2).

Возвращаем полученные значения T(n) = n*BigTheta(lognlogn) = BigTheta(n*lognlogn)

1
Sumeet 1 Янв 2018 в 14:16

Итак, ошибка здесь:

Теперь, если я позволю S(m)=T(2^m)/2^m, у меня будет S(m)=S(m-1)+m.

Фактически, если вы позволите S(m)=T(2^m)/2^m, тогда у вас будет S(m)=2S(m-1)+m из-за деления на 2^(m-1).

С этим исправлением мы имеем:

S(m) = 2S(m - 1) + m
     = 2S(2S(m - 2) + m) + m
     = 4S(m - 2) + (m − 1) + m
     = 4S(2S(m - 3) + (m - 2)) + (m − 1) + m
     = 8S(m - 3) + (m - 2) + (m - 1) + m

Это дает нам общую форму:

S(m) = 2^m S(0) + m(m+1)/2

Подключив обратно, мы получаем следующее:

T(2^m) = 2^m T(0) + m(m+1) 2^(m-1)

Затем мы можем снова подключиться к n:

T(n) = nT(1) + n/2 (logn)(1 + logn) = O(n(logn)^2)
1
njwfish 1 Янв 2018 в 14:25