ktory posiada az 2,7 miliona polskich odmienionych slow, wiec nie moze byc zbyt wiele liter w alfabecie, ani za dlugich slow, poniewaz wyszukanie wszystkich nawet 4-literowych slow moglo by potrwac kilka dni, narazie zajmuje to okolo 30 sec. |
Jeśli lista słówek polskich które masz zapisanych (najlepiej) w jednym pliku po czym je zapisujesz do (najlepiej) wektora na pamięci ram to szukanie nie powinno trwać dłużej niż kilka setnych sekund, a dokładnie...
szukając tzw. sposobem logarytmicznym który jest bardzo szybki w przeciwieństwie do liniowego (które po kolei sprawdza) będzie znacznie lepszym szukaniem.
Ów sposób mi się kojarzy z metodą dziel i zwyciężaj.
Podobnie jest jak się gra w zgadywanie liczb np z przedziału od 1 do 10.
Pytasz się czy większe niż pięć? Odp.: NIE.
Czy większe niż 2? Odp.:TAK.
Czy większe niż 3? ODP.: NIE.
Więc już wiesz że to liczba 3...
Tak samo z szukaniem słówek. Porównujesz połowę czy jest od niej większe. Tak to porównujesz połowę górnej części, nie to połowę dolnej części. Później znów dzielisz na połowę i tak dalej... aż dojdziesz do tego właściwego momentu gdzie będziesz wiedział że to ten wyraz.
Szukanie to nazywa się logarytmiczne gdyż można obliczyć z wzoru log
2(n)=x
gdzie: n to ilość słówek (2,7 mln),
x to ilość sprawdzeń ile wykonamy
czyli inaczej 2
x=n
Z tego co mi powiedział kalkulator to sprawdzeń będzie: 21,4... czyli w najlepszym wypadku porównasz 21 słówek a w najgorszym 22 i statystycznie co 4 słówko na 10 będzie wymagało 1 więcej sprawdzeń. A jak wiadomo 22 porównań strcmp() to nic wielkiego :)
Podam przykładowy kod funkcji która wyszukuje z uporządkowanego wektora (lekko przerobiony kod Jerzego Grębosza, mam nadzieje że nie będzie za to zły :))
Nie wiem jak przetrzymujesz dane ale założyłem że to wektor stringów
#include <string>
size_t znajdz( vector < string >& wec, string & szuk )
{
size_t dobry = 0,
szperacz = 0;
if( !wec.size() )
{
return - 1;
}
if( wec[ 0 ] == szuk )
{
return 0;
}
for( int skok = wec.size() - 1;; skok = skok / 2 )
{
if( skok == 0 ) skok = 1;
szperacz += skok;
if( strcmp( wzor, wec[ szperacz ].c_str() ) > 0 )
{
dobry = szperacz;
if( szperacz == wec.size() )
{
return - 1;
}
}
else
{
if( wzor == wec[ szperacz ] )
{
return szperacz;
}
if( skok == 1 )
{
return - 1;
}
else {
szperacz = dobry;
}
}
}
}
Nie jestem pewny co do 100% działalności kodu ale powinien działać.
Jeśli inaczej przechowujesz dane (chociaż ten sposób bym polecał), to przerób tę funkcję
PS. jeśli wiesz co to mapa (lub dobitniej - słownik) w programowaniu to to by było najlepsze rozwiązanie ;]