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

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

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

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

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

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


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

Это как так у вас ловко получилось?
...
Рейтинг: 0 / 0
Вывод амортизированной сложности втавки элемента в конец ArrayList
    #38694759
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty5509Расширить массив надо будет log(n) разВ одном-единственном дебильном случае, когда кто-то специально озаботился создать одноэлементный ArrayList:докаpublic ArrayList()/
Constructs an empty list with an initial capacity of ten Таким образом, нет смысла обсуждать число расширений вне контекста конкретной ситуации.
Поэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение.
...
Рейтинг: 0 / 0
Вывод амортизированной сложности втавки элемента в конец ArrayList
    #38694768
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вывод амортизированной сложности втавки элемента в конец ArrayList
    #38694802
qwerty5509
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovПоэтому документация указывает сложность операции дополнения массива ещё одним элементом без учёта накладных расходов на возможное(!) расширение.
Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ??
...
Рейтинг: 0 / 0
Вывод амортизированной сложности втавки элемента в конец ArrayList
    #38694803
qwerty5509
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никqwerty5509То есть, если часть вставок происходит за О(1) каждая, то это дает нам О(n).

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

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

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


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