KMP算法实现:字符串在文本与Java文件中的匹配与替换

版权申诉
0 下载量 170 浏览量 更新于2024-10-16 收藏 3KB RAR 举报
资源摘要信息:"KMP算法是一种高效的字符串匹配算法,由Knuth、Morris和Pratt三位科学家提出。它能够在O(n+m)的时间复杂度内完成对目标字符串的查找匹配工作,其中n是文本字符串的长度,m是模式字符串的长度。相较于朴素的字符串匹配算法,KMP算法通过避免无效比较,提高了效率。" 详细知识点如下: 1. KMP算法基础概念: - KMP(Knuth-Morris-Pratt)算法是一种改进的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同提出。 - 它的核心思想是当出现不匹配字符时,已知的部分信息可以用来确定模式串应该移动的位置,从而避免了从头开始比较。 2. 前缀函数(部分匹配表): - KMP算法的关键在于构造一个前缀函数,又称作部分匹配表(Partial Match Table)。 - 前缀函数记录了模式串中每个位置之前的子串中,最长的相同前缀后缀的长度。 - 这个表可以用来在不匹配时,正确地决定模式串应该向右滑动多远。 3. KMP算法流程: - 初始化两个指针i和j,分别指向文本串和模式串的开始位置。 - 当j = -1(即模式串的第一个字符也匹配失败)或者匹配成功时,i和j分别向右移动一位。 - 当j ≠ -1且文本串的第i个字符不等于模式串的第j个字符时,将j更新为前缀函数j的新值。 - 如果在文本串中找到与模式串匹配的子串,则记录匹配的位置。 4. 字符串匹配中的应用: - KMP算法在处理大量的文本数据时特别有用,比如在文本编辑器中查找和替换功能。 - 它广泛应用于搜索算法,如搜索引擎对网页的索引和搜索。 - 在一些编程语言的库函数中,KMP算法也被用来实现字符串搜索功能。 5. 文件处理: - 根据描述,KMP算法可以处理txt和java文件。这表明它能够读取纯文本文件以及编译型语言文件。 - 文件处理通常需要文件过滤器来区分不同类型的文件,这在压缩包内的Txt_Java_FileFilter.java文件中可能有实现。 6. 字符串查找与替换: - KMP算法不仅用于查找字符串,还可以用来执行查找后的替换操作。 - 在算法找到匹配的字符串后,可以在相应位置用新的字符串替换掉匹配的子串。 7. 压缩包文件分析: - KMPtest.java可能包含KMP算法的实现代码,用于演示如何在Java语言中实现该算法。 - Txt_Java_FileFilter.java文件可能是一个文件过滤器,用来区分和处理文本文件和Java源代码文件。 - _test.txt文件可能是一个测试用例文件,用于验证KMP算法的实现是否正确。 8. 编程语言实现: - KMP算法的实现可以根据不同的编程语言有所差异,但核心思想和步骤保持一致。 - 在Java中实现KMP算法需要理解数组操作、字符串处理以及循环和条件判断。 9. 性能优势: - 相较于朴素的字符串匹配算法,KMP算法的主要优势在于它减少了需要比较的次数,避免了回溯文本串的指针。 - 在最坏的情况下,KMP算法的时间复杂度是O(n+m),其中n是文本字符串的长度,m是模式字符串的长度。 通过以上知识点的详细说明,可以看出KMP算法在字符串处理领域的重要性和实际应用价值。它不仅在理论计算机科学中占有一席之地,而且在实际软件开发和日常计算机操作中也扮演着关键角色。

import numpy import numpy as np import matplotlib.pyplot as plt import math import torch from torch import nn from torch.utils.data import DataLoader, Dataset import os os.environ['KMP_DUPLICATE_LIB_OK']='True' dataset = [] for data in np.arange(0, 3, .01): data = math.sin(data * math.pi) dataset.append(data) dataset = np.array(dataset) dataset = dataset.astype('float32') max_value = np.max(dataset) min_value = np.min(dataset) scalar = max_value - min_value print(scalar) dataset = list(map(lambda x: x / scalar, dataset)) def create_dataset(dataset, look_back=3): dataX, dataY = [], [] for i in range(len(dataset) - look_back): a = dataset[i:(i + look_back)] dataX.append(a) dataY.append(dataset[i + look_back]) return np.array(dataX), np.array(dataY) data_X, data_Y = create_dataset(dataset) train_X, train_Y = data_X[:int(0.8 * len(data_X))], data_Y[:int(0.8 * len(data_Y))] test_X, test_Y = data_Y[int(0.8 * len(data_X)):], data_Y[int(0.8 * len(data_Y)):] train_X = train_X.reshape(-1, 1, 3).astype('float32') train_Y = train_Y.reshape(-1, 1, 3).astype('float32') test_X = test_X.reshape(-1, 1, 3).astype('float32') train_X = torch.from_numpy(train_X) train_Y = torch.from_numpy(train_Y) test_X = torch.from_numpy(test_X) class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size=1, num_layer=2): super(RNN, self).__init__() self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.num_layer = num_layer self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.linear = nn.Linear(hidden_size, output_size) def forward(self, x): out, h = self.rnn(x) out = self.linear(out[0]) return out net = RNN(3, 20) criterion = nn.MSELoss(reduction='mean') optimizer = torch.optim.Adam(net.parameters(), lr=1e-2) train_loss = [] test_loss = [] for e in range(1000): pred = net(train_X) loss = criterion(pred, train_Y) optimizer.zero_grad() # 反向传播 loss.backward() optimizer.step() if (e + 1) % 100 == 0: print('Epoch:{},loss:{:.10f}'.format(e + 1, loss.data.item())) train_loss.append(loss.item()) plt.plot(train_loss, label='train_loss') plt.legend() plt.show()请适当修改代码,并写出预测值和真实值的代码

2023-06-09 上传