Mam ogromną listę sekwencji wielobajtowych (pozwala nazywanie ich słowami), które muszę przechowywać w pliku i że muszę mieć możliwość szybkiego wyszukiwania. Ogromny oznacza: około 2 miliony z nich, każde o długości 10-20 bajtów.Kompresja i wyszukiwanie ogromnej listy słów
Ponadto, każde słowo musi mieć tag wartości związanej z nim, tak, że mogę używać, aby odwoływać się więcej (zewnętrzne) danych dla każdej pozycji (stąd, słownik moduł sprawdzania pisowni nie działa tutaj jak tylko to zapewnia test trafień).
Gdyby to było tylko w pamięci i gdyby pamięć była dużo, mógłbym po prostu przechowywać wszystkie słowa w haszowanej mapie (zwanej też słownikiem, inaczej pary klucz-wartość) lub w posortowanej liście dla wyszukiwania binarnego.
Jednak chciałbym mocno skompresować dane, a także wolałbym nie czytać danych w pamięci, a raczej wyszukiwać w pliku.
Ponieważ słowa w większości oparte są na języku angielskim, istnieje pewne prawdopodobieństwo, że pewne "sylaby" w słowach występują częściej niż inne - co jest prawdopodobnie pomocne dla wydajnego algorytmu.
Czy ktoś może wskazać mi skuteczną technikę lub algorytm?
A może nawet przykłady kodu?
Aktualizacja
ja zorientować, że coś Dawg lub podobnych trasach ścieżkę do wspólnych przyrostków w ten sposób nie będzie pracować dla mnie, bo wtedy nie będzie mógł oznaczyć każdą pełną ścieżkę słowo z osobą wartość. Gdybym miał wykryć pospolite sufiksy, musiałbym umieścić je w ich własnym słowniku (tablicy odnośników), aby węzeł trie mógł je odnieść, ale węzeł zachowałby swój własny węzeł końcowy do przechowywania wartości znacznika tej ścieżki.
W rzeczywistości, to prawdopodobnie do zrobienia:
Zamiast budować węzły TREE tylko pojedyncze znaki, mogę spróbować znaleźć często używane sekwencje znaków, i zrobić węzeł dla tych, jak również. W ten sposób pojedyncze węzły mogą pokrywać wiele znaków, co może prowadzić do lepszej kompresji.
Teraz, jeśli jest to wykonalne, jak mógłbym znaleźć często używane podsekwencje we wszystkich moich wyrażeniach? Przy około 2 milionach zdań składających się zwykle z 1-3 słów, będzie ciężko uruchomić wszystkie permutacje wszystkich możliwych podłańcuchów ...
20 bajtów * 2 miliony = 40Mb. To minimalnie w porównaniu do typowej ilości pamięci w komputerze. Jeśli przechowujesz je w posortowanej tablicy, użyjesz wyszukiwania binarnego do wyszukiwania, a prawie wcale nie potrzebujesz dodatkowej pamięci. – jkff
Tak, 40mb to niewiele. Jeśli zależy Ci na szybkości, przechowuj dane w pamięci w możliwie najprostszy sposób. – ruslik
Jak napisano poniżej, 40 MB musi pochodzić z aplikacji, a ja lubię, aby rozmiar pobierania aplikacji był znacznie mniejszy. Dodatkowo, to nie jedyna partia. Jest większa część innego zestawu "słów", które nie muszą być możliwe do wyszukania, ale nadal mogą być kompresowane, ponieważ w surowych ciągach będzie to około 1 GB. Kiedy znalazłem odpowiednie algo dla powyższego, mam nadzieję, że użyję go na tym innym, większym, również zestawie. –