KMP算法实现:高效字符串查找技术解析

版权申诉
0 下载量 110 浏览量 更新于2024-10-08 收藏 4KB RAR 举报
资源摘要信息:"KMP算法是字符串查找中的一种高效算法,尤其适用于在文本字符串中查找模式字符串的场景。其全称是Knuth-Morris-Pratt算法,由Donald Knuth、Vaughan Pratt以及James H. Morris共同发明。KMP算法的核心优势在于其无需回溯的特性,它通过预处理模式字符串来构造一个部分匹配表(也称为失败函数或者next数组),使得在发生不匹配时,可以利用已经匹配成功的部分信息来决定下一步的匹配位置,从而避免从头开始匹配,大幅提高了查找效率。 KMP算法的基本思想是当出现字符串不匹配时,可以利用已经得到的部分匹配结果,将模式字符串移动到与已匹配部分对齐的位置继续进行比较。部分匹配表记录了模式字符串中每个位置之前的子串中,最长相等的前缀和后缀的长度,当遇到不匹配时,就可以根据这个表将模式字符串相应地向前移动。 KMP算法的主要步骤如下: 1. 计算模式字符串的部分匹配表。 2. 在文本字符串中移动模式字符串进行匹配。 3. 当发生不匹配时,根据部分匹配表移动模式字符串,并继续匹配。 KMP算法的实现通常涉及以下几个关键函数: - 构造部分匹配表:这个函数负责计算模式字符串的next数组,用于指导后续的匹配过程。 - KMP匹配函数:该函数利用部分匹配表来在文本字符串中查找模式字符串的位置。 在源码实现中,通常会包含以下几个文件: - KMP.CPP:包含了KMP算法的C++实现代码,包括构造部分匹配表和匹配函数。 - KMP.DSP与KMP.DSW:分别是Visual Studio的项目设置文件,用于定义项目属性,包括包含哪些源文件、编译选项等。 - KMP.ncb与KMP.OPT:这些可能是Visual Studio用于保存工程配置和优化设置的文件。 - KMP.PLG:通常为Visual Studio的插件文件,用于存储工程的插件信息。 学习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 上传