JAVA代码实现对上述 3 个算法(BF算法、KMP 算法、BM 算法)进行时间复杂性分析,并设计实验程序验证分析结果

时间: 2023-07-26 11:22:18 浏览: 53
下面是对三个算法的时间复杂性分析和实验程序设计: 1. BF算法: 时间复杂度:O(n*m),其中n为文本串的长度,m为模式串的长度。 实验程序设计: ```java public class BFMatch { public static void main(String[] args) { String text = "abababababababababababababababababababac"; String pattern = "ababac"; int index = bfMatch(text,pattern); System.out.println("匹配结果:" + index); } public static int bfMatch(String text, String pattern) { int tLen = text.length(); int pLen = pattern.length(); for (int i = 0; i <= tLen - pLen; i++) { int j; for (j = 0; j < pLen; j++) { if (text.charAt(i+j) != pattern.charAt(j)) { break; } } if (j == pLen) { return i; } } return -1; } } ``` 2. KMP算法: 时间复杂度:O(n+m),其中n为文本串的长度,m为模式串的长度。 实验程序设计: ```java public class KMPMatch { public static void main(String[] args) { String text = "abababababababababababababababababababac"; String pattern = "ababac"; int index = kmpMatch(text,pattern); System.out.println("匹配结果:" + index); } public static int kmpMatch(String text, String pattern) { int tLen = text.length(); int pLen = pattern.length(); int[] next = getNext(pattern); int i = 0, j = 0; while (i < tLen && j < pLen) { if (j == -1 || text.charAt(i) == pattern.charAt(j)) { i++; j++; } else { j = next[j]; } } if (j == pLen) { return i - j; } else { return -1; } } public static int[] getNext(String pattern) { int pLen = pattern.length(); int[] next = new int[pLen]; next[0] = -1; int i = 0, j = -1; while (i < pLen - 1) { if (j == -1 || pattern.charAt(i) == pattern.charAt(j)) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } } ``` 3. BM算法: 时间复杂度:O(n/m),其中n为文本串的长度,m为模式串的长度。 实验程序设计: ```java public class BMMatch { public static void main(String[] args) { String text = "abababababababababababababababababababac"; String pattern = "ababac"; int index = bmMatch(text,pattern); System.out.println("匹配结果:" + index); } public static int bmMatch(String text, String pattern) { int tLen = text.length(); int pLen = pattern.length(); int[] bmBc = preBmBc(pattern); int[] bmGs = preBmGs(pattern); int i = pLen - 1; while (i < tLen) { int j = pLen - 1; while (j >= 0 && text.charAt(i) == pattern.charAt(j)) { i--; j--; } if (j < 0) { return i + 1; } i += Math.max(bmBc[text.charAt(i)] - pLen + 1 + j, bmGs[j]); } return -1; } private static int[] preBmBc(String pattern) { int pLen = pattern.length(); int[] bmBc = new int[256]; Arrays.fill(bmBc, pLen); for (int i = 0; i < pLen - 1; i++) { bmBc[pattern.charAt(i)] = pLen - 1 - i; } return bmBc; } private static int[] preBmGs(String pattern) { int pLen = pattern.length(); int[] bmGs = new int[pLen]; int[] suffix = suffix(pattern); Arrays.fill(bmGs, pLen); for (int i = pLen - 1; i >= 0; i--) { if (suffix[i] == i + 1) { for (int j = 0; j < pLen - 1 - i; j++) { if (bmGs[j] == pLen) { bmGs[j] = pLen - 1 - i; } } } } for (int i = 0; i < pLen - 1; i++) { bmGs[pLen - 1 - suffix[i]] = pLen - 1 - i; } return bmGs; } private static int[] suffix(String pattern) { int pLen = pattern.length(); int[] suffix = new int[pLen]; suffix[pLen - 1] = pLen; int i = pLen - 2, j = pLen - 1; while (i >= 0) { if (pattern.charAt(i) == pattern.charAt(j)) { i--; j--; suffix[i] = j + 1; } else { j = suffix[j]; if (j <= i) { j = i + 1; } } } return suffix; } } ```

相关推荐

最新推荐

recommend-type

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...
recommend-type

重庆大学数据结构实验报告,串的操作与KMP模式匹配算法源码及结果截屏

这是重庆大学数据结构实验报告,题目是串的操作与KMP模式匹配算法。里面有完整的实验流程,包括源码及结果截屏
recommend-type

数据结构课程设计实验报告-KMP算法的实现

KMP算法是对一般模式匹配算法的改进,由D.E.Knuth与V.R.Pratt和J.H.Morris 同时发现的因此人们称它为克努特-莫里斯-莫拉特操作(简称为KMP算法)。 对于一般的模式匹配算法:分别利用两个指针i和j指示主串S和T中的...
recommend-type

KMP串匹配算法,并行计算

串匹配(String Matching)问题是计算机科学中的一个基本问题,也是复杂性理论中研究的最广泛的问题之一。它在文字编辑处理、图像处理、文献检索、自然语言识别、生物学等领域有着广泛的应用。而且,串匹配是这些...
recommend-type

C++ 数据结构之kmp算法中的求Next()函数的算法

主要介绍了C++ 数据结构之kmp算法中的求Next()函数的算法的相关资料,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

优化MATLAB分段函数绘制:提升效率,绘制更快速

![优化MATLAB分段函数绘制:提升效率,绘制更快速](https://ucc.alicdn.com/pic/developer-ecology/666d2a4198c6409c9694db36397539c1.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB分段函数绘制概述** 分段函数绘制是一种常用的技术,用于可视化不同区间内具有不同数学表达式的函数。在MATLAB中,分段函数可以通过使用if-else语句或switch-case语句来实现。 **绘制过程** MATLAB分段函数绘制的过程通常包括以下步骤: 1.
recommend-type

SDN如何实现简易防火墙

SDN可以通过控制器来实现简易防火墙。具体步骤如下: 1. 定义防火墙规则:在控制器上定义防火墙规则,例如禁止某些IP地址或端口访问,或者只允许来自特定IP地址或端口的流量通过。 2. 获取流量信息:SDN交换机会将流量信息发送给控制器。控制器可以根据防火墙规则对流量进行过滤。 3. 过滤流量:控制器根据防火墙规则对流量进行过滤,满足规则的流量可以通过,不满足规则的流量则被阻止。 4. 配置交换机:控制器根据防火墙规则配置交换机,只允许通过满足规则的流量,不满足规则的流量则被阻止。 需要注意的是,这种简易防火墙并不能完全保护网络安全,只能起到一定的防护作用,对于更严格的安全要求,需要
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。