记一个n*m算法复杂度的优化过程
来源:互联网 发布:arm是单片机吗 编辑:程序博客网 时间:2024/06/12 20:00
需求:
一份关键字文件按行存储,数量大概在3-4万。一份待查文件按行存储,大概在150万行左右。
要求遍历关键字文件,找到待查文件中包含该关键字的所有行,然后做聚合计算(本文不讨论聚合计算的问题)。
由于遍历查找的过程是”包含“,因此按照传统方法实现的算法复杂度是n*m.这个实现方法明显是不可接受的。
必须要想出优化方案。
优化方案:
方案一:
由于本人之前对mysql研究比较多,于是想到了myisam引擎的全文索引。具体实现方案是:
1、将待查文件load data到myisam引擎的表里面。
2、对相应的列创建全文索引。
3、遍历关键字文件,调用mysql查询接口查询全文索引表。
方案分析:
经过实践这个方案主要时间消耗在创建索引上,因为mysql的全文索引是比较耗时的,查询耗时也不少,平均在1.5秒左右。
不过比起最原始的方案,已经有了比较明显的优化,但还是不能满足最终性能的要求。
方案二:
想到了之前研究lucene的时候倒排序索引的原理,是可以借鉴过来的。具体实现方案是:
1、对待查文件每行进行分词。
2、将切好的词与待查文件的每行建立映射关系,key:关键字,value:待查文件的行的list.
3、查询时之间map.get(key)就行。
主要讲讲分词。
对于分词当然就需要词库,这里很简单,关键字文件就是词库。也就是说拿关键字作为词库对待查文件的每行进行分词,然后建立二者之间的mapping关系。
其实这就是一个倒排序的过程,算法复杂度由n*m降低到了n的复杂度。
对于分词工具得选择,我采用了mmseg4j,但mmseg4j有个弊端,如果词库中有中文+ask码字符的词时,它是不能按要求切分的。
于是看了下mmseg4j的源码,简单的修改了下源码,实现了我的要求。
第一次写博客,如果有不准确的地方请大家多多指导。
0 0
- 记一个n*m算法复杂度的优化过程
- 求n^m 时间复杂度log(m)的算法
- 一个O(n)复杂度的排序算法
- 约瑟夫问题,从o(n*m)到o(n)乃至o(m)的算法复杂度进阶
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 用一个复杂度为O(n)的算法找出回文
- KMP 算法。。。 字符串匹配 ,复杂度 O(n+m)
- 一个递归算法求f(m,n)的问题.
- 将m,n(m>n)的连续自然数序列,打乱顺序重新排列,随机取出一个数,试问取出的这个数是多少?使用一种解法,时间复杂度O(m-n),空间复杂度O(1)
- 算法兴趣-----求两个已排序数组的交集和并集(算法复杂度O(N+M))
- 如何用O(n)时间复杂度查找第k大数的优化算法 C++程序
- 对经典算法百鸡百钱问题的优化解决,使其时间复杂度为n。
- 起泡算法的最佳复杂度O(N)
- java验证码识别--5
- 日期格式定制
- 读《Exploring GNU radio》笔记——初始gnuradio
- 如何用js得到当前页面的url信息方法(JS获取当前网址信息)
- 用html5的websocket实现的文件上传,支持断点续传,妙传。
- 记一个n*m算法复杂度的优化过程
- 如何识别高级的验证码
- bash使用基础
- C++学习(三)
- 常见验证码的弱点与验证码识别
- Eclipse使用学习笔记
- block,inline和inline-block概念和区别
- 如何将TextView内容放到屏幕正中间
- linux oracle 服务自动启动、关闭