繁体   English   中英

解谜:找出 PHP 中较大单词中的所有单词

[英]Puzzle Solving: Finding All Words Within a Larger Word in PHP

所以我有一个 3 到 20 个字符长的单词数据库。 我想在 PHP 中编写一些代码,以查找包含在较大单词中的所有较小单词。 如“内”字中有“雨”、“赢”、“除”等字。

起初我想在 Words 表中添加一个字段(Words3 到 Words20,表示单词中的字母数),例如“LetterCount”...例如,“rally”将表示为 10000000000200000100000010:1 个实例字母 A,字母 B 的 0 个实例,... 字母 L 的 2 个实例,等等。然后,go 通过每个表中的所有单词(如果指定了找到的单词的目标长度,则为一个表)并比较每个单词的 LetterCount 到源单词的 LetterCount(上例中的“向内”)。

但后来我开始认为这会给 MySQL 数据库和 PHP 脚本带来太多负载,调用每个单词的 LetterCount,将每个数字与源单词的数字进行比较,等等。

有没有更简单、也许更直观的方法来做到这一点? 如果它能以任何方式帮助开销,我愿意使用存储过程。 只是一些建议将不胜感激。 谢谢!

这是一个简单的解决方案,应该非常有效,但只能处理特定大小的单词(可能会分解大约 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 = 731514213045可以被7315整除,所以rain这个词在inward里面。
  4. bigint 列的最大值为9223372036854775807 ,最多可以容纳 15-20 个字符(取决于单词中字母的出现频率)。 例如,我从这里选取了第一个 20 个字母的单词,它是anitinstitutionalism ,它的值为6901041299724096525 ,刚好适合 bigint 列。 但是,14 个字母的单词xylopyrography的值为635285791503081662905 ,这个值太大了。 您可能必须使用替代方法将非常大的情况作为特殊情况处理,但希望它们的数量足够少,这样它仍然会相对有效。

该查询的工作方式类似于我在此处准备的演示: http://www.sqlfiddle.com/#!2/9bd27/8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM