Существуют ли в PHP структуры данных, альтернативные массиву, в которых я могу использовать различные методы работы с индексами?

Недавно у меня возникла проблема с массивом, который содержал несколько сотен тысяч значений, и единственное, что я хотел сделать, это проверить, присутствует ли уже какое-либо значение. В моем случае это были IP из журнала веб-сервера. Так что в основном что-то вроде:

in_array(ip2long(ip),$myarray) сделало свою работу

Однако время поиска резко увеличилось, и поиск 10 тысяч значений занял около 17 секунд или около того.

Поэтому в данном случае мне было все равно, есть ли у меня дубликаты или нет, мне просто нужно было проверить их существование. Поэтому я мог хранить IP в индексе следующим образом:

isset($myarray[ip2long($ip)])

И бум, время поиска уменьшилось с 17 секунд (и более) до статического времени 0,8 секунды для 10k поиска. В качестве значения для записи в массиве я просто использовал int 1.

Я думаю, что индекс массива, вероятно, основан на каком-то b-дереве, которое должно иметь log(n) время поиска, а индекс - на хэшмапе.

В моем случае использование индекса сработало нормально, но есть ли структуры данных, где я могу использовать хэшмапы в качестве индекса значения, где также могут встречаться множественные значения (я понимаю, что это имеет смысл только если у меня нет слишком много дубликатов и я не могу эффективно использовать запросы диапазона/поиска, что является основным преимуществом древовидных структур)?

14
задан The Surrican 21 January 2012 в 15:56
поделиться