Ostatnio miałem problem z tablicą zawierającą setki tysięcy wartości i jedyną rzeczą, którą chciałem zrobić, było sprawdzenie, czy wartość była już obecna. W moim przypadku były to adresy IP z dziennika serwera sieciowego. Więc w zasadzie coś takiego:Czy istnieją alternatywne struktury danych niż tablica w PHP, gdzie mogę korzystać z różnych technik indeksowania?
in_array(ip2long(ip),$myarray)
spełnił swoje zadanie
Jednak zwiększona czas odnośnika dramatycznie i 10k z wyszukiwań trwało około 17 sekund lub więcej.
Więc w tym przypadku nie obchodziło mnie, czy mam duplikaty, czy nie, po prostu musiałem sprawdzić istnienie. Mogłem więc przechowywać adresy IP w indeksie tak:
isset($myarray[ip2long($ip)])
i bom czasy lookup spadła z 17 sekund (i więcej) do statycznego czasie 0,8 sekundy za 10k wyszukiwań. Jako wartość wpisu tablicy użyłem właśnie int 1
.
Myślę, że indeks tablicy jest prawdopodobnie oparty na niektórych drzewach b, które powinny mieć log (n) czas wyszukiwania i indeks na mapie.
W moim przypadku używanie indeksu działało poprawnie, ale czy są jakieś struktury danych, w których mogę użyć hashmapów jako indeksu wartości, gdzie wiele wartości może również zająć (zdaję sobie sprawę, że ma to sens tylko wtedy, gdy nie ma zbyt wielu duplikatów i nie mogę efektywnie używać żądań zasięgu/wyszukiwania, co jest podstawową zaletą struktur drzewa?
Niekiedy dobre rozwiązania są tuż przed Tobą i po prostu uważasz, że są zbyt skomplikowane. -- Ładnie wykonane. – Smamatti
Odrzucił to od tego, co rozumiem. –
Używanie isset ($ a [$ key]) jest znacznie (!) Szybsze niż array_key_exists ($ key, $ a), ponieważ isset jest strukturą, a array_key_exists() jest funkcją. – BurninLeo