Вы можете достичь O(1)
, если предварительно выделите N записей массив и хэш ключ к этим N значениям ,
Но тогда, если у вас хранится более N записей, возникает коллизия. Таким образом, для каждого ключа в массиве у вас есть список значений . Так что это уже не точно O(1)
. Сканирование самого списка будет O(m)
, где m - среднее число столкновений.
Example with hash = n mod 3
0 --> [0,a] [3,b] ...
1 --> [1,a] [4,b] [7,b] ...
2 --> [2,a] [5,b] ...
В какой-то момент становится плохим, что вы тратите больше времени на просмотр списка значений для потенциального ключа, чем на другую структуру с O(log n)
временем поиска, где n - общее количество записей.
Конечно, вы можете выбрать N настолько большим, что массив / хэш будет быстрее, чем B-Tree. Но массив имеет фиксированный предварительно выделенный размер. Так что если N = 1000 и вы сохраняете 3 значения, вы потеряли 997 слотов в массиве.
Так что это, по сути, компромисс производительности компромисс. Для небольшого набора значений отлично подходит array
и хеширование. Для большого набора значений наиболее эффективны B-Tree
.