自己写的一种字符串搜索
来源:互联网 发布:mac os 10.11.6 镜像 编辑:程序博客网 时间:2024/06/02 05:10
去年学数据结构时老师留的作业,写了一种字符串搜索算法。
在longstr中循环查找shortstr元素
举例如shortstr m位.Longstr,n位.
首先在longstr中匹配shortstr的第一个字符。匹配后,从longstr中匹配点后一位开始匹配shortstr的第二个字符,循环直至匹配到shortstr的最后一位字符,判断longstr中匹配点前m-1位是否与shortstr前m-1位相等,若是记录当前位置-m+1.若否重复先前工作.直至longstr的最后一位。
举例:
最坏的情况也只是longstr中每个字符比较两遍,所以时间复杂度为on
不过在写的过程中发现了当shortstr末尾存在多个相同字符时会出错。
针对这种情况,可以先搜索ac,再判断是否为acc。
最坏情况时间复杂度为o n * m1
m1为末尾重复字符的个数。
又仔细想了一下,对它进行了改进,先说一下优点和缺点。
优点
1是这个算法无论是理解起来,还是代码实现都非常简单。
2算法时间复杂度为o n
缺点
1不光是对acc类型的搜索字符会出现漏查,abcabc类型的也存在类似问题。
目前想到的解决办法是去掉重复的字串如查acc,就查ac,abcabc变为abc,先搜索不重复字串,再判断是否与重复字串匹配。
时间复杂度计算
对于普通的搜索字符串来说,只要将longstr中每个字符比较一次加上shortstr循环次数乘上shortstr的长度即可,shortstr循环次数小于n/m,
计算次数最多为 n + n/m * m = 2n
则时间复杂度为 o n
对于有重复的搜索字符串来说,如果采取去掉重复字串方法,其运行的次数是longstr中每个字符比较一次加上 修改后shortstr不重复字串 的循环次数乘上shortstr的长度即可,修改后shortstr不重复字串的循环次数为
n/(m-m1) ,,则修改后shortstr不重复字串的循环次数最多为n.例如搜索ssss字串,m - m1 = 1.
计算次数最多为 n + n * m = n + m * n
则时间复杂度为 o m*n
优化
但对于这种情况还有很大的改进空间,从而降低它的时间复杂度。
称修改后shortstr不重复字串为shortstr1
在shortstr1循环查找一次后先判断是否匹配,如果不匹配继续循环,如果匹配,再依次对shortstr去掉的重复部分进行匹配,如遇不匹配字符,就从当前位置重新进行shortstr1循环查找。反之则找到匹配字符串,返回当前位置。
时间复杂度计算
shortstr1每循环一次就要多比较一个字符(longstr与shortstr去掉的重复部分不匹配的第一个字符)其运行的次数是longstr中每个字符比较一次加上shortstr1的循环次数乘上1即可,
计算次数最多为 n + n * 1 = 2 * n
这样就可以保证其所有情况时间复杂度都为 o n
举例:
不过这些证明可能有错误,算法也有不完善的地方,希望大家可以一起完善。
- 自己写的一种字符串搜索
- 一种让谷歌搜索引擎拒绝搜索的字符串
- 一种字符串搜索方法
- 自己写的分割字符串的函数
- 自己写的字符串操作类
- 自己写的几个字符串函数
- Exe8 自己写的字符串操作函数
- 自己写的 字符串函数strcpy
- 自己写的字符串复制函数
- 几个自己写的字符串C函数
- 【Hash】自己对于一种字符串hash的证明(?)
- 自己写字符串函数
- 分享一个自己写的字符串工具:字符串格式化拼接
- 使用google搜索自己在csdn写的博客
- 如何在csdn网站搜索自己写的博客文章
- 自己写的DataTable转换成JSON字符串的函数
- 自己写的整数和字符串之间的转化
- 自己写的一个分割字符串的方法
- UVa1640 - The Counting Problem(数位统计)
- 构建NFS系统间文件共享
- Servlet的方法对象总结
- 程序员必知的8大排序
- iOS7.0之后tableview的cell分割线不靠边问题
- 自己写的一种字符串搜索
- Git操作——分支管理(一)
- 使用Builder模式进行美化代码
- 用分治法查找数组元素的最大值和最小值
- python selenium
- QT小结
- 程序员怎样迈出从5K到1W的重要一步
- Error:Execution failed for task ':app:dexDebug'.
- POJ1012 Joseph