3.Sunday算法的一个小优化
优化算法思路:
1.Sunday算法关键思想
通过解析传统Sunday算法我发现它实现跳转的关键思想在于第二步,我们深入解析下第二步的原理:
we should working hard
work
h为什么要和work中的元素逐个比较?我们可以这样理解:
1) 当h和w比较时,我们可以确定houl和work是否可能匹配
2) 当h和o比较时,我们可以确定shou和work是否可能匹配
3) 当h和r比较时,我们可以确定 sho和work是否可能匹配
4) 当h和k比较时,我们可以确定e sh和work是否可能匹配
也就是说,这次比较我们可以确定e shoul和work的关系。
we should working hard
work
那么我们的优化策略就有了:
当h和work经过比较后发现h不在work中,我们可以直接跳过oul,用d来重复h的操作,以此类推,直到找到匹配项。
改进后的Sunday算法:
我们假设有一个字符串A长度为n 一个字符串B长度为m
我们使用Sunday算法在A中查找是否存在B
我们假设每次比较的时间为1,本文的复杂度分析主要是最坏复杂度分析
1) 将A,B首字母对齐
2) 查看B最后一个字符对应的A的位置(初始为m)上的字符是否在B中存在m次比较
3) 若存在,则将B中对应位置与其对齐后倒序比较,若全部相等则找到目标,否则执行步骤4 m-1次比较
4) 若不存在则将检查m+m位置上的字符是否在B中存在。m次比较
图示过程:
w e s h o u l d w o r k i n g h a r d
w o r k
1)首先查看s是否在work中存在,结果为不存在,跳过4位到l上
2)检查l在work中是否存在,结果为不存在,跳过4位到o上
3)检查o在work中是否存在,发现存在,则将两个串中的o对齐得到下面的:
w e s h o u l d w o r k i n g h a r dw o r k
4)检查它们相对应的串是否匹配,结果发现匹配,得到结果,配对完毕。
复杂度分析
我们拿传统Sunday算法的最坏复杂度情况进行计算:
类似下面情况的查找的复杂度最坏:
wordkkkkkkkkkkkkkkkkkkk
work
通过计算这样的复杂度为:
O(n,m)=(2m-1)n/m
化简后就是:O(n,m)=2n-n/m
我们知道当n远大于m的时候,其时间复杂度可以近似看成:O(n)=n
这与传统的Sunday相比近似快了一倍。
代码实现
public int Sunday(String haystack, String needle) {int hayLen = haystack.length();//主串长度int nLen = needle.length();//子串长度int i=nLen-1;int l=0;int j=0;if(hayLen>nLen){while(i<hayLen) {l=i;for (j=nLen-1;j>=0;j--){if (needle.charAt(j)==haystack.charAt(i)) {i += nLen - 1 - j;if (i < hayLen){for (int n = nLen - 1; n >= 0; n--) {if (needle.charAt(n) != haystack.charAt(i--)) {break;} else if (n == 0) {return i + 1;}}i = l;break;}else{return -1;}}}i+=nLen;continue;}return -1;}else{System.out.println("后者比前者长,不能进行查找操作");return -1;}}
实现代码也少了许多,更简洁。
测试比较
针对上面两种算法我选取了一个下面的测试方法:
1.最坏情况测试:
public static void main(String[] args) {String a="wordkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" +"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkwork";String b="work";BetterSunday01 find=new BetterSunday01();long startTime = System.currentTimeMillis(); //获取开始时间int i=0;for(int j=0;j<1000000;j++) {i = find.Sunday(a, b);}long endTime = System.currentTimeMillis(); //获取结束时间System.out.println(i);System.out.println("算法运行时间为:"+(endTime - startTime) + "ms");
}
传统算法的结果为:
优化后的算法结果为:
经计算改进后的算法针对上面的测试方法比传统的算法快了近67.5%。
2.一般情况测试:
从网上截取了一段正常的两万多字的文本并对它们进行测试发现它们的查找速度基本相同。
综合而言,本文对Sunday算法的优化提高了此查找算法的稳定性以及平均复杂度。
3.Sunday算法的一个小优化相关推荐
- 十大机器学习算法的一个小总结
在公众号看到来一篇不错的文章,讲解机器学习算法的,感觉挺好的,所以这里对常用的机器学习算法做一个小的总结, 然后根据学习李航老师的<统计学习方法>做得笔记,对这些算法进行补充. 简介 ...
- 梯度下降:全梯度下降算法(FG)、随机梯度下降算法(SG)、小批量梯度下降算法(mini-batch)、随机平均梯度下降算法(SAG)。梯度下降法算法比较和进一步优化。
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.2 梯度下降(Gradient Descent) 2.2. ...
- java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810
题目要求: 给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出 ...
- C语言随笔小算法:取出一个任意整数的每一位数值
C语言随笔小算法:取出一个任意整数的每一位数值 代码: #include "stdlib.h" #include "stdio.h"//将val的各位取出来 i ...
- 【算法】快速排序算法的编码和优化
参考资料 <算法(第4版)> - - Robert Sedgewick, Kevin Wayne <啊哈! 算法> - - 啊哈磊 ...
- 算法代码_Python进化算法之多目标优化与代码实战
前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...
- Redola.Rpc 的一个小目标:20000 tps
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threadsComplete requests: 20000 ...
- BF、KMP、BM、Sunday算法讲解
原文地址: https://www.cnblogs.com/Syhawk/p/4077295.html BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中 ...
- 梯度下降法算法比较和进一步优化
梯度下降法算法比较和进一步优化 常见的梯度下降算法有: 全梯度下降算法(Full gradient descent), 随机梯度下降算法(Stochastic gradient descent), 小 ...
最新文章
- 惹女友生气了不用慌用python做一个3D立体花朵送女友
- java form action 参数_java发起form请求(有参数,无参数)
- JavaScript实现CountingSort计数排序算法(附完整源码)
- 018:Django商城部署和数据库读写分离
- TCP/IP协议栈模型分析
- winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...
- pandas追加写入excel_[Excel]如果你爱Excel,请学好pandas
- c语言实现图像拼接程序,opencv2实现10张图像上下左右拼接融合分享!
- scikit-learn中随机森林使用详解
- nginx出现 500 Internal Server Error的解决办法
- 云小课|DGC数据开发之基础入门篇
- linux下比较文件并输出,Linux使用diff命令比较文件的方法
- php大写数字转换,PHP把数字转成人民币大写的函数分享
- 用 Python 训练自己的语音识别系统,这波操作稳了
- matlab自适应遗传算法代码,matlab自适应遗传算法
- 【电脑】VirtualBox 安装 Win98 写网页
- 计算机网络——TCP
- 服务器winsxs文件夹怎么清理工具,win7系统如何使用WinSxS工具安全删除WinSxS文件夹垃圾?...
- 单元测试总结反思_单元测试小反思200字
- 性能测试中常见的专业术语:QPS、TPS、并发数、响应时间(RT)、吞吐率和吞吐量【杭州多测师】【杭州多测师_王sir】...
热门文章
- 双重差分模型python包_开学礼包:如何使用双重差分法的交叉项(迄今最全攻略)...
- TCP报文中的SYN,FIN,ACK,PSH,RST,UR
- FPGA学习笔记_UART串口协议_串口接收端设计
- 【移动端】滑动验证致使整个屏幕都在动
- 机器学习: 专家系统、认知模拟、规划和问题求解、数据挖掘、网络信息服务、图象识别、故障诊断、自然语言理解、机器人和博弈等领域。...
- 最新研究表明:熬夜会增加患癌症几率
- 阴影检测(shadow detect)
- MyBatis警告信息 All illegal access operations will be denied in a future release
- iba测评题目_靠谱测评丨6国12款大牌纯牛奶盲测,谁最好喝?结果万万没想到
- vue移动端实现图片预览