算法——成語首尾接龍 成語接龍


=================================版權聲明=================================

版權聲明:本文為博主原創文章 未經許可不得轉載 

請通過右側公告中的“聯系郵箱(wlsandwho@foxmail.com)”聯系我

未經作者授權勿用於學術性引用。

未經作者授權勿用於商業出版、商業印刷、商業引用以及其他商業用途。                   

 

本文不定期修正完善,為保證內容正確,建議移步原文處閱讀。                                                               <--------總有一天我要自己做一個模板干掉這只土豆

本文鏈接:http://www.cnblogs.com/wlsandwho/p/4609683.html

恥辱牆:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

寫博客要有好題材,因為涉及工作內容的事情不能寫、涉及軟件架構組織的不能寫、涉及核心算法的不能寫,總之各種不能。

自我要求嚴格點還是好的。

終於讓我碰到了一個好題材!哈×N

在QQ群里有人問怎樣實現成語的首尾接龍,關鍵的是,在SQL群里問這個是幾個意思?

征得其同意后,我下載了包含成語的xlsx文件,於是寫了這篇博文。

(此圖一出在群里必然是暴露了 請放過我 保護瀕危物種 愛護動物 人人有責)

=======================================================================

一開始我想看看蟻群算法,因為我覺得比較像,但是專家們的算法都是i、j、k、l、m、n、a、b、c之類的變量名,怪不得算法這么難懂,

嚇得我趕緊把網頁關了。

干脆我自己動手寫一個吧,誰讓我語文學的好呢。

=======================================================================

原諒我沒上過@研,又要丟人現眼了。

正文開始。

=======================================================================

數據源要處理下,確保沒有重復的、而且都是四字的。

(自己多找些成語就行了,放在txt里就行。)

像“小蘿卜頭”可以有,但是“不自由毋寧死”、“以其昏昏使人昭昭”以及“兩把刀”是不能有的。

(然而實際上只要不重復、單個詞語2個字以上是可以。)

=======================================================================

標准四字成語 =首+中+尾(中為2字)

=======================================================================

1 生成字典

map<首 或 中 或 尾,自增id>  //將漢字數字化為數字  a

map<自增id,首 或 中 或 尾>  //將數字反數字化為漢字  b

=======================================================================

2 生成成語詞典

struct CYCD{id,id,id}//將成語數字化為數字結構  //由於成語不重復所以Index實際上也是一個不重復的唯一標識  

map<cycd,自增Index>    //c

map<自增Index,cycd>    //d

=======================================================================

3 生成輔助詞典

multimap<id,index>//提到一個字就可以找到以該字為首的若干成語  //e

=======================================================================

例如 王林森原 創作品未 經許可轉 載必究!(姑且認為這是四個四字成語吧,老是有小網站非法轉載,去投訴又沒人管……求法律援助)

3 5 9 9 50 20 20 30 6 6 80 7

查找過程:

  王林森原  --3次a-- 3,5,9 --c-- Index 

              9 --e-- Index --d-- 9,50,20

                          20 --e-- Index --d-- 20,30,6

                                        6 --e-- Index --d-- 6,80,7

所有的Index組成了結果,只需要

   Index --d-- cycd --3次b-- 王林森原

即可還原為文字。

 

其中“--e-- --d--”可能會找到很多其他的選項,這實際上就變為了多叉樹或者說是圖的深度搜索。

(數字是我臆造的,只是舉個栗子。)

=======================================================================

為了避免出現 ABCD ......A的情形也就是回路情形出現,需要進行檢測。

方法多種多樣,最近剛好看過位圖法排序,用地址塊的位索引來表示一個成語,這樣1或0就是是否出現過。好巧,我的成語詞典也是Index的形式!

這樣應該是可以的。

=======================================================================

成語首尾接龍有時候要求限定的次數內完成,這樣只要一個計數器就行了,超過設定值就放棄這個分支,好像這個叫剪枝處理。

當然,限定指定次數也可以避免回路,不過是被動避免,因為出現回路后必然是無限循環直到計數器超過設定值。

=======================================================================

如此一來 除了可以用來處理成語接龍之外,還可以適用於螞蟻尋路,甚至於地圖導航(首、尾為兩個地點,中間2字可以換為各種參考量)。

另外,保存在map和multimap的數據可以序列化到磁盤文件便於下次加載。(據說Boost Serialization 庫比較好。)

同時,map和multimap也可以隨時加入新的元素,便於擴展。

=======================================================================

數據結構 和 算法分析 做的事情就是 時間換空間 空間換時間 既省空間又省時間的高性能算法通常是晦澀難懂不易維護擴展的

=======================================================================

我這里空間換時間。

實際上只需要2個map和1個multimap,甚至只需要1個map和一個multimap就可以。但是map里面從key到value易、從value到key難!更不要說multimap了。

所以我多寫了2個鏡像map便於查找。

誰讓我不是專業算法工程師呢?

我這個通俗易懂 符合人類語言思維 易於擴展維護

性能什么的還是放過我吧

請叫我數據結構渣

=======================================================================

下面就是有空寫寫代碼了。

到目前為止只是空談,不過應該是可以的,畢竟已經被我簡化成了深度搜索,而且成語字典——數字化和反數字化成語也很好的實現了。

=======================================================================

夜深了 代碼有空寫了再發上來  2015年7月1日 23:47

如果上面的分析並不能實現,請偷偷的告訴我。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM