簡體   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