重复字符串的判定问题(kmp 算法之优化版本)
2017-08-09 12:21
375 查看
上一篇文章 重复字符串的判定问题(kmp 算法) 给出了基于 kmp 算法的字符串重复判定思路,
但是在使用这个算法判定一个长度为 1024*1024*1024 的字符串是否重复时(编译为 32 位程序),内存爆掉了,这提示了该算法很占用内存。
是的,字符串全部加载到内存里面需要一份内存,t1 数组需要四倍于它的内存(int 数组,长度与串一致)。那么,空间上可以优化吗 ?答案是可以的,在那篇剖析 kmp 算法的文章中实际上已经点明了它的本质: t1 数组记录的是每个子串前后缀匹配的长度,在计算子串 [0, n) 的这个值时,其实已经不用保存前面
n-2 个子串的 t1 值了。所以按如下改进后的算法优化空间复杂度。
算法:另外一种省空间的方法去求 T1 数组最后一个元素
/*
设当前针对[0,x] 求得的最长前后缀相等的长度为 t,有以下规则
a). 字符区间相等关系: [0,t-1]=[x-t+1,x], [0,2t-x-2]=[x-t+1,t-1], [0,3t-2x-1]=[x-t+1,2t-x]......
b). 以上各区间 t, 2t-x-1, 3t-2x-2, .... 项数依次少 x-t+1
c). 字符相等关系: [x]=[x-(x-t+1)]=[x-2(x-t+1)]=......=[x-n(x-t+1)]
1.x=0 时 t=0
2.
置 fnd=0
do
--- 若 t=0, 则 t=([x]==[0]), fnd=1
--- 若 t!=0
--- 若 [t]==[x] 则 t=t+1, fnd=1
--- 若 2t>x-1 且 [2t-x-1]==[x] 则 t=2t-x-1, fnd=1
--- 若 3t>2x-2 且 [3t-2x-2]== [x] 则 t=3t-2x-2, fnd=1
--- ...
--- 若 fnd=1 则 t=([x]==[0]), fnd=1
end
代码见:https://github.com/juniorfans/repeatString
但是在使用这个算法判定一个长度为 1024*1024*1024 的字符串是否重复时(编译为 32 位程序),内存爆掉了,这提示了该算法很占用内存。
是的,字符串全部加载到内存里面需要一份内存,t1 数组需要四倍于它的内存(int 数组,长度与串一致)。那么,空间上可以优化吗 ?答案是可以的,在那篇剖析 kmp 算法的文章中实际上已经点明了它的本质: t1 数组记录的是每个子串前后缀匹配的长度,在计算子串 [0, n) 的这个值时,其实已经不用保存前面
n-2 个子串的 t1 值了。所以按如下改进后的算法优化空间复杂度。
算法:另外一种省空间的方法去求 T1 数组最后一个元素
/*
设当前针对[0,x] 求得的最长前后缀相等的长度为 t,有以下规则
a). 字符区间相等关系: [0,t-1]=[x-t+1,x], [0,2t-x-2]=[x-t+1,t-1], [0,3t-2x-1]=[x-t+1,2t-x]......
b). 以上各区间 t, 2t-x-1, 3t-2x-2, .... 项数依次少 x-t+1
c). 字符相等关系: [x]=[x-(x-t+1)]=[x-2(x-t+1)]=......=[x-n(x-t+1)]
1.x=0 时 t=0
2.
置 fnd=0
do
--- 若 t=0, 则 t=([x]==[0]), fnd=1
--- 若 t!=0
--- 若 [t]==[x] 则 t=t+1, fnd=1
--- 若 2t>x-1 且 [2t-x-1]==[x] 则 t=2t-x-1, fnd=1
--- 若 3t>2x-2 且 [3t-2x-2]== [x] 则 t=3t-2x-2, fnd=1
--- ...
--- 若 fnd=1 则 t=([x]==[0]), fnd=1
end
代码见:https://github.com/juniorfans/repeatString
相关文章推荐
- 重复字符串的判定问题(kmp 算法)
- 重复字符串的判定问题(质数检验法)
- KMP 算法并非字符串查找的优化 [转]
- KMP 算法并非字符串查找的优化
- 字符串是否包含问题--算法学习--不断优化才是算法的王道
- 关于数组字符串中重复的值问题类似算法题
- KMP 算法并非字符串查找的优化 [转]
- 【java】RC4加密转16进制获取长度为40的不重复优惠码字符串 【未优化版本】
- 算法:字符串字符重复问题
- 子字符串substring 问题 - KMP 字符串匹配算法备忘录
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 算法导论 32.4-5 字符串的循环旋转问题
- 从最大子段和问题看算法的优化问题
- 精确覆盖问题学习笔记(五)——优化算法的实现代码
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符
- 关于优化在兼容IE低版本的问题
- [POJ2406&POJ1961]用KMP解决字符串的循环问题两例
- FragmentTabHost的使用和重复创建问题的优化
- ListView优化机制及滑动时数据时出现的数据错乱重复问题
- 蛮力法:设计算法求解字符串的模式匹配问题,并编程实现。