[算法] 最佳的编码 – 加密方法香农

内容
香农加密算法
编码算法

在这篇文章中刚才提到香农的加密方法和代码C / C ++算法. 所有概念相关的默认你知道, 如果概念并不清楚你叫大哥谷歌离线. ^^

香农加密算法

考虑到源U提供概率分布表

1 2 ñ
P1 P2 Pñ

步 1: 根据概率从大到小的顺序排序项目
步 2: 消息加密代码U的长度 根据下式:
2^{-n_{i}} \leq P(U_{i}) \leq 2^{1-n_{i}}
从这个公式我们变换公式更容易:
n_{i} = \left [ -log_{2}P(U_{i}) \right ]
步 3: F计算(该) 根据下式:
\begin{cases}  F(U_{i}) = \sum_{j=0}^{i-1}P(U_{i}) = P(U_{i-1}) + F(U_{i-1}) & \text{ khi } i \geqslant 2 \\  F(U_{i}) = 0 & \text{ khi } i = 1  \end{cases}
步 4: 开关F(该) 从步骤 3 成二进制
步 5: 得到N个 F的下列字符计算小数(该) 这是码字u

例: 在一个字符串资源 nguyenvanquan7826. 后执行上述步骤具有以下结果:

加密香农

这是结果以下运行程序时. 在程序, N的计算分数时计算它们的P和F固定直至它的十进制形式,但随后 新举措,以小数为更精确的结果.

编码算法

//============================================================================
// Name        : Shanon.cpp
// Author      : nguyenvanquan7826
//============================================================================

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

typedef struct {
	char s1;
	int ni, P, F, b[100];

} nguon;
void doicho(nguon *a, nguon *b) {
	nguon c;
	c = *a;
	*a = *b;
	*b = c;
}

int main() {
	char *s;
	nguon *kitu;
	int i, j, n, k = 1, *a, ni, maxni;

	s = (char *) malloc(100 * sizeof(char));
	a = (int *) malloc(100 * sizeof(int));
	kitu = (nguon *) malloc(100 * sizeof(nguon));

	printf("Moi ban nhap day nguon: ");
	gets(s);
	fflush(stdin);
	puts(s);
	n = strlen(s);

	//Phan loai ki tu va tinh P(Ui)
	for (j = 1; j <= 256; j++) {
		a[k] = 0;
		for (i = 0; i <= n; i++)
			if ((int) s[i] == j) {
				a[k]++;
				kitu[k].s1 = s[i];
			}
		if (a[k] > 0) {
			kitu[k].P = a[k];
			k++;
		}
	}
	for (i = 1; i < k; i++)
		for (j = i; j < k; j++)
			if (kitu[i].P < kitu[j].P)
				doicho(&kitu[i], &kitu[j]);

	//Tinh F(Ui)

	for (i = 1; i <= k; i++) {
		if (i == 1)
			kitu[1].F = 0;
		if (i > 1)
			kitu[i].F = kitu[i - 1].F + kitu[i - 1].P;
	}

	//Tinh ni
	for (i = 1; i < k; i++) {
		float j;
		j = n / kitu[i].P;
		ni = (int) (log(j) / log(2)) + 1;
		kitu[i].ni = ni;
	}
	maxni = kitu[1].ni;
	for (i = 1; i < k; i++)
		if (kitu[i].ni > maxni)
			maxni = kitu[i].ni;

	//Tinh F(Ui) he 2
	int l;
	float F;
	for (i = 1; i < k; i++) {
		l = 1;
		F = (float) kitu[i].F / n;
		while ((l <= maxni) && (F != 0)) {
			F = F * 2;
			kitu[i].b[l] = (int) F / 1;
			l++;
			F = F - (int) F;
		}
	}

	printf("\n\n%5s %10s %10s %7s", "Ui", "P(Ui)", "F(Ui)", "ni");
	for (i = 1; i <= maxni + 1; i++)
		printf(" ");
	printf("%9s", "F(Ui)2");
	for (i = 1; i <= maxni; i++)
		printf(" ");
	printf("%10s", "Ma");
	for (i = 1; i < k; i++) {
		ni = kitu[i].ni;
		printf("\n%5c %7d/%d %7d/%d %7d", kitu[i].s1, kitu[i].P, n, kitu[i].F,
				n, kitu[i].ni);
		for (j = 1; j <= maxni - ni; j++)
			printf(" ");
		printf("%10s", "0.");
		for (j = 1; j <= ni; j++)
			printf("%d", kitu[i].b[j]);
		for (j = 1; j <= maxni - ni; j++)
			printf(" ");
		printf("%10s", " ");
		for (j = 1; j <= ni; j++)
			printf("%d", kitu[i].b[j]);
	}
	printf("\n");
	return 0;
}