=================================版权声明=================================
版权声明:本文为博主原创文章 未经许可不得转载
请通过右侧公告中的“联系邮箱(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
如果上面的分析并不能实现,请偷偷的告诉我。