Что такое асимптотическая сложность списка.Добавить?

я обнаружил, что существует много споров об асимптотической сложности List.Add(). Источник этого, я подозреваю, является худшим сценарием это приводит к изменению размера базового массива и логично O(n) операции. Однако массив увеличивается в два раза по размеру каждый раз, когда список заканчивается пространства. Это делает количество изменений, необходимых для n элементы пропорциональны log(n).

не означает ли это, что асимптотическая сложность Add операции в среднем случае будет O(n/log(n))?

реальный ориентир для List.Add() ниже. Однако бенчмарки не очень выразительны для такой операции - у нас может закончиться память до того, как станет видно любое отклонение от прямой (в логарифмическом масштабе) линии.

benchmark

1 ответов


это означает, что амортизированной сложности of List.Add() можно вычислить путем суммирования операций изменения размера, а затем умножения на количество общих дополнений, внесенных в список.

T(n) = (2 + 4 + 8 + ... + n/2 + n) / n

но обратите внимание, что суммирование-это геометрическая серия, и мы можем сделать лучше, чем предполагать, что это (суммирование)n*log(n):

T(n) < 2n/n = 2 -> T(n) is in O(1)

Примечание: здесь я предполагаю, что вы имеете в виду add() как добавление. Вставка элемента в произвольное расположение занимает O(n) время, и Вам также придется учитывать это, что изменит конечный результат от O(1) амортизированная сложность до O(n) амортизированной.