[算法] 最佳的编码 – 加密方法香农
在这篇文章中刚才提到香农的加密方法和代码C / C ++算法. 所有概念相关的默认你知道, 如果概念并不清楚你叫大哥谷歌离线. ^^
香农加密算法
考虑到源U提供概率分布表
该1 | 该2 | … | 该ñ |
P1 | P2 | … | Pñ |
步 1: 根据概率从大到小的顺序排序项目
步 2: 消息加密代码U的长度在 根据下式:
从这个公式我们变换公式更容易:
步 3: F计算(该在) 根据下式:
步 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; }
đoan code chạy bị lỗi bạn ơi
Lỗi sao bạn?
Lúc mình chạy thì bị lỗi, lúc nhập vào bắt thoát ra. Kiểu như bị vòng lặp vô hạn hay sao đấy. Mong b chỉnh sửa lại
谢谢, mình đã sửa lại code rồi nhé. 🙂