Недавно у меня возникла проблема с массивом, который содержал несколько сотен тысяч значений, и единственное, что я хотел сделать, это проверить, присутствует ли уже какое-либо значение. В моем случае это были IP из журнала веб-сервера. Так что в основном что-то вроде:
in_array(ip2long(ip),$myarray)
сделало свою работу
Однако время поиска резко увеличилось, и поиск 10 тысяч значений занял около 17 секунд или около того.
Поэтому в данном случае мне было все равно, есть ли у меня дубликаты или нет, мне просто нужно было проверить их существование. Поэтому я мог хранить IP в индексе следующим образом:
isset($myarray[ip2long($ip)])
И бум, время поиска уменьшилось с 17 секунд (и более) до статического времени 0,8 секунды для 10k поиска. В качестве значения для записи в массиве я просто использовал int 1
.
Я думаю, что индекс массива, вероятно, основан на каком-то b-дереве, которое должно иметь log(n) время поиска, а индекс - на хэшмапе.
В моем случае использование индекса сработало нормально, но есть ли структуры данных, где я могу использовать хэшмапы в качестве индекса значения, где также могут встречаться множественные значения (я понимаю, что это имеет смысл только если у меня нет слишком много дубликатов и я не могу эффективно использовать запросы диапазона/поиска, что является основным преимуществом древовидных структур)?