解谜:寻找所有单词在PHP中的长单词(Puzzle Solving: Finding All Wor

2019-06-23 12:16发布

所以,我有话3到20个字符之间的数据库。 我想代码PHP的东西,发现所有这些都包含在一个更大的字中的小词。 例如,在单词“向内”有词“雨”,“赢”,“摆脱”,等等。

起初,我想过(通过Words20 Words3,表示字母在单词数目)添加字段的话表,像“LetterCount” ......例如,“反弹”将被表示为10000000000200000100000010:1种的情况下,字母A,字母B 0的情况下,...字母L等。然后,通过所有每个表中的字(或如果指定的话发现目标长度一个表)的实例2和比较每个字的源字(“向内”在上面的例子中)的LetterCount的LetterCount。

但后来我开始思考,这将地方太多了MySQL数据库的负载,以及PHP脚本,呼吁每一个字的LetterCount,比较每一个数字与源字,等。

是否有这样做的更简单,也许更直观的方式? 我打开使用存储过程是否会以任何方式帮助开销。 只是一些建议,将不胜感激。 谢谢!

Answer 1:

这里有一个简单的解决方案,应该是相当有效的,但只会工作到话(可能约15-20个字符一定规模,会分解,取决于组成的字母词是否是低频率字母与较低的值或具有较高值的​​高频字母):

  1. 根据它的频率为每一个字母一个素数。 所以e是2, t = 3, a使用来自频率值= 5,等等这里或一些类似源。
  2. 通过在字母词的主要值乘以预先计算每个单词在你的单词列表的价值,并在表存储在一个bigint数据类型列。 例如, tea将具有值3*2*5=30 。 如果一个字有重复字母,重复因子,使teat应具有值3*2*5*3=90
  3. 当如果一个字,如检查rain ,包含在另一个字内,如inward ,这是足够的,以检查是否该值rain划分值inward 。 在这种情况下, inward = 14213045rain = 7315 ,和14213045是整除7315 ,所以字rain是单词内inward
  4. BIGINT列马克塞斯在9223372036854775807 ,这应该是细至多约15-20个字符(取决于字母在字中的频率)。 举例来说,我从拿起第一个20个字母的单词在这里 ,这是anitinstitutionalism ,并具有一个值6901041299724096525这将只是勉强符合BIGINT列内。 然而,14个字母的单词xylopyrography的数值为635285791503081662905 ,这是太大了。 您可能需要处理真正路数作为特殊情况下使用的另一种方法,但我希望有足够他们几个,它仍然会是比较有效的。

查询会的工作有点像演示中,我已经在这里准备: http://www.sqlfiddle.com/#!2/9bd27/8



文章来源: Puzzle Solving: Finding All Words Within a Larger Word in PHP