Mam następującą sytuację: Mam dużą kolekcję ciągów (powiedzmy 250.000+) o średniej długości może 30 lat. Co muszę zrobić zrobić, to zrobić wiele przeszukiwań w ramach tych .. głównie te będą z StartsWith i Contains rodzaju.jaka jest najszybsza struktura/algorytm zbierania ciągów dla startswith i/lub zawiera wyszukiwania
Kolekcja jest statyczna w czasie wykonywania. Co oznacza, że pierwsze czytanie i wypełnianie wybranego zbioru odbywa się tylko raz. Dlatego wydajność budowania danych nie jest absolutnie ważna. Pamięć również nie stanowi problemu: co oznacza, że nie mam nic przeciwko posiadaniu dwóch kolekcji z tymi samymi danymi w każdym z nich, jeśli jest to potrzebne (np. Dla startwith i innego dla zawiera). Jedyne, co ma znaczenie, to skuteczność wyszukiwań, które powinny zwracać wszystkie elementy pasujące do wyszukiwanego hasła.
Na początku natrafiłem na Trie lub Radix-tree .. ale może są jeszcze lepsze wybory?
Dla zawiera .. Nie mam jeszcze żadnego dobrego pomysłu (poza uruchomieniem kwerendy linq na liście, która nie będzie bardzo szybka z taką ilością danych).
Z góry dziękuję wszystkim!
zmiana: zapomniałem ważną rolę: Zawiera mam na myśli żadnych dokładnych dopasowań w kolekcji .. ale chcę znaleźć wszystkie sznurki w kolekcji zawierających daną searchstring
Czy podciąg dla wyszukiwania zawiera słowo lub pojedyncze znaki? Zastanawiam się, czy zbudowanie indeksu miałoby sens w tym przypadku. –
Powinno obsługiwać znaki. Chociaż ze względu na wydajność mogłem sobie wyobrazić, że przed wyszukiwaniem otrzymam minimalną długość 3 lub więcej znaków. (może myśleć o tym jak autouzupełnianie w polu tekstowym, które wrzuca tylko po wprowadzeniu niektórych znaków) – Mikk
Wyszukaj w internecie hasło "Rabin Karp". To powinno Ci zacząć, ponieważ ma kilka algorytmów wyszukiwania powiązanych ... http: //www.stoimen.com/blog/2012/04/02/algorytmy komputerowe-rabin-karp-string-searching/Pomyśl również o korzystaniu z filtru Blooma i wstępnym ładowaniu go za pomocą łańcuchów podczas uruchamiania. – JimR