KMP算法在Visual C中的小型实现

版权申诉
0 下载量 188 浏览量 更新于2024-10-02 收藏 581B RAR 举报
资源摘要信息:"KMP算法的一个小型实现" KMP算法,全称为Knuth-Morris-Pratt字符串搜索算法,是一种用于字符串搜索的高效算法。它主要解决了在文本字符串中查找模式字符串位置的问题。KMP算法以三位发明者Donald Knuth、Vaughan Pratt和James H. Morris的名字命名,是一种线性时间复杂度算法,即其搜索速度与文本长度成线性关系,与模式字符串的长度无关。 在计算机科学中,KMP算法特别受到推崇的原因在于其避免了对已知无效匹配位置的重新检测。其关键在于一个预处理过程,通过该过程,算法能够预知在不匹配的情况下,模式字符串应该从哪个位置开始重新与文本字符串对齐,从而避免了从头开始重新匹配。 KMP算法的核心思想是利用已经部分匹配的有效信息,保持模式字符串的指针不回溯,通过修改子串的对齐方式,让其尽可能多地重用之前的匹配结果。这种预处理是通过创建一个部分匹配表(也称为"失配函数"或者"失败函数")来完成的。该表记录了模式字符串的前缀和后缀的最长公共元素的长度。在出现不匹配时,算法根据这个表来决定模式字符串的移动距离。 具体来说,部分匹配表的构建过程是这样的:对于模式字符串中的每个字符(或位置),部分匹配表记录了该字符之前(包括该字符)的子串中,有多大长度的相同前缀后缀。这个值是决定模式字符串移动步长的关键。 例如,对于模式字符串"ABCDABD",其部分匹配表如下: ``` A B C D A B D 0 0 0 0 1 2 0 ``` 这个表说明了例如当在文本中遇到不匹配时,如果是在第七个字符位置出现不匹配,并且当前比较的字符是"D",那么模式字符串可以向右移动6-2=4个位置,因为"ABD"是"ABCDABD"的前缀和后缀,且最长长度为2。 KMP算法的实现通常涉及以下几个函数或步骤: 1. 构造部分匹配表(失配函数)。 2. 模式字符串和文本字符串的匹配过程。 3. 在不匹配时,根据部分匹配表调整模式字符串的匹配位置。 从描述中提到的"KMP.rar_visual c",我们可以推断这是一个用Visual C++实现的KMP算法。Visual C++是微软公司推出的一个集成开发环境(IDE),广泛用于C和C++语言的开发工作。它提供了一套完整的开发工具,包括编译器、调试器和程序构建环境等,是专业开发人员在Windows平台上进行应用程序开发的首选工具之一。 由于提供的文件信息中只有一个文件名"KMP.cpp",我们可以合理猜测,这个文件是用C++语言编写的,包含了KMP算法的实现代码。C++是C语言的超集,它增加了面向对象编程、泛型编程和异常处理等特性,是目前广泛应用于系统软件、游戏开发、实时物理模拟、浏览器、客户端应用等领域的高级编程语言。 在C++中实现KMP算法,程序员通常会定义一些基本的数据结构和函数,如数组或向量(用于存储部分匹配表)、字符串处理函数(用于模式匹配)等。代码中可能会包含初始化部分匹配表的函数、执行搜索的函数和主函数等部分。 由于开发者在描述中提到"可能太菜了点...",这可能表达了对代码实现复杂度或效率的自谦。然而,无论代码的实现水平如何,KMP算法本身对于提高字符串搜索效率的价值是不可否认的。学习和掌握KMP算法,对于理解算法思想、提高编程技巧都有很大帮助。在实际应用中,KMP算法也经常被用作更复杂算法或程序的一部分,例如在文本编辑器、搜索引擎或数据库系统中进行文本匹配时,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 上传