Если вам разрешено игнорировать регистр, который я предполагаю, тогда сделайте все слова в вашем словаре и все поисковые термины в одном и том же регистре раньше всего. Верхний или нижний регистр не имеет значения. Если у вас есть некоторые слова, которые чувствительны к регистру, а другие нет, разбейте слова на две группы и выполните поиск по каждому из них отдельно.
Вы соответствуете только словам, поэтому вы можете разбить словарь на массив строк. Поскольку вы выполняете только точное совпадение с известной длиной, разбейте массив слов на отдельный массив для каждой длины слова. Таким образом, byLength [3] - это массив всех слов длиной 3. Каждый массив слов должен быть отсортирован.
Теперь у вас есть массив слов и слово с потенциальными символами подстановки, которые можно найти. В зависимости от того, где находятся символы подстановки, есть несколько подходов.
Если в поисковом запросе нет подстановочных знаков, выполните двоичный поиск в отсортированном массиве. Вы можете сделать хеш в этот момент, который будет быстрее, но не намного. Если в подавляющем большинстве ваших поисковых запросов нет подстановочных знаков, рассмотрите хеш-таблицу или ассоциативный массив с ключом хеш-функции.
Если поисковый термин имеет подстановочные знаки после некоторых буквенных символов, то выполните двоичный поиск в отсортированном массиве, чтобы найти верхнюю и нижнюю границы, затем выполните линейный поиск в этой границе. Если все символы подстановки завершаются, то достаточно найти непустой диапазон.
Если поисковый термин начинается с подстановочных знаков, то отсортированный массив не поможет, и вам нужно будет выполнить линейный поиск, если вы не сохраните копию массива, отсортированного по задним строкам. Если вы создаете такой массив, то выбирайте его в любое время, когда в конце больше лидирующих литералов Если вы не разрешаете использовать символы подстановки, то в этом нет необходимости.
Если поисковый термин начинается и заканчивается символами подстановки, то вы застряли с линейным поиском в словах одинаковой длины.
Итак, массив массивов строк. Каждый массив строк сортируется и содержит строки одинаковой длины. При необходимости дублируйте всю структуру с помощью сортировки на основе строк в обратном направлении для случая с подстановочными знаками.
Общий пробел составляет один или два указателя на слово плюс слова. Вы должны иметь возможность хранить все слова в одном буфере, если позволяет ваш язык. Конечно, если ваш язык не позволяет, grep, вероятно, быстрее в любом случае. Для миллиона слов это 4-16 МБ для массивов и аналогичные для реальных слов.
Для условия поиска без подстановочных знаков производительность будет очень хорошей. С подстановочными знаками иногда будут происходить линейные поиски по большим группам слов. С разбивкой по длине и одним лидирующим символом вам никогда не придется искать больше, чем несколько процентов от общего словаря, даже в худшем случае. Сравнение только целых слов известной длины всегда будет быстрее, чем сопоставление общих строк.