Реализации хеш-таблиц на практике используются не "точно" O (1), если вы протестируете одну из них, вы обнаружите, что в среднем около 1,5 поисков, чтобы найти данный ключ в большом наборе данных
(из-за того, что происходят столкновения DO , а при столкновении должно быть назначено другое местоположение)
Кроме того, на практике HashMaps поддерживаются массивами с начальным размером, который «увеличивается» до двойного размера, когда он достигает 70% заполненности в среднем, что дает относительно хорошее адресное пространство. После 70% полноты столкновения растут быстрее.
Теория большого О гласит, что если у вас есть алгоритм O (1) или даже алгоритм O (2), критическим фактором является степень отношения между размером набора ввода и шагами для вставки / извлечения одного из них. , O (2) по-прежнему постоянное время, поэтому мы просто приближаем его к O (1), потому что это означает более или менее одно и то же.
В действительности, существует только 1 способ получить «идеальную хеш-таблицу» с O (1), и для этого требуется:
- Глобальный идеальный генератор хэш-ключей
- Неограниченное адресное пространство.
( Исключительный случай : если вы можете заранее вычислить все перестановки разрешенных ключей для системы, а адресное пространство целевого резервного хранилища определяется как размер, в котором он может содержать все ключи, которые являются разрешено, тогда вы можете иметь идеальный хеш, но это «ограниченное доменом» совершенство)
При фиксированном распределении памяти это вряд ли возможно, поскольку предполагается, что у вас есть какой-то волшебный способ упаковать бесконечное количество данных в фиксированное пространство без потери данных, и это логистически невозможно.
Итак, ретроспективно, получая O (1.5), который все еще остается постоянным временем, в ограниченном объеме памяти даже при относительно наивном генераторе ключей хеша, я считаю чертовски крутым.
Дополнительная заметка Примечание. Здесь я использую O (1.5) и O (2). Они на самом деле не существуют в биг-о. Это всего лишь то, что люди, которые не знают, что такое "большой", считают разумным.
Если что-то требует 1,5 шага, чтобы найти ключ, или 2 шага, чтобы найти этот ключ, или 1 шаг, чтобы найти этот ключ, но количество шагов никогда не превышает 2, и если это занимает 1 шаг или 2, является совершенно случайным, то это все еще Big-O O (1). Это связано с тем, что независимо от того, сколько элементов добавляется к размеру набора данных, он все равно сохраняет <2 шага. Если для всех таблиц> 500 ключей требуется 2 шага, то можно предположить, что эти 2 шага на самом деле являются одностадийными с 2 частями ... что по-прежнему равно O (1).
Если вы не можете сделать это предположение, тогда вы вообще не мыслите Big-O, потому что тогда вы должны использовать число, представляющее число конечных вычислительных шагов, необходимых для выполнения всего, а «одношаговый» не имеет смысла тебе. Просто подумайте, что существует прямая корреляция NO между Big-O и числом задействованных циклов выполнения.