Решение головоломки: поиск всех слов в расширенном Word в PHP

Поэтому у меня есть база данных с длиной от 3 до 20 символов. Я хочу что-то закодировать в PHP, который находит все более мелкие слова, которые содержатся в большом слове. Например, в слове «внутрь» есть слова «дождь», «победа», «избавление» и т. Д.

Сначала я подумал о добавлении поля в таблицы слов (Words3 через Words20, обозначая количество букв в словах), что-то вроде «LetterCount» … например, «ралли» будет представлено как 10000000000200000100000010: 1 экземпляр буква A, 0 экземпляров буквы B, … 2 экземпляра буквы L и т. д. Затем пройдите все слова в каждой таблице (или одну таблицу, если указанная длина найденных слов была указана) и сравните LetterCount каждого слова в LetterCount исходного слова («внутрь» в примере выше).

Но потом я начал думать, что это накладывает слишком большую нагрузку на базу данных MySQL, а также на скрипт PHP, вызывая каждое письмо LetterCount и сравнивая каждую цифру с исходным словом и т. Д.

Есть ли более простой, возможно более интуитивный способ сделать это? Я открыт для использования хранимых процедур, если это поможет с накладными расходами. Только некоторые предложения будут очень признательны. Благодаря!

Вот простое решение, которое должно быть довольно эффективным, но будет работать только до определенного размера слов (вероятно, около 15-20 символов он сломается, в зависимости от того, являются ли буквы, составляющие слово, низкочастотными буквами с более низкими значениями или высокочастотные буквы с более высокими значениями):

  1. Назначьте каждой букве простое число в соответствии с его частотой. Таким образом, e равно 2, t = 3, a = 5 и т. Д., Используя значения частоты отсюда или к некоторому аналогичному источнику.
  2. Предварительно расчитайте значение каждого слова в списке слов, умножив первичные значения на буквы в слове и сохраните их в таблице в bigint типа данных bigint . Например, tea имел бы значение 3*2*5=30 . Если слово имеет повторяющиеся буквы, повторите коэффициент, так что teat должна иметь значение 3*2*5*3=90 .
  3. Когда вы проверяете, содержится ли какое-либо слово, например rain , внутри другого слова, например, inward , достаточно проверить, делит ли значение rain значение внутри. В этом случае inward = 14213045 , rain = 7315 и 14213045 делится на 7315 , поэтому слово « rain находится внутри слова inward .
  4. Столбец bigint выводится на уровне 9223372036854775807 , который должен быть до 15-20 символов (в зависимости от частоты букв в слове). Например, я взял первое 20-буквенное слово отсюда , которое является anitinstitutionalism , и имеет значение 6901041299724096525 которое едва ли будет вписываться в колонку bigint. Тем не менее, 14-буквенное слово xylopyrography имеет значение 635285791503081662905 , что слишком велико. Возможно, вам придется обрабатывать действительно большие, как специальные случаи, используя альтернативный метод, но, надеюсь, их недостаточно, чтобы он был относительно эффективным.

Запрос будет работать как демонстрация, которую я здесь подготовил: http://www.sqlfiddle.com/#!2/9bd27/8