深入解析C++实现的KMP算法原理与应用

版权申诉
0 下载量 103 浏览量 更新于2024-10-10 收藏 230KB RAR 举报
资源摘要信息:"KMP算法是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明,通常被称为KMP算法或Knuth-Morris-Pratt算法。KMP算法的核心思想是利用已经部分匹配的有效信息,避免从头开始匹配,从而提高字符串匹配的效率。算法通过预处理模式串(待匹配的字符串),构造一个部分匹配表(也称为失配函数或next数组),以实现字符串的快速匹配。 在C++中实现KMP算法,需要完成以下几个关键步骤: 1. 构造部分匹配表(next数组):部分匹配表记录了模式串中每个位置之前的子串的最长相同前后缀的长度。具体来说,next数组的每一个元素next[i]表示在模式串的第i个字符之前的子串中,最长相等的前缀后缀的长度。 2. 使用部分匹配表进行匹配:在实际匹配过程中,通过部分匹配表来决定模式串在不匹配时应该向右滑动多少位。如果在某个位置上发现不匹配,可以根据next数组的值将模式串向右滑动,利用之前已经匹配的信息跳过一些不必要的比较。 KMP算法的优点在于其时间复杂度为O(n+m),其中n为文本字符串的长度,m为模式串的长度。这种算法特别适合于需要在较长文本中查找较短的模式串,并且模式串中包含重复或周期性结构的场景。 KMP算法的C++实现代码通常包括以下几个部分: - 计算部分匹配表的函数:这个函数会根据模式串计算出对应的next数组。 - 主匹配函数:该函数接收文本字符串和模式串作为输入,并使用计算好的next数组进行匹配。如果匹配成功,函数返回模式串在文本串中的起始位置;如果匹配失败,则返回-1。 在编程实现中,KMP算法的效率高度依赖于部分匹配表的正确计算和高效使用。因此,在设计KMP算法的C++实现时,应当特别注意这两个部分的逻辑清晰和执行效率。 标签“h.r.h.”并未直接提供有关知识点的信息,但可能是文件创建者或维护者的标识。在实际的文件管理系统中,标签用于帮助用户识别和分类文件,但在此处的上下文中,它并不提供额外的算法知识。 此外,由于提供的文件信息中仅包含标题和描述,并未具体提供文件名称列表,因此无法从文件列表中提取进一步的资源信息。若需要对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 上传

from sklearn.neural_network import MLPClassifier,MLPRegressor Traceback (most recent call last): File "C:\Users\wyq_0\AppData\Local\Temp\ipykernel_13656\921061210.py", line 1, in <module> from sklearn.neural_network import MLPClassifier,MLPRegressor File "C:\Users\wyq_0\python\lib\site-packages\sklearn\neural_network\__init__.py", line 10, in <module> from ._multilayer_perceptron import MLPClassifier File "C:\Users\wyq_0\python\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py", line 26, in <module> from ..metrics import accuracy_score, r2_score File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\__init__.py", line 42, in <module> from . import cluster File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\cluster\__init__.py", line 22, in <module> from ._unsupervised import silhouette_samples File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\cluster\_unsupervised.py", line 16, in <module> from ..pairwise import pairwise_distances_chunked File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\pairwise.py", line 33, in <module> from ._pairwise_distances_reduction import ArgKmin File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\_pairwise_distances_reduction\__init__.py", line 89, in <module> from ._dispatcher import ( File "C:\Users\wyq_0\python\lib\site-packages\sklearn\metrics\_pairwise_distances_reduction\_dispatcher.py", line 11, in <module> from ._base import _sqeuclidean_row_norms32, _sqeuclidean_row_norms64 File "sklearn\metrics\_pairwise_distances_reduction\_base.pyx", line 1, in init sklearn.metrics._pairwise_distances_reduction._base AttributeError: module 'sklearn.utils._openmp_helpers' has no attribute '__pyx_capi__'咋办

2023-06-01 上传