Я бы использовал первое для простоты и скорости, но, возможно, второе может сэкономить место.
Вам не нужен элемент char letter
ни в одном коде.Это избыточно, потому что способ поиска слова состоит в том, чтобы взять букву ключа и использовать его либо как индекс в массиве subNode, либо как ключ в вашей карте, чтобы выбрать subNode.В любом случае, вам никогда не нужно смотреть на letter
.
То, как вы узнаете, что слово отсутствует в три, - это если вы нажали нулевой подузел, или если вы исчерпали свой ключ, не нажав isWord
subnode.
Кстати, если ваша строка не содержит слишком много слов, и если она не меняется очень часто, вы всегда сэкономите порядка порядка скорости, преобразовав ее в специальный код.
РЕДАКТИРОВАТЬ Под специальным кодом я подразумеваю, что три представляет собой разновидность конечного автомата, а конечный автомат - своего рода программу.Таким образом, вы пишете программу для чтения отсортированного словаря, но вместо построения структуры данных trie, она пишет программу на вашем любимом языке, которая выглядит следующим образом:
// XYZ is the prefix string that corresponds to a node in the trie
bool XYZFunc(char* key){
switch (*key){
case '\0': return true /* if XYZ is a valid word, else false */; break;
case 'a': return XYZaFunc(key+1); break;
case 'b': return XYZbFunc(key+1); break;
// etc. etc.
}
}
Это может быть много функций, но в разумных пределах компилятор должен быть в состоянии справиться с этим.Затем, чтобы найти слово, вы просто вызываете функцию верхнего уровня, и она возвращает true или false.На каждом узле компилятор определит, нужна ли ему таблица переходов, поэтому вам не нужно об этом беспокоиться.