锁定老帖子 主题:正向最大匹配改进算法
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-02
我写的一个跟现在这个差不多 我发现我们都被满屏的if else困扰啊
ps:银河英雄传好看么...我就只知道杨威利这个角色 |
|
返回顶楼 | |
发表时间:2009-06-02
jenlp520 写道 我写的一个跟现在这个差不多 我发现我们都被满屏的if else困扰啊
ps:银河英雄传好看么...我就只知道杨威利这个角色 等我抽出时间重构一下。 PS:银英很好看,老动画 |
|
返回顶楼 | |
发表时间:2009-06-04
最后修改:2009-06-04
现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊
我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了 DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右 后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右 难道一定要用双数组trie才能把内存降下来么... ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组 ps:附上我没看懂的双数组trie文档 |
|
返回顶楼 | |
发表时间:2009-06-04
中文分词,效果最好的是隐马尔科夫模型。
|
|
返回顶楼 | |
发表时间:2009-06-05
Programmer2.x 写道 中文分词,效果最好的是隐马尔科夫模型。
楼上这个回答文不对题!隐码模型跟楼主说的字串匹配没直接关系。 在中文分词中,隐码模型适合做语法分析,但不见的是效果最好的分词方式。用过中科院的分词器你就知道了。 另外,楼主的想法很好。 给楼主一个提示, 1.在路径上标注匹配的最长词语(这个楼主已经实现) 2.在词典的分支上注明是否还有后续的叶节点(这样可以最快的终止匹配失败) 有了上面的数据结构,不需要使用固定深度递归来试探,能有效的提高效率,而且不会漏掉比递归深度还长的词汇 |
|
返回顶楼 | |
发表时间:2009-06-05
jenlp520 写道 现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊
我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了 DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右 后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右 难道一定要用双数组trie才能把内存降下来么... ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组 ps:附上我没看懂的双数组trie文档 提示你, 1.不要简单的使用String来记录词典的词,那样太占内存 2.有效的设置hashmap的参数loadFactor,建议是0.8(DEFAULT_INITIAL_CAPACITY 只是默认的容量,当不够是,HashMap照样翻倍增加,你的设计基本是没有用的,关键是loadFactor这个参数); 3.尝试动态的结合map和数组。 |
|
返回顶楼 | |
发表时间:2009-06-05
最后修改:2009-06-05
linliangyi2007 写道 jenlp520 写道 现在我很郁闷啊 用之前的做法 2000个关键字消耗内存在15-18M左右 这个大小很恐怖啊
我估计是每个节点一个hashmap太占内存了 然后自己改了下map把原来DEFAULT_INITIAL_CAPACITY = 16改成了 DEFAULT_INITIAL_CAPACITY = 5结果在测试2000个关键字还是用了15M内存左右 后来我又试试不在每个节点里面放一个hashmap而是用个全局的...结果还是用了15M左右 难道一定要用双数组trie才能把内存降下来么... ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组 ps:附上我没看懂的双数组trie文档 提示你, 1.不要简单的使用String来记录词典的词,那样太占内存 2.有效的设置hashmap的参数loadFactor,建议是0.8(DEFAULT_INITIAL_CAPACITY 只是默认的容量,当不够是,HashMap照样翻倍增加,你的设计基本是没有用的,关键是loadFactor这个参数); 3.尝试动态的结合map和数组。 感谢你的建议.. 我字典的词是转成char[]后保存的每个char的 我改DEFAULT_INITIAL_CAPACITY的原因是 我认为大部分节点下的分支不会超过10个 所以我认为Map内的Entry数组不需要默认的16这么大 引用 3.尝试动态的结合map和数组。
这个能否举个例 我现在对用数组实现多分支trie树很困扰 |
|
返回顶楼 | |
发表时间:2009-06-06
最后修改:2009-06-06
jenlp520 写道 感谢你的建议.. 我字典的词是转成char[]后保存的每个char的 我改DEFAULT_INITIAL_CAPACITY的原因是 我认为大部分节点下的分支不会超过10个 所以我认为Map内的Entry数组不需要默认的16这么大 对于Map的空间使用时需要一定的容易的,在默认情况下,HashMap的冗余参数是0.75,也就是说,当你的Map的空间为10时,实际上只能放入7个元素,当第八个元素放入时,Map的空间就要翻倍为20了。因此,设置合理的冗余参数,能有效的抑制多余的空间损耗。当然,负面影响是,Map的命中效率会有所下降 引用 3.尝试动态的结合map和数组。
这个能否举个例 我现在对用数组实现多分支trie树很困扰 判断一个树节点的子节点,但子节点小于一定数量时,可以简单的使用数组存储,查找时直接遍历数组;但子节点大于一定数量时,改为HashMap存储,提高搜索效率 |
|
返回顶楼 | |
发表时间:2009-06-06
jenlp520 写道 ps:请原谅我没学过数据结构...看双数组trie看了半天还是弄清楚怎么去创建数组 ps:附上我没看懂的双数组trie文档 双数组trie树在存储空间上确实做到了最小,不过在其树结构有变化时,比如增加与删除节点,其解决冲突的时间复杂度很高在比较大的字典中,并不适合 |
|
返回顶楼 | |
发表时间:2009-06-06
最后修改:2009-06-06
ansjsun 写道 哦是tire树啊... 楼主弄过双数组tire树么???我一直困惑内个呢.你这么分出来效率咋样啊!! 查询时间复杂度o(1),不过这个分词来说实在太过简单了,做文字过滤倒还有那么一丁点参考价值,具体正在完善中(请别期待,我很懒。。。) PS:linliangyi2007兄这么晚还在线 |
|
返回顶楼 | |