Что такое асимптотическая сложность списка.Добавить?
я обнаружил, что существует много споров об асимптотической сложности List.Add()
. Источник этого, я подозреваю, является худшим сценарием это приводит к изменению размера базового массива и логично O(n)
операции. Однако массив увеличивается в два раза по размеру каждый раз, когда список заканчивается пространства. Это делает количество изменений, необходимых для n
элементы пропорциональны log(n)
.
не означает ли это, что асимптотическая сложность Add
операции в среднем случае будет O(n/log(n))
?
реальный ориентир для List.Add()
ниже. Однако бенчмарки не очень выразительны для такой операции - у нас может закончиться память до того, как станет видно любое отклонение от прямой (в логарифмическом масштабе) линии.
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)
амортизированной.