Поэтому у меня есть база данных с длиной от 3 до 20 символов. Я хочу что-то закодировать в PHP, который находит все более мелкие слова, которые содержатся в большом слове. Например, в слове «внутрь» есть слова «дождь», «победа», «избавление» и т. Д.
Сначала я подумал о добавлении поля в таблицы слов (Words3 через Words20, обозначая количество букв в словах), что-то вроде «LetterCount» … например, «ралли» будет представлено как 10000000000200000100000010: 1 экземпляр буква A, 0 экземпляров буквы B, … 2 экземпляра буквы L и т. д. Затем пройдите все слова в каждой таблице (или одну таблицу, если указанная длина найденных слов была указана) и сравните LetterCount каждого слова в LetterCount исходного слова («внутрь» в примере выше).
Но потом я начал думать, что это накладывает слишком большую нагрузку на базу данных MySQL, а также на скрипт PHP, вызывая каждое письмо LetterCount и сравнивая каждую цифру с исходным словом и т. Д.
Есть ли более простой, возможно более интуитивный способ сделать это? Я открыт для использования хранимых процедур, если это поможет с накладными расходами. Только некоторые предложения будут очень признательны. Благодаря!
Вот простое решение, которое должно быть довольно эффективным, но будет работать только до определенного размера слов (вероятно, около 15-20 символов он сломается, в зависимости от того, являются ли буквы, составляющие слово, низкочастотными буквами с более низкими значениями или высокочастотные буквы с более высокими значениями):
e
равно 2, t
= 3, a
= 5 и т. Д., Используя значения частоты отсюда или к некоторому аналогичному источнику. bigint
типа данных bigint
. Например, tea
имел бы значение 3*2*5=30
. Если слово имеет повторяющиеся буквы, повторите коэффициент, так что teat
должна иметь значение 3*2*5*3=90
. rain
, внутри другого слова, например, inward
, достаточно проверить, делит ли значение rain
значение внутри. В этом случае inward = 14213045
, rain = 7315
и 14213045
делится на 7315
, поэтому слово « rain
находится внутри слова inward
. 9223372036854775807
, который должен быть до 15-20 символов (в зависимости от частоты букв в слове). Например, я взял первое 20-буквенное слово отсюда , которое является anitinstitutionalism
, и имеет значение 6901041299724096525
которое едва ли будет вписываться в колонку bigint. Тем не менее, 14-буквенное слово xylopyrography
имеет значение 635285791503081662905
, что слишком велико. Возможно, вам придется обрабатывать действительно большие, как специальные случаи, используя альтернативный метод, но, надеюсь, их недостаточно, чтобы он был относительно эффективным. Запрос будет работать как демонстрация, которую я здесь подготовил: http://www.sqlfiddle.com/#!2/9bd27/8