加了点东西

This commit is contained in:
2026-01-21 11:09:45 +08:00
parent 05029f0b07
commit 8cecd07b59
32 changed files with 266 additions and 19 deletions

147
Collection/KMP算法.md Normal file
View File

@@ -0,0 +1,147 @@
---
tags:
- KMP
- AI生成
- C语言
---
KMPKnuth-Morris-Pratt算法是一种用于字符串匹配的算法它能在O(n+m)的时间复杂度内完成字符串的匹配其中n是主串的长度m是模式串的长度。这个算法是由Donald Knuth、Vaughan Pratt和Vaughan Morris在1970年共同发明的。
KMP算法的主要思想是利用已经匹配过的信息避免再次从头开始匹配。具体来说KMP算法在匹配失败后能够知道模式串中有一部分字符是与主串匹配的因此不需要重新匹配这些字符。
KMP算法的关键在于构造一个“部分匹配表”也称为“失败函数”或“跳转表”这个表记录了模式串中每个位置的最长公共前后缀的长度。在匹配过程中如果发生了匹配失败就可以根据这个表来确定下一步应该比较的位置从而避免了不必要的比较。
KMP算法的具体实现过程如下
1. 构造部分匹配表。对于模式串中的每个位置i1≤i≤m计算以该位置结尾的最长公共前后缀的长度并将结果存储在部分匹配表的第i个位置。这个计算过程可以通过动态规划来实现。
2. 进行字符串匹配。从主串的第一个字符和模式串的第一个字符开始比较,如果相等,则继续比较下一个字符;如果不相等,则根据部分匹配表来确定下一步应该比较的位置。重复这个过程,直到匹配成功或者遍历完整个主串。
KMP算法的时间复杂度为O(n+m)其中n是主串的长度m是模式串的长度。这个算法在实际应用中非常广泛特别是在需要频繁进行字符串匹配的场景中如搜索引擎、文本编辑器等。
下面是一个用C语言实现的KMPKnuth-Morris-Pratt字符串匹配算法的示例代码。这个示例中我们实现了KMP算法来在一个主字符串text中查找一个模式字符串pattern的所有出现位置。
```c
#include <stdio.h>
#include <string.h>
// 函数原型声明
void computeLPSArray(char *pat, int M, int *lps);
void KMPSearch(char *pat, char *txt);
int main() {
char text[] = "ABABDABACDABABCABAB";
char pattern[] = "ABABCABAB";
printf("Text: %s\n", text);
printf("Pattern: %s\n", pattern);
KMPSearch(pattern, text);
return 0;
}
// 计算LPS最长公共前后缀数组
void computeLPSArray(char *pat, int M, int *lps) {
int len = 0; // 最长公共前后缀的长度
lps[0] = 0; // lps[0] 总是0
int i = 1;
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
}
// KMP字符串匹配算法
void KMPSearch(char *pat, char *txt) {
int M = strlen(pat);
int N = strlen(txt);
int lps[M];
int j = 0; // 模式串的索引
// 计算LPS数组
computeLPSArray(pat, M, lps);
int i = 0; // 文本串的索引
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
printf("Pattern found at index %d \n", i - j);
j = lps[j - 1];
} else if (i < N && pat[j] != txt[i]) {
if (j != 0)
j = lps[j - 1];
else
i = i + 1;
}
}
}
```
在这个示例中,`computeLPSArray`函数计算了模式串的最长公共前后缀数组LPS数组`KMPSearch`函数使用这个数组来在文本串中查找模式串。当找到匹配时,它会打印出模式串在主字符串中的起始索引。
你可以编译并运行这段代码来测试KMP算法。请确保你的编译器支持C语言标准并且已经正确设置了编译环境。
内容由AI大模型生成仅供参考

View File

@@ -0,0 +1,93 @@
---
tags:
- PID
- AI生成
- C语言
---
以下是一个简单的C语言实现PID控制算法的程序示例
```c
#include <stdio.h>
// PID控制器结构体
typedef struct {
double kp; // 比例系数
double ki; // 积分系数
double kd; // 微分系数
double previous_error; // 上一次的误差
double integral; // 误差积分
} PIDController;
// PID计算函数
double PID_Compute(PIDController* pid, double setpoint, double actual_value, double dt) {
double error = setpoint - actual_value;
pid->integral += error * dt;
double derivative = (error - pid->previous_error) / dt;
double output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative;
pid->previous_error = error;
return output;
}
int main() {
// 初始化PID控制器
PIDController pid;
pid.kp = 1.0;
pid.ki = 0.1;
pid.kd = 0.01;
pid.previous_error = 0.0;
pid.integral = 0.0;
// 模拟控制过程
double setpoint = 100.0; // 设定目标值
double actual_value = 0.0; // 实际值
double dt = 0.1; // 时间间隔
double output; // PID输出
for (int i = 0; i < 100; i++) {
output = PID_Compute(&pid, setpoint, actual_value, dt);
actual_value += output; // 假设输出直接控制实际值
printf("Time: %d, Actual Value: %f, Error: %f, Output: %f\n", i, actual_value, setpoint - actual_value, output);
}
return 0;
}
```
这个示例程序定义了一个`PIDController`结构体包含了PID控制器的参数比例系数`kp`、积分系数`ki`、微分系数`kd`)以及状态变量(上一次的误差`previous_error`和误差积分`integral`)。`PID_Compute`函数根据设定目标值、实际值和时间间隔计算PID输出。在`main`函数中我们初始化了一个PID控制器并模拟了一个控制过程其中PID输出直接控制实际值。
请注意这只是一个简单的示例程序实际应用中可能需要根据具体需求进行调整和优化。此外PID控制算法还需要考虑一些边界条件和特殊情况例如积分饱和、微分先行等。因此在实际应用中建议根据具体需求进行深入研究和实践。
内容由AI大模型生成仅供参考

View File

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 217 KiB

View File

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 148 KiB

View File

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 146 KiB

View File

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 196 KiB

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

View File

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

View File

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 176 KiB

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

View File

@@ -1,44 +1,50 @@
---
tags:
- vivado
- school
---
# Vivado使用乘法器、除法器IP核实现乘除取余仿真
### 环境
**Vivado 20.2**
## 添加并配置IP核
1. 打开vivado找到对应IP核如下图
![](IPCore01.png)
![](./assets/vivado_ip/IPCore01.png)
2. 先双击除法器IP核进入配置页面如下图
![](IPCore02.png)
![](IPCore03.png)
![](./assets/vivado_ip/IPCore02.png)
![](./assets/vivado_ip/IPCore03.png)
除法器配置默认即可点击OK后弹出界面点击Generate
如下图即配置完成
![](IPCore04.png)
![](./assets/vivado_ip/IPCore04.png)
3. 配置乘法器IP核
![](IPCore05.png)
![](./assets/vivado_ip/IPCore05.png)
上图使用十六位有符号数与十六位无符号数进行运算
![](IPCore06.png)
![](./assets/vivado_ip/IPCore06.png)
上图输出32位间隔一个周期得到结果电脑性能不佳可适当增加
4. 如下图即配置完成
![](IPCore07.png)
![](./assets/vivado_ip/IPCore07.png)
## 添加并编写仿真代码文件
1. 选择一个文件夹创建例如ipcore_test.v文件
2. 添加文件到vivado
![](IPCore08.png)
![](IPCore09.png)
![](./assets/vivado_ip/IPCore08.png)
![](./assets/vivado_ip/IPCore09.png)
找到自己创建的.v文件路径并添加
3. 完成如下图
![](IPCore10.png)
![](./assets/vivado_ip/IPCore10.png)
4. 复制示例代码
![](IPCore11.png)
![](./assets/vivado_ip/IPCore11.png)
双击打开.veo 示例代码文件
![](IPCore12.png)
![](./assets/vivado_ip/IPCore12.png)
复制上图红框中的代码到自己的仿真文件,如下图我这是外部编辑器vivado自带编辑器同理
![](IPCore13.png)
![](./assets/vivado_ip/IPCore13.png)
上图的module与endmodule需要自己添加
如下图可以看到除法器IP核在你自己的代码文件之下表示被正确调用
![](IPCore14.png)
![](./assets/vivado_ip/IPCore14.png)
乘法器同理,打开.veo文件复制代码
![](IPCore15.png)
![](IPCore16.png)
![](./assets/vivado_ip/IPCore15.png)
![](./assets/vivado_ip/IPCore16.png)
示例代码复制完成后如下图这里我更改了实例名称u_ 开头,不改没影响)
![](IPCore17.png)
![](./assets/vivado_ip/IPCore17.png)
5. 最后自己补全仿真代码,我这里这样写
```verilog
`timescale 1ns / 1ps
@@ -105,8 +111,8 @@ endmodule
6. 结果分析
选中除B之外的所有变量调整为有符号的十进制B调整为无符号的十进制数
![](IPCore19.png)
![](./assets/vivado_ip/IPCore19.png)
下图可以看到,乘法器得到数据(一开始),在第一个周期得到结果,除法器得到数据,在第二十个周期得到结果
![](IPCore18.png)
![](./assets/vivado_ip/IPCore18.png)

View File

@@ -1,6 +1,7 @@
---
tags:
- school
- 文献
---
# 十五篇