数据结构(哈夫曼树+KMP)之 数据加密+解密

本文介绍了如何利用哈夫曼树和KMP算法实现数据的加密与解密。首先统计字符出现频率构建哈夫曼树,然后生成哈夫曼编码,接着使用KMP算法进行模式匹配和替换以完成加密。在解码过程中,通过遍历编码和哈夫曼树结构还原原始数据。文章强调了编码方式的灵活性,提示可以调整编码规则以增强安全性,并提到未来将支持字符数组和文件操作。

数据结构(哈夫曼树+KMP)之 数据加密+解密

原理:参考趣学数据结构

代码:

#include<stdio.h>
#include<stdlib.h>
#define N 100
#define INF 2^31-1
int next[N];
int Sum = 0;//权重总和
typedef struct fNode {
   
   //哈夫曼树中每个节点的信息
	int c;//字符
	int parent;//父节点,左右孩子,权重
	int lchild, rchild;
	int weight;
}fNode;
typedef struct rNode {
   
   //存储单个的编码字符的编码序列
	int r[N];
	int start;//有效编码起始的位置
	int length;
}rNode;
void huffMan(fNode fnode[], int n) {
   
   //构造哈夫曼树  选取二个最小的没有父节点的结点合并,以此类推
	for (int i = 0; i < n - 1; i++) {
   
   //n个字符n-1次的构造即可构造哈夫曼树
		int min1 = INF, min2 = INF;
		int u = -1, v = -1;
		for (int j = 0; j < n + i; j++) {
   
   //找二个最小的没有父节点的
			if (fnode[j].weight < min1 && fnode[j].parent == -1) {
   
   
				min2 = min1;//最值同时往前推
				v = u;
				min1 = fnode[j].weight;
				u = j;
			}
			else if (fnode[j].weight < min2 && fnode[j].parent == -1) {
   
   
				min2 = fnode[j].weight;
				v = j;
			}
		}
		fnode[n + i].weight = min1 + min2;
		fnode[n + i].lchild = u;
		fnode[n + i].rchild = v;
		fnode[u].parent = fnode[v].parent = n + i;//更新父节点
	}
}
void findHuffManCodePath(fNode fnode[], rNode rnode[], int n) {
   
   //寻找每个字符编码表示
	rNode temp;
	int start = n - 1;//最坏的哈夫曼树为一条链表
	for (int i = 0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fighting的码农(zg)-GPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值