=================================版权声明=================================

版权声明:本文为博主原创文章 未经许可不得转载 

请通过右侧公告中的“联系邮箱(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

如果上面的分析并不能实现,请偷偷的告诉我。