Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод амортизированной сложности втавки элемента в конец ArrayList / 25 сообщений из 31, страница 1 из 2
10.07.2014, 17:59
    #38693681
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
Здравствуйте
Как доказывается, что амортизированная сложность вставки элемента в конец ArrayList равна О(1)?

Спасибо
...
Рейтинг: 0 / 0
11.07.2014, 00:00
    #38693886
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509,

Там есть ссылка на последний элемент last, вставляем в last+1.
...
Рейтинг: 0 / 0
11.07.2014, 00:15
    #38693891
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
no56892, я имею в виду, почему n элементов вставляется в конец за О(n), не смотря на то, что периодически приходится расширять размер массива?
То есть, понятно, что часть элементов будет при этом вставлена за константное время. Но еще log(n) раз придется увеличивать размер массива. То есть суммарная стоимость добавления n элементов получается O(n) + O(log(n))*O(n), что эквивалентно О(nlog(n)). Где здесь ошибка в рассуждениях?
...
Рейтинг: 0 / 0
11.07.2014, 00:17
    #38693893
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
или ensureCapacity выполняется за О(1)?
...
Рейтинг: 0 / 0
11.07.2014, 00:31
    #38693902
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509,
Я думаю здесь не учитывали случай увеличения размера массива с последующим копированием, а почему O(log(n)) для увеличения размера и O(n) + O(log(n))*O(n), что эквивалентно О(nlog(n)) ??
...
Рейтинг: 0 / 0
11.07.2014, 00:33
    #38693904
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
no56892,ааа, почему log2(n) понятно - он удваивается если нет места, а почему O(n)*O(log2(n)) == log2(n) ??
...
Рейтинг: 0 / 0
11.07.2014, 00:36
    #38693906
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
Есть N элементов в массиве.
Операция добавления в конец списка в случае, когда массив заполнен, требует копирования N элементов. Но т.к. размер массива после этого удваивается, то у нас есть еще возможность сделать после этого еще N вставок в конец списка без применения операции копирования.

А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1).
...
Рейтинг: 0 / 0
11.07.2014, 00:41
    #38693908
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
no56892, учитывали, иначе в javadoc не шла бы речь об амортизированном времени, а было бы просто сказано, что вставка в конец делается за О(1).
Размер массива растет в геометрической прогрессии. Логарифм получается из уравнения, где слева - сумма прогрессии, справа - количество элементов, которое надо получить в итоге.
первое О(n) получается из того факта, что какое-то количество раз, пропорциональное n мы добавим элементы за О(1). То есть n*O(1) = O(n). Второе слагаемое получается из того, что еще log(n) раз добавление займет O(n), отсюда O(nlog(n)).
...
Рейтинг: 0 / 0
11.07.2014, 00:44
    #38693910
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwaЕсть N элементов в массиве.
А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1).

Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N)
...
Рейтинг: 0 / 0
11.07.2014, 00:48
    #38693913
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509schwaЕсть N элементов в массиве.
А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1).

Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N)
log(n), если считать с самой операции добавления.
...
Рейтинг: 0 / 0
11.07.2014, 00:53
    #38693914
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
log(n) это будет число удваиваний массива и к сложности операции добавления это не имеет отношения.
...
Рейтинг: 0 / 0
11.07.2014, 00:54
    #38693915
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwaqwerty5509пропущено...


Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N)
log(n), если считать с самой операции добавления.
Почему? log(n) это просто просуммированное количество раз, сколько нужно расширять массив, если у нас есть n элементов для вставки. Сама операция расширения занимает какое-то время при этом. (предполагаю, что О(n))
...
Рейтинг: 0 / 0
11.07.2014, 00:56
    #38693916
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwalog(n) это будет число удваиваний массива и к сложности операции добавления это не имеет отношения.
Понятно, что если не учитывать сложность расширения, то сложность добавления будет О(1). Но не учитывать сложность расширения нельзя в данном случае, так как оно является частью алгоритма и делает вклад в его общую сложность
...
Рейтинг: 0 / 0
11.07.2014, 01:01
    #38693918
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
no56892no56892,ааа, почему log2(n) понятно - он удваивается если нет места, а почему O(n)*O(log2(n)) == log2(n) ??
я говорил, что O(n)*O(log2(n)) == О(nlog(n)). Потому что log(n) раз выполняем операцию сложностью О(n)
...
Рейтинг: 0 / 0
11.07.2014, 01:29
    #38693921
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
А почему умножение (n*log(n)), если с N операциями вставки делается log(N) операций удвоения массива?
...
Рейтинг: 0 / 0
11.07.2014, 13:28
    #38694286
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwaА почему умножение (n*log(n)), если с N операциями вставки делается log(N) операций удвоения массива?
Ну а как? n операций, каждая занимает веремени O(log(n)). Получаем, что всё вместе O(n*log(n))
...
Рейтинг: 0 / 0
11.07.2014, 19:06
    #38694729
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
n*lon(n) может получиться только в случае, если каждая операция добавления происходит вместе с какой-то еще операцией с логарифмической сложностью.
В случае же добавления в arraylist есть N операций добавления и log(N) операций удваивания.
...
Рейтинг: 0 / 0
11.07.2014, 19:48
    #38694739
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwan*lon(n) может получиться только в случае, если каждая операция добавления происходит вместе с какой-то еще операцией с логарифмической сложностью.
Не обязательно. При использовании О-нотации, мы оставляем наибольшую сложность, опуская те, что меньше. То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n). А еще часть вставок происходит за О(n) каждая, то это дает нам log(n)*O(n).
То есть общая сложность алгоритма будет O(n) + O(n*log(n)). O(n) меньшее из слагаемых, так что его можно опустить. Получаем O(n*log(n))
...
Рейтинг: 0 / 0
11.07.2014, 20:22
    #38694753
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n).

Это как так у вас ловко получилось?
...
Рейтинг: 0 / 0
11.07.2014, 20:33
    #38694759
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509Расширить массив надо будет log(n) разВ одном-единственном дебильном случае, когда кто-то специально озаботился создать одноэлементный ArrayList:докаpublic ArrayList()/
Constructs an empty list with an initial capacity of ten Таким образом, нет смысла обсуждать число расширений вне контекста конкретной ситуации.
Поэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение.
...
Рейтинг: 0 / 0
11.07.2014, 21:02
    #38694768
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509schwan*lon(n) может получиться только в случае, если каждая операция добавления происходит вместе с какой-то еще операцией с логарифмической сложностью.
Не обязательно. При использовании О-нотации, мы оставляем наибольшую сложность, опуская те, что меньше. То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n). А еще часть вставок происходит за О(n) каждая, то это дает нам log(n)*O(n).
То есть общая сложность алгоритма будет O(n) + O(n*log(n)). O(n) меньшее из слагаемых, так что его можно опустить. Получаем O(n*log(n))
n * log(n) никогда не будет.

Будет n (количество добавлений в конец массива) + сумма 2 ^ i , где i от 0 до log(n) (число удваиваний)
а это все равно n + 2n, что есть по определению есть O(n).
...
Рейтинг: 0 / 0
11.07.2014, 22:57
    #38694802
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
Basil A. SidorovПоэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение.
Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ??
...
Рейтинг: 0 / 0
11.07.2014, 22:59
    #38694803
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
забыл никqwerty5509То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n).

Это как так у вас ловко получилось?

если n раз выполнить операцию, выполняющуюся за константное время, то суммарное время выполнения n операций, будет O(n). Разве нет?
...
Рейтинг: 0 / 0
11.07.2014, 23:04
    #38694804
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
qwerty5509Basil A. SidorovПоэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение.
Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ??

The add operation runs in amortized constant time, that is, adding n elements requires O(n) time
...
Рейтинг: 0 / 0
11.07.2014, 23:09
    #38694807
qwerty5509
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод амортизированной сложности втавки элемента в конец ArrayList
schwaБудет n (количество добавлений в конец массива) + сумма 2 ^ i , где i от 0 до log(n) (число удваиваний)
а это все равно n + 2n, что есть по определению есть O(n).
Где здесь учитывается сложность самой операции расширения? Вы учитываете только их количество
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод амортизированной сложности втавки элемента в конец ArrayList / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]