На практике это O (1), но на самом деле это ужасное и математически бессмысленное упрощение. Запись O () говорит о том, как алгоритм ведет себя, когда размер задачи стремится к бесконечности. Hashmap get / put работает как алгоритм O (1) для ограниченного размера. Предел достаточно велик для памяти компьютера и с точки зрения адресации, но далеко от бесконечности.
Когда кто-то говорит, что get / put hashmap равен O (1), он должен действительно сказать, что время, необходимое для get / put, является более или менее постоянным и не зависит от количества элементов в hashmap, поскольку hashmap может быть представлен на реальной вычислительной системе. Если проблема выходит за рамки этого размера, и нам нужны большие хэш-карты, то через некоторое время количество битов, описывающих один элемент, безусловно, также увеличится, когда у нас закончатся возможные описываемые различные элементы. Например, если мы использовали хэш-карту для хранения 32-битных чисел, а позже мы увеличили размер задачи, чтобы у нас было более 2 ^ 32-битных элементов в хеш-карте, тогда отдельные элементы будут описаны с более чем 32 битами.
Число битов, необходимых для описания отдельных элементов, равно log (N), где N - максимальное количество элементов, поэтому значения get и put действительно равны O (log N).
Если вы сравните его с древовидным набором, который равен O (log n), тогда хэш-набор равен O (long (max (n))), и мы просто чувствуем, что это O (1), потому что в определенной реализации max (n) является фиксированным, не изменяется (размер хранимых нами объектов измеряется в битах), а алгоритм вычисления хеш-кода работает быстро.
Наконец, если бы нахождение элемента в какой-либо структуре данных было O (1), мы бы создали информацию из ничего. Имея структуру данных из n элементов, я могу выбрать один элемент n различными способами. С этим я могу закодировать информацию бита log (n). Если я могу закодировать это в нулевом бите (это означает, что O (1)), то я создал бесконечно сжатый алгоритм ZIP.