词语搜索算法思想 - 第二步 算法思想
2012-02-24 23:36
211 查看
接下来我们来分析这个问题,解决这个问题最核心的思想是,我们要准备一个用户输入的字符和版块对应结构:
key=“天”,value=[“情感天地”、“天涯杂谈”]
key=“娱乐”, value=[ “娱乐八卦”]
key=“t”,value=[“情感天地”、“天涯杂谈”,“贴图专区”,“经济论坛”,“股市论谈”]
key=“ty”, value=[ “天涯杂谈”]
key=“ylbg”, value=[ “娱乐八卦”]
使用一个Map<String, String[]>即可。
有了上面的思路,我们的重点就在于,怎样建立以上这个结构?
换一个角度考虑,我们怎样获得所有的key?
我们来看下现在有点数据:
版块名:娱乐八卦 情感天地 天涯杂谈 贴图专区 国际观察 经济论坛 时尚资讯 莲蓬鬼话 股市论谈 煮酒论史 开心乐园
现在要做到是,把“娱乐八卦”切割成“娱、乐、八、卦、娱乐、八卦、y、l、b、g、yl、bg、ylbg、yu、le、ba、gua、yule、bagua...”。 切割成key的同时,把“娱乐八卦”当作所有这些key的value的一个,那么结构就有了。
我们先实现第一步,切割词语:
输出结果:
第一组、第二组数据可以,第三组数据不理想,比如“u、ul、ule,uleb”等,问题在于拼音搜索中,还是以首个字母为主。
于是进行优化:
输出结果:
:)。
key=“天”,value=[“情感天地”、“天涯杂谈”]
key=“娱乐”, value=[ “娱乐八卦”]
key=“t”,value=[“情感天地”、“天涯杂谈”,“贴图专区”,“经济论坛”,“股市论谈”]
key=“ty”, value=[ “天涯杂谈”]
key=“ylbg”, value=[ “娱乐八卦”]
使用一个Map<String, String[]>即可。
有了上面的思路,我们的重点就在于,怎样建立以上这个结构?
换一个角度考虑,我们怎样获得所有的key?
我们来看下现在有点数据:
版块名:娱乐八卦 情感天地 天涯杂谈 贴图专区 国际观察 经济论坛 时尚资讯 莲蓬鬼话 股市论谈 煮酒论史 开心乐园
现在要做到是,把“娱乐八卦”切割成“娱、乐、八、卦、娱乐、八卦、y、l、b、g、yl、bg、ylbg、yu、le、ba、gua、yule、bagua...”。 切割成key的同时,把“娱乐八卦”当作所有这些key的value的一个,那么结构就有了。
我们先实现第一步,切割词语:
package test; import java.util.ArrayList; import java.util.Arrays; public class Test { public static void main(String[] args) { System.out.println(Arrays.toString(split("娱乐八卦"))); System.out.println(Arrays.toString(split("ylbg"))); System.out.println(Arrays.toString(split("yulebagua"))); } /** * 切割词语 */ public static String[] split(String s) { int len = s.length(); ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < len; i++) for (int j = i + 1; j <= len; j++) list.add(s.substring(i, j)); return list.toArray(new String[list.size()]); } }
输出结果:
[娱, 娱乐, 娱乐八, 娱乐八卦, 乐, 乐八, 乐八卦, 八, 八卦, 卦] [y, yl, ylb, ylbg, l, lb, lbg, b, bg, g] [y, yu, yul, yule, yuleb, yuleba, yulebag, yulebagu, yulebagua, u, ul, ule, uleb, uleba, ulebag, ulebagu, ulebagua, l, le, leb, leba, lebag, lebagu, lebagua, e, eb, eba, ebag, ebagu, ebagua, b, ba, bag, bagu, bagua, a, ag, agu, agua, g, gu, gua, u, ua, a]
第一组、第二组数据可以,第三组数据不理想,比如“u、ul、ule,uleb”等,问题在于拼音搜索中,还是以首个字母为主。
于是进行优化:
package test; import java.util.ArrayList; import java.util.Arrays; public class Test { public static void main(String[] args) { System.out.println(Arrays.toString(split("娱乐八卦"))); System.out.println(Arrays.toString(split("ylbg"))); System.out.println(Arrays.toString(split("yu,le,ba,gua"))); } /** * 切割词语 */ public static String[] split(String s) { int next = 0; String temp = ""; int len = s.length(); ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < len; i++) { if (s.charAt(i) == ',') { next = 0; } else { if (i != 0 && next == 0) next = 1; } if (next == 0) for (int j = i + 1; j <= len; j++) { temp = s.substring(i, j).replace(",", ""); if (temp.length() > 0) list.add(temp); } } return list.toArray(new String[list.size()]); } }
输出结果:
[娱, 娱乐, 娱乐八, 娱乐八卦] [y, yl, ylb, ylbg] [y, yu, yu, yul, yule, yule, yuleb, yuleba, yuleba, yulebag, yulebagu, yulebagua, l, le, le, leb, leba, leba, lebag, lebagu, lebagua, b, ba, ba, bag, bagu, bagua, g, gu, gua]
:)。
相关文章推荐
- 基于C++实现五子棋AI算法思想
- 常用的算法思想(C版)
- 某年某月某日是星期几的算法思想和编程
- 五大常用算法的思想之二:动态规划
- 机器学习——分类算法4:Logistic回归 梯度上升 思想 和 代码解释
- 数据结构 折半查找法(算法思想和源代码)
- 状态转移思想解读:辗转相除(欧几里德)算法及扩展
- MP算法和OMP算法及其思想
- 一种基于平均思想的任务分配算法
- 立体匹配算法之线性扫描思想
- 编程珠玑 - 算法优化 - 过滤敏感词 - 第二步:效率问题
- 常用算法思想之:递归思想
- 算法练习(分治法,分区思想)
- 深度增强学习前沿算法思想【DQN、A3C、UNREAL,简介】
- 五大算法思想—贪心算法
- 程序算法艺术与实践:递归策略基本的思想
- Lasso思想及算法
- 递归算法思想&&一些简单算法实现
- 大数阶乘算法思想,具体实现网上很多,也顺便找了个算法思想
- 基本算法思想之穷举法(C++语言描述)