Лучше предположить верхнюю границу

90
5

Это вопрос из "введения в алгоритмы", число которого 4.4-5 и описывается следующим образом:


Используйте дерево рекурсии для определения хорошей асимптотической верхней границы повторения T (n) = T (n-1) + T (n/2) + n. Используйте метод подстановки, чтобы проверить ваш ответ.



Мне было сложно вычислить рекурсивное дерево. Ответ, который я дал


Math.pow(2, п)



кажется слишком рыхлым. Может быть, существует еще более предположение. Спасибо за любую помощь.

спросил(а) 2020-03-27T19:33:14+03:00 2 месяца назад
1
Решение
129

Надеюсь, я не допустил ошибок:)


let A(n)=T(n/2)+n


0. T(n)=T(n-1)+A(n)=T(n-2)+A(n-1)+A(n)=...=A(1)+A(2)+...+A(n)
T(n)=sum[1..n]A(n)
T(n)=sum[i=1..n]T(i/2)+sum[i=1..n]i

Предполагая, что n/2 является целым делением, T(n/2)=T((n+1)/2) для четного n, поэтому первая сумма состоит из двух равных половин: T(1)+T(1)+T(2)+T(2)+...


1. T(n)=2*sum[1..n/2]T(i)+n*(n-1)/2

так как T(n)<=T(m) for every n<=m


2. T(n)<=n*T(n/2)+n*(n-1)/2

так как T(n/2)>=n/2>=(n-1)/2

3. T(n)<=n*T(n/2)+n*T(n/2)=2*n*T(n/2)

рассмотрим это только для n=2^k, так как T является монотонным: n=2^k и U(k)=T(2^k)


4. U(k)<=2*(2^k)*U(k-1)=2^(k+1)*U(k-1)

let L(k)=log2 U(k)


5. L(k)<=k+1+L(k-1)

так же, как мы делали между step0 и step1


6. L(k)<=k*(k-1)/2+k=k*k/2-k/2+k<=k*k

7. U(k)=2^L(k)<=2^squared(k)

8. T(n)=U(log2 n)<=2^squared(log2 n)

ответил(а) 2020-03-27T19:44:47.164787+03:00 2 месяца назад
55

Отношение рекурсии, по-видимому, приводит к субэкспоненциальному и суперлинейному времени вычисления, что означает, что любая выбранная база будет работать как верхняя граница, учитывая достаточно большую величину n.


Ваш выбор 2^n - хороший ответ и, возможно, тот, который они искали в книге. Это простое решение, которое справедливо даже при довольно малых значениях n. (Тем не менее, я понимаю, почему вы задаете вопрос, потому что он растет намного быстрее, чем T(n) даже для умеренно больших n.)


Учитывая T(1) = 1 (или некоторую другую константу), уравнение рекурсии дает нам время работы следующим образом для первых нескольких значений n.


T(1) = 1          n^1 = 2
T(2) = 4 n^2 = 4
T(3) = 11 n^3 = 8
T(4) = 19 n^4 = 16
T(5) = 35 n^5 = 32
T(6) = 52 n^6 = 64
T(7) = 78 n^7 = 128
T(8) = 105 n^8 = 256
T(9) = 149 n^9 = 512

Мы видим, что выбор 2^n как верхнего предела справедлив для всех значений T(6) и выше.


Если вам нужна нижняя граница, чем 2^n, вы можете выбрать нижнюю базу (с компромиссом, что она будет действительна только для более высоких чисел n). Но я должен добавить, что он по-прежнему будет в основном тем же самым решением, что и тот, который у вас уже есть.

Любая база, более крупная, чем одна, но, чтобы быть немного более конкретной, мы могли бы, например, увидеть, что уравнение рекурсии T(n) = T(n-1) + T(n/2) + n ограничено уравнением T(n) = T(n-1) + T(n-2) для n>5.


Это то же рекурсивное отношение, что и для последовательности Фибоначчи, и после шагов в ответах на этот вопрос имеет сложную вычислительную сложность, соответствующую золотому соотношению (1+sqrt(5))/2 = 1,618 до степени n.


Построение фактических значений, которые мы можем видеть, для которых n значение T(n) ограничено ((1+sqrt(5))/2)^n. Из рисунка это значения n=13 и выше.


Computational complexity of algorithm.


Все это сказало, я немного подумал о приближении времени работы с помощью некоторой субэкспоненциальной функции. Кажется, что это легко сделать, и, как я сказал, я считаю, что вы нашли ожидаемый ответ.

ответил(а) 2020-03-27T19:33:14+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема