Время построения неявного Treap за время O(n)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Время построения неявного Treap за время O(n)

Сообщение Anonymous »

У меня есть два алгоритма для построения неявности из массива, один из них непрерывно объединяет
Вот так:

Код: Выделить всё

public Node nlognConvertToTreap(int[] arr){
Node node = Node.EMPTY_NODE;
for (int x : arr) node = merge(node, new Node(x));
return node;
}
Другой стиль — «разделяй и властвуй», например:

Код: Выделить всё

public Node efficientConvertToTreap(int[] arr){
return divideAndConquer(arr, 0, arr.length-1);
}

private Node divideAndConquer(int[] arr, int left, int right){
if (left == right) return new Node(arr[left]);
int mid = (left+right)/2;

return merge(divideAndConquer(arr, left, mid), divideAndConquer(arr, mid+1, right));
}`
Я знаю, что первый из них требует времени nlogn,
подход с разделениемANDConquer должен использовать O(N), поскольку он удовлетворяет рекурсии
T(n) = 2T( n/2) + O(logn).
Моя реализация merge() рекурсивная, я подсчитал количество вызовов слияния в каждой реализации. Для n = 2^20 количество вызовов слияния в реализации nlogn должно быть примерно в 20 раз больше. Однако я вижу только четырехкратное улучшение. Может ли кто-нибудь помочь мне понять проблему с моим анализом/реализацией.

Подробнее здесь: https://stackoverflow.com/questions/785 ... in-on-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»