Я замечал очень странное использование O (1) в обсуждении алгоритмов, связанных с хэшированием и типами поиска, часто в контексте использования типа словаря, предоставляемого языковой системой, или с использованием типов словаря или хэш-массива используется с использованием обозначения индекса массива.
В принципе, O (1) означает ограниченное постоянное время и (как правило) фиксированное пространство. Некоторые довольно фундаментальные операции - это O (1), хотя использование промежуточных языков и специальных виртуальных машин имеет тенденцию искажать мышление здесь (например, как амортизировать сборщик мусора и другие динамические процессы над тем, что в противном случае было бы O (1) деятельностью).
Но, игнорируя амортизацию задержек, сбор мусора и т.д., я до сих пор не понимаю, как скачок к предположению, что определенные методы, связанные с каким-то поиском, могут быть O (1), за исключением особых условий.
Хотя я заметил это раньше, пример только что появился в вопросе Pandincus "," Правильная коллекция для использования в O (1) времени в С#.NET? ".
Как я заметил там, единственная коллекция, которую я знаю об этом, обеспечивает доступ O (1) как гарантированную привязку - это фиксированный массив с целым индексом. Предполагается, что массив реализуется путем некоторого сопоставления с оперативной памятью, которая использует операции O (1), чтобы найти ячейку, имеющую этот индекс.
Для коллекций, которые требуют определенного поиска для определения местоположения соответствующей ячейки для другого типа индекса (или для разреженного массива с целым индексом), жизнь не так проста. В частности, если возможны столкновения и перегруженность, доступ не является точно O (1). И если коллекция является гибкой, необходимо признать и амортизировать затраты на расширение базовой структуры (например, дерева или хеш-таблицы) для , который облегчает перегрузку (например, высокий уровень столкновений или дисбаланс деревьев).
Я бы никогда не подумал говорить об этих гибких и динамических структурах как O (1). Тем не менее, я вижу, что они предлагаются как решения O (1) без какой-либо идентификации условий, которые должны поддерживаться, чтобы на самом деле обеспечить доступ к O (1) (а также чтобы эта константа была пренебрежимо мала).
ВОПРОС: Вся эта подготовка действительно стоит вопроса. Какова случайность вокруг O (1) и почему она принимается так слепо? Известно ли, что даже O (1) может быть нежелательно большим, хотя и почти постоянным? Или O (1) просто присвоение понятия "вычислительная сложность" для неформального использования? Я озадачен.
ОБНОВЛЕНИЕ: Ответы и комментарии указывают, где я был случайным в определении O (1) самостоятельно, и я исправил это. Я по-прежнему ищу хорошие ответы, а некоторые из комментариев являются более интересными, чем их ответы, в нескольких случаях.