2013-05-21 10 views
7

Mam słownik składający się ze słów i ich transkrypcji fonetycznych. Słowa są pisane małymi literami, więc nie uwzględnia się rozróżniania wielkości liter.C++ Najskuteczniejszy sposób przechowywania, ładowania i przeglądania leksykonu

Leksykon jest naprawdę ogromny i muszę go szybko załadować po uruchomieniu aplikacji. Wolałabym czytać go bez czytania każdego wpisu osobno.

Chyba tak, jak przechowywać i ładować go również wpływa, jak się zachować w pamięci leksykon

Dziękuję za wszelkie pomysły.

+1

Jak duży jest "naprawdę ogromny"? Czy planujesz załadować cały leksykon w pamięci aplikacji lub odczytać go z pliku lub bazy danych? Ponadto, jakie rodzaje operacji będzie trzeba wykonać w sposób efektywny? Głównie wyszukiwanie lub wyliczanie? –

+0

Naprawdę ogromne znaczenie 200.000 słów. Chciałbym załadować go do pamięci. Muszę tylko wyszukiwać słowa, nie pisać ani wyświetlać. – tmighty

+0

Czy szukasz "literówek" i "dzikich znaków"? –

Odpowiedz

4

Prawdopodobnie chcesz zapisać to jako Trie

Jest to skuteczny sposób przechowywania słownika. Spójrz na następujących odpowiedzi, aby uzyskać więcej informacji

http://en.wikipedia.org/wiki/Trie

https://stackoverflow.com/questions/296618/what-is-the-most-common-use-of-the-trie-data-structure

Persisting a trie to a file - C

+1

Należy pamiętać, że o ile nie zostanie podjęta szczególna ostrożność, trie będzie miało dość znaczące wymagania dotyczące pamięci. –

+1

Chociaż poprawnie wykonane, trie jest prawdopodobnie najbardziej skutecznym sposobem przechowywania słownika, dzięki kompresji prefiks. – Damon

4

kilka opcji przychodzą na myśl:

  1. można użyć sqlite, która wykorzystuje mmap do mapy plik do pamięci, do przechowywania leksykonu, więc tylko to, co jest dostępne, zostanie odczytane. Jest to prawdopodobnie rozsądne szybkie i niezawodne, a także najłatwiejsze do wdrożenia.
  2. Można mmap samemu plik
  3. Zastosowanie seek operacje, aby przesunąć wskaźnik pliku przez plik bez czytania całość. Pomoże to tylko wtedy, gdy leksykon będzie miał jakąś strukturę, abyś mógł znaleźć właściwą pozycję bez czytania wszystkiego, tj. Musi to być struktura danych, która pozwala na lepsze niż wyszukiwanie O (n) (zazwyczaj jest to dobry wybór, ponieważ sugerowane przez Salgara).
+0

Powiedzmy, że mapuję plik na pamięć i wiem, w których pozycjach zaczynają się słowa (na przykład: słowa "a" zaczynają się od pozycji 1, słowa "b" zaczynają się od pozycji 93229), w jaki sposób mogę uporządkować mój plik? Czy muszę pracować z ustalonymi długościami lub co miałeś na myśli przez mmapping pliku? – tmighty

+0

Moja aplikacja jest prostym kodem C++ bez bibliotek osób trzecich i chociaż uwielbiam SQLite, wolałbym nie używać go w tym przypadku. – tmighty

+0

Połączyć dwie odpowiedzi i mmap a trie. – Oktalist

Powiązane problemy