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