|
|
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
Здравствуйте Как доказывается, что амортизированная сложность вставки элемента в конец ArrayList равна О(1)? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 17:59 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509, Там есть ссылка на последний элемент last, вставляем в last+1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:00 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
no56892, я имею в виду, почему n элементов вставляется в конец за О(n), не смотря на то, что периодически приходится расширять размер массива? То есть, понятно, что часть элементов будет при этом вставлена за константное время. Но еще log(n) раз придется увеличивать размер массива. То есть суммарная стоимость добавления n элементов получается O(n) + O(log(n))*O(n), что эквивалентно О(nlog(n)). Где здесь ошибка в рассуждениях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:15 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
или ensureCapacity выполняется за О(1)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:17 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509, Я думаю здесь не учитывали случай увеличения размера массива с последующим копированием, а почему O(log(n)) для увеличения размера и O(n) + O(log(n))*O(n), что эквивалентно О(nlog(n)) ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:31 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
no56892,ааа, почему log2(n) понятно - он удваивается если нет места, а почему O(n)*O(log2(n)) == log2(n) ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:33 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
Есть N элементов в массиве. Операция добавления в конец списка в случае, когда массив заполнен, требует копирования N элементов. Но т.к. размер массива после этого удваивается, то у нас есть еще возможность сделать после этого еще N вставок в конец списка без применения операции копирования. А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:36 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
no56892, учитывали, иначе в javadoc не шла бы речь об амортизированном времени, а было бы просто сказано, что вставка в конец делается за О(1). Размер массива растет в геометрической прогрессии. Логарифм получается из уравнения, где слева - сумма прогрессии, справа - количество элементов, которое надо получить в итоге. первое О(n) получается из того факта, что какое-то количество раз, пропорциональное n мы добавим элементы за О(1). То есть n*O(1) = O(n). Второе слагаемое получается из того, что еще log(n) раз добавление займет O(n), отсюда O(nlog(n)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:41 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwaЕсть N элементов в массиве. А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1). Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:44 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509schwaЕсть N элементов в массиве. А из этого уже очевидно, что если из N операций имеют сложность O(N), то взятая отдельно операция в таком случае имеет сложность O(1). Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N) log(n), если считать с самой операции добавления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:48 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
log(n) это будет число удваиваний массива и к сложности операции добавления это не имеет отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:53 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwaqwerty5509пропущено... Не очевидно. Расширить массив надо будет log(n) раз. То есть вам log(n) раз надо будет выполнить операцию, занимающую O(N) log(n), если считать с самой операции добавления. Почему? log(n) это просто просуммированное количество раз, сколько нужно расширять массив, если у нас есть n элементов для вставки. Сама операция расширения занимает какое-то время при этом. (предполагаю, что О(n)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:54 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwalog(n) это будет число удваиваний массива и к сложности операции добавления это не имеет отношения. Понятно, что если не учитывать сложность расширения, то сложность добавления будет О(1). Но не учитывать сложность расширения нельзя в данном случае, так как оно является частью алгоритма и делает вклад в его общую сложность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 00:56 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
no56892no56892,ааа, почему log2(n) понятно - он удваивается если нет места, а почему O(n)*O(log2(n)) == log2(n) ?? я говорил, что O(n)*O(log2(n)) == О(nlog(n)). Потому что log(n) раз выполняем операцию сложностью О(n) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 01:01 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
А почему умножение (n*log(n)), если с N операциями вставки делается log(N) операций удвоения массива? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 01:29 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwaА почему умножение (n*log(n)), если с N операциями вставки делается log(N) операций удвоения массива? Ну а как? n операций, каждая занимает веремени O(log(n)). Получаем, что всё вместе O(n*log(n)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 13:28 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
n*lon(n) может получиться только в случае, если каждая операция добавления происходит вместе с какой-то еще операцией с логарифмической сложностью. В случае же добавления в arraylist есть N операций добавления и log(N) операций удваивания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 19:06 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwan*lon(n) может получиться только в случае, если каждая операция добавления происходит вместе с какой-то еще операцией с логарифмической сложностью. Не обязательно. При использовании О-нотации, мы оставляем наибольшую сложность, опуская те, что меньше. То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n). А еще часть вставок происходит за О(n) каждая, то это дает нам log(n)*O(n). То есть общая сложность алгоритма будет O(n) + O(n*log(n)). O(n) меньшее из слагаемых, так что его можно опустить. Получаем O(n*log(n)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 19:48 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n). Это как так у вас ловко получилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 20:22 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509Расширить массив надо будет log(n) разВ одном-единственном дебильном случае, когда кто-то специально озаботился создать одноэлементный ArrayList:докаpublic ArrayList()/ Constructs an empty list with an initial capacity of ten Таким образом, нет смысла обсуждать число расширений вне контекста конкретной ситуации. Поэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 20:33 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
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). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 21:02 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovПоэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение. Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 22:57 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
забыл никqwerty5509То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n). Это как так у вас ловко получилось? если n раз выполнить операцию, выполняющуюся за константное время, то суммарное время выполнения n операций, будет O(n). Разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 22:59 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509Basil A. SidorovПоэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение. Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ?? The add operation runs in amortized constant time, that is, adding n elements requires O(n) time ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 23:04 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwaБудет n (количество добавлений в конец массива) + сумма 2 ^ i , где i от 0 до log(n) (число удваиваний) а это все равно n + 2n, что есть по определению есть O(n). Где здесь учитывается сложность самой операции расширения? Вы учитываете только их количество ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 23:09 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38693910&tid=2126909]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
204ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 216ms |
| total: | 518ms |

| 0 / 0 |
