|
|
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509schwaБудет n (количество добавлений в конец массива) + сумма 2 ^ i , где i от 0 до log(n) (число удваиваний) а это все равно n + 2n, что есть по определению есть O(n). Где здесь учитывается сложность самой операции расширения? Вы учитываете только их количество Сумма (2 ^ i) , где i от 0 до log(n). вот суммарная сложность всех удваиваний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 23:47 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
schwa, а почему сложность удваивания равна 2^i ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 00:20 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509Если документация, не учитывает накладжных расходов на возможное расширение, то почему она говорит об амортизированной сложности добавления элемента за О(1) ??Толковый словарь на статье "амортизация" не пробовали открыть? В худшем случае, добавление n элементов потребует log2(n) расширений. Вероятность такого наихудшего случая стремится к нулю. Если до вставки ёмкость массива-списка была m элементов (m < n), то потребуется около log2(n/m) расширений. Таким образом, если m и n сравнимы по порядку величины - получим примерно постоянное число расширений сложности O( m ) каждое. Что даёт нам увеличение коэффициента, но не меняет порядок сложности. Таким образом, при вполне разумных предположениях, сложность вставки n элементов остаётся O( n ), а значит вставка одного элемента выполняется примерно постоянное время. Вполне эргодичная система - среднее по времени равно среднему по ансамблю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 01:14 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
qwerty5509 , 1) Размер массива определяется интом, то есть 4 байта. Соответственно, максимальное количество расширений массива будет не более 32 (или 31 - не суть). 2) Размер, который занимает, например, массив рефернсов размера 2 ^ 31 это 2 ^ 34 байт, что эквивалентно 16Gb. На практике люди очень редко хотя бы отдаленно приближаются к этим цифрам, поэтому крайние, наиболее тяжелые, ресайзы отбрасываем. 3) Как уже заметили, операции добавления одного элемента и операции копирования массива нельзя ставить в один ряд. Например, записать 8 раз по одному байту - это восемь отдельных записей. А скопировать массив байт размером 8 - это одна запись. 4) Исходя из всего этого разработчики JavaSE сказали - приближенно, особенно с учетом амортизации (то есть исходя из того, что вы не просто бездумно долбите Add(), но и что-то полезное между ними делаете), можно считать, что операция Add() выполняется за O(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 01:31 |
|
||
|
Вывод амортизированной сложности втавки элемента в конец ArrayList
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovполучим примерно постоянное число расширений сложности O( m )O(n). На конечный вывод это не влияет из-за очень медленного роста логарифмической функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 01:40 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38694821&tid=2126909]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 352ms |

| 0 / 0 |
