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