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