Некоторое время назад я немного узнал о записи больших О и эффективности различных алгоритмов.
Например, циклически просматривая каждый элемент в массиве, чтобы что-то с ним делать
foreach(item in array)
doSomethingWith(item)
- это алгоритм O(n)
, поскольку число циклов, которые выполняет программа, прямо пропорционально размеру массива.
Что меня поразило, так это то, что поиск по таблице O(1)
.То есть поиск ключа в хэш-таблице или словаре
value = hashTable[key]
занимает одно и то же число циклов независимо от того, имеет ли таблица один ключ, десять ключей, сто ключей или гигабриджиллион ключей.
Это действительно круто, и я очень рад, что это правда, но это не интуитивно для меня, и я не понимаю почему это правда.
Я могу понятьпервый алгоритм O(n)
, потому что я могу сравнить его с реальным примером: если у меня есть листы бумаги, которые я хочу проштамповать, я могу просматривать каждую бумагу по одному и штамповать каждый.Для меня имеет большой смысл, что если у меня есть 2000 листов бумаги, штамповка с использованием этого метода займет вдвое больше времени, чем если бы у меня было 1000 листов бумаги.
Но я не могупонять, почему поиск по таблице O(1)
.Я думаю, что если у меня есть словарь, и я хочу найти определение полиморфизм , мне понадобится O(logn)
время, чтобы найти его: я открою страницу в словаре и посмотрюесли это в алфавитном порядке до или после полиморфизм .Если, скажем, это было после раздела P , я могу удалить все содержимое словаря после страницы, которую я открыл, и повторять процесс с оставшейся частью словаря, пока не найду полиморфизм слова ..
Это не процесс O(1)
: мне обычно требуется больше времени, чтобы найти слова в словаре из тысячи страниц, чем в словаре из двух страниц.Мне трудно представить процесс, который занимает одинаковое количество времени, независимо от размера словаря.
tl; dr : Можете ли вы объяснить мне, как можно выполнить поиск таблицы со O(1)
сложностью?
(Если вы покажете мне, как реплицироватьУдивительный O(1)
алгоритм поиска, я определенно получу большой толстый словарь, чтобы я мог показать всем своим друзьям свои навыки поиска ниндзя-словаря)
РЕДАКТИРОВАТЬ: Большинство ответов, по-видимому, зависят от этого предположения:
У вас есть возможность доступа к любой странице словаря по номеру страницы в постоянном времени
Если это правда, мне легко увидеть.Но я не знаю, почему это основополагающее предположение верно: я бы использовал тот же процесс для поиска страницы по номеру, как и по слову.
То же самое с адресами памяти, для чего используется алгоритмзагрузить адрес памяти?Что делает так дешево найти часть памяти по адресу?Другими словами, почему доступ к памяти O(1)
?