Beh banale se il dizionario è ordinato alfabeticamente.
"ciao"
1 trovi c
2 in c trovi i
3 in i trovi a
4 in a trovi o
unico confronto
fine
Come puoi vedere non si va a ricerca, ma si trova esattamente ciò che si cerca.
Infatti "Ciao" si trova sicuramente nelle parole che iniziano per C, e già ne cassi un 90%.
Di questo 10% puoi togliere tutte quelle che non iniziano per ci... eccetera.
Sicuramente è più efficiente di confrontarle sempre tutte.
"Pseudo"codice:
Codice:
unsigned int start = 0;
unsigned int end = length of Dictionary;
unsigned int index = 0;
bool letterFound = false;
string myWord;
string word;
while( !wordFound )
{
for(unsigned int i = start; i < end; i++)
{
word = Dictionnary[i];
//la prima volta che il carattere n della mia parola e' uguale al carattere n
//del dizionario, e' iniziato l'intervallo che ci interessa
if(!letterFound && word[index] == myWord[index])
{
start = i;
letterFound = true;
}
//la prima volta che e' diversa dopo essere stata uguale, l'intervallo e' finito.
if(letterFound && word[index] != myWord[index])
{
end = i;
letterFound = false;
index++;
break;
}
}
//se start ed end sono uno accanto all'altro, abbiamo trovato la parola.
if(end == start+1)
return Dictionary[start];
}
Ecco, dovrebbe funzionare

E' sempre piu' veloce di un algoritmo standard, in quanto non fa paragoni fra stringhe ma solo fra chars, e uno alla volta.
In piu', se la parola e' tipo abaco, fa 3 cicli e finisce.
Certo se e' ZUZZURELLONE ci mette cmq una svaria, anche se meno di altri algoritmi

Un'idea per migliorarlo è implementare un controllo "in avanti" e uno "all'indietro", in maniera da minimizzare lo spreco per le ultime lettere.
@Nico: guarda che 50.000 (numero medio di parole in un dizionario) char[20] occupano solamente 976kb... non credo ci sia alcun problema, Gears of War occupa 980 mb
