Próbuję napisać moduł sprawdzania pisowni, który powinien działać z dość dużym słownikiem. Naprawdę chcę efektywnego sposobu indeksowania danych słownikowych za pomocą odległości Damerau-Levenshteina w celu ustalenia, które słowa są najbliższe błędnie napisanemu słowu.
Szukam struktury danych, która dałaby mi najlepszy kompromis między złożonością przestrzeni a złożonością środowiska wykonawczego.
Na podstawie tego, co znalazłem w Internecie, mam kilka wskazówek dotyczących tego, jakiej struktury danych użyć:
Trie
To jest moja pierwsza myśl i wygląda na dość łatwą do wdrożenia i powinna zapewnić szybkie wyszukiwanie / wstawianie. Przybliżone wyszukiwanie za pomocą Damerau-Levenshtein powinno być również łatwe do wdrożenia tutaj. Ale nie wygląda to zbyt wydajnie pod względem złożoności przestrzeni, ponieważ najprawdopodobniej masz dużo narzutu dzięki przechowywaniu wskaźników.
Patricia Trie
Wydaje się, że zajmuje to mniej miejsca niż zwykła Trie, ponieważ zasadniczo unikasz kosztów przechowywania wskaźników, ale trochę martwię się fragmentacją danych w przypadku bardzo dużych słowników, takich jak to, co mam.
Drzewo sufiksów
Nie jestem pewien co do tego, wygląda na to, że niektórzy uważają, że jest on użyteczny w eksploracji tekstu, ale nie jestem pewien, co dałoby to pod względem wydajności sprawdzania pisowni.
Drzewo wyszukiwania trójskładnikowego
Wyglądają całkiem ładnie i pod względem złożoności powinny być zbliżone (lepiej?) Do Patricii Tries, ale nie jestem pewien, czy fragmentacja byłaby lepsza niż Patricia Tries.
Burst Tree
To wydaje się hybrydowe i nie jestem pewien, jaką miałoby przewagę nad Tries i tym podobnymi, ale kilkakrotnie czytałem, że jest to bardzo wydajne w przypadku eksploracji tekstu.
Chciałbym uzyskać informacje zwrotne na temat tego, która struktura danych byłaby najlepsza w tym kontekście i co czyni ją lepszą niż inne. Jeśli brakuje mi niektórych struktur danych, które byłyby jeszcze bardziej odpowiednie dla sprawdzania pisowni, jestem również bardzo zainteresowany.