上周比着论文里的PMSP算法,自己用c++实现了(9,2)模体的代码,一开始还挺高兴,跑20秒,但是老师说只需要0.5秒,打击还是挺大的,周一周二自己改了改,改到1.7秒,把改的过程贴一下吧。
PMSP 0.0
(9,2):20s
PMSP 1.0
改进方式:在大C里循环查找模体时,一旦某一行不存在与初始模体小于d的子串,则退出该模体的循环,直接跳到下一模体的循环
效果:
(9,2):4s
(11,3):77s
PMSP 2.0
改进方式:在计算海明距离的时候,给他一个限定值,一旦超出此值,break掉。
效果:
(9,2):2.96s
(11,3):55s
PMSP 3.0
改进方式:观察到结果有重复,于是打算在循环记录第一行的时候,记录下已经循环的第一行的子串,如果第一行再循环后面出现与之海明距离小于d的子串,直接跳过。
效果:
好像是改进方式不太对,少计算了一些模体,不能这样做.....3.0改进以失败告终,但是思路好像有点道理,再仔细琢磨一下。
PMSP 4.0
改进方式:把3.0的改进方式放到每一个判断之前,应该才是正确的。
效果:
再每个模体循环之前加判断,时间变得更慢了.....此法行不通...
PMSP 5.0
改进方式:在执行海明距离的判断的时候两个小于或者等于d统一成 小于d+1
效果:
(9,2):1.8s
(11,3):29s
PS:没想到这么一个小小的改进竟然会快这么多
PMSP 6.0
改进方式:在形成大C的时候,如果大C的某一行是空值,则退出次次循环直接进入下一次循环。
效果:
(9,2):1.7s
(11,3):29s
基本上没怎么加快速度,因为好像基本上大C的每一行都不是空值。
基本上,改到这,算是到头了。再怎么优化都不会进步太多。
于是...在导师的帮助下,把整个算法的构成打乱,用二进制给ACGT重新编码,进行新的算法的开始,总体框架还是不变的,但是处理的过程全部为数字。
效果很明显,(9,2)模体只需要0.45秒,(11,3)也就5秒,整个过程下来,对我的冲击力还是挺大的,第一次感觉算法不只是改改循环结构改改if判断,还有在字符串的结构上直接改变,受益匪浅。代码就不贴了。