C语言实现的KMP算法代码包

版权申诉
0 下载量 200 浏览量 更新于2024-10-13 收藏 9KB RAR 举报
资源摘要信息:"KMP算法是一个高效的字符串匹配算法,全名为Knuth-Morris-Pratt算法,由Donald Knuth、Vaughan Pratt和James H. Morris发明。这个算法可以在O(n+m)的时间复杂度内完成字符串的匹配任务,其中n是文本字符串的长度,m是模式字符串的长度。KMP算法之所以高效,是因为它通过预处理模式串,构建一个部分匹配表(也称为“失配函数”或“next数组”),使得当模式串在文本串中匹配失败时,能够根据部分匹配表跳过尽可能多的字符,从而避免了从头开始匹配,大大减少了不必要的比较次数。 在C语言实现的KMP算法中,一个典型的实现步骤包括: 1. 首先计算模式串的部分匹配表,用于记录模式串的前缀和后缀的最长公共元素长度。 2. 然后使用计算出的部分匹配表,在模式串和文本串进行匹配时,根据不匹配的情况适当移动模式串,以寻找新的匹配位置。 3. 匹配过程通常使用一个指针来跟踪当前比较到的文本串的位置,以及一个指针来跟踪模式串的位置。 KMP算法的核心在于构建部分匹配表,这个表的每一项next[j]表示在模式串的前j个字符中,有多大长度的相同前缀后缀。例如,如果模式串为“ABCDABD”,其部分匹配表将是{0, 0, 1, 2, 0, 1, 2}。通过这个表,如果在匹配过程中遇到模式串的“D”和文本串的“C”不匹配的情况,可以根据表中的值“2”,将模式串向右移动2位,从而跳过“AB”这两个已经确认不会匹配成功的字符,继续进行匹配。 在实际的C语言代码实现中,通常会定义一个结构体来存储模式串和对应的next数组,或者直接在主函数中计算并使用。实现KMP算法的C代码一般包括两部分:计算next数组的函数和KMP匹配函数。计算next数组的函数通过双重循环实现,而KMP匹配函数则利用已计算出的next数组在文本串中寻找模式串的位置。 此外,从文件的描述中提到包含有可执行文件,这意味着KMP算法的C语言代码已经被编译成了可执行文件。这样,用户无需编译代码,直接运行可执行文件即可观察到算法的运行效果。这对学习和测试KMP算法十分便利。 KMP算法广泛应用于各种文本处理领域,如文本搜索、字符串匹配问题等,尤其在需要高性能字符串匹配的场合,比如数据库中的模式匹配、搜索引擎的关键词查找等,KMP算法都能够提供比朴素字符串匹配更优的性能。 总结而言,KMP算法是一种非常经典的字符串匹配算法,通过巧妙的预处理和模式串移动策略,能够有效提高匹配效率。在C语言中实现KMP算法需要对字符串处理、数组操作和循环控制有较深的理解。同时,理解并掌握KMP算法对于提升编程能力和解决实际问题具有重要意义。" 【压缩包子文件的文件名称列表】中列出的文件名“***.txt”和“KMP”表明,这个压缩包可能来源于某个代码分享网站(如***),并且其中包含的KMP算法的C语言实现文件名为“KMP”。通常,代码分享网站上提供的代码资源会包含源代码文件(如.cpp或.c文件)、编译后的可执行文件,以及可能的文档说明文件。在这个列表中,“***.txt”文件可能包含了文件的来源信息、使用说明或相关文档,而“KMP”则可能是一个C语言源代码文件或可执行文件,具体是什么类型需要通过解压后才能确认。如果“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 上传