C语言实现KMP字符串匹配算法详细解析

版权申诉
0 下载量 168 浏览量 更新于2024-10-13 收藏 620B RAR 举报
资源摘要信息: "KMP算法实现字符串匹配过程分析" KMP算法是一种在字符串中进行模式匹配的有效方法,全称为Knuth-Morris-Pratt算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同提出。KMP算法利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽可能地移动到有效的位置,从而避免了不必要的回溯。在实际应用中,KMP算法极大地提高了匹配的效率,是字符串处理中常用的一种算法。 在C语言中实现KMP算法需要理解以下几个关键知识点: 1. 前缀表(也称为部分匹配表,Partial Match Table): 前缀表是KMP算法的核心组成部分,它记录了模式串中每个位置之前的子串的最长相同前后缀的长度。这个表可以指导模式串在不匹配时应该从哪个位置开始重新匹配。前缀表的构建是通过比较模式串中的字符和已经匹配的前缀来完成的。 2. 字符串匹配过程: 在KMP算法中,主串和模式串都会有一个指针,分别称为i和j。算法开始时,两个指针都指向各自的起始位置。在进行匹配的过程中,如果当前字符匹配成功,则两个指针都向前移动;如果匹配失败,模式串的指针j会根据前缀表移动到下一个可能的匹配位置,而主串的指针i保持不动或者仅向前移动一位。 3. KMP算法的编码实现: 使用C语言实现KMP算法,需要编写两个主要函数:一个用于构建前缀表,另一个用于进行实际的字符串匹配。在构建前缀表时,通常需要一个循环来逐个计算模式串中每个位置的最长相同前后缀长度。而在字符串匹配函数中,则需要根据前缀表来移动模式串的指针。 4. KMP算法的优化: KMP算法的效率非常高,但仍然存在优化空间。例如,可以优化前缀表的计算方式,减少不必要的重复计算;在匹配过程中,可以减少对主串的逐字符比较,进一步提升效率。 5. KMP算法在Visual C中的应用: Visual C是一个集成开发环境(IDE),在其中编写和调试C语言代码非常方便。在Visual C中使用KMP算法,除了编写算法的核心逻辑外,还需要考虑如何将算法集成到一个完整的程序中,包括输入输出、错误处理以及用户交互等方面。 在本次资源提供的压缩包文件kmp.rar中包含的kmp.txt文件,很可能包含了上述内容的详细描述,可能是KMP算法的原理讲解、C语言实现的源代码、运行说明或者是相关的问题讨论与解答。 针对提供的文件名列表中的kmp.txt文件,我们可以合理推测,该文件可能是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 上传