=================================版權聲明=================================
版權聲明:本文為博主原創文章 未經許可不得轉載
請通過右側公告中的“聯系郵箱(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
如果上面的分析並不能實現,請偷偷的告訴我。

