[アルゴリズム] 最適な符号化 – 暗号化方式シャノン
コンテンツ
シャノン暗号
コードアルゴリズム
この記事では、今述べたシャノンと暗号化方式コードC / C ++のアルゴリズム. あなたが知っているすべての概念に関連するデフォルト, そうでない場合は、あなたが兄のGoogle NHE呼び出し明確なコンセプト. ^^
シャノン暗号
確率分布表とソースUを考えます
における1 | における2 | … | におけるN |
P1 | P2 | … | PN |
ステップ 1: 確率の降順でソート項目
ステップ 2: メッセージの暗号化コードUの長さを計算しますで 式:
この式から、我々は、式が簡単である変更します:
ステップ 3: 計算されたF(におけるで) 式:
ステップ 4: フォワードF(におけるで) ステップから 3 バイナリへ
ステップ 5: Nを取りますで Fの次の文字は、小数の計算(におけるで) これは、Uのコードですで
例: 文字列の電源と nguyenvanquan7826. 上記の手順を実行した後、以下の結果を持っています:
これらは、以下のプログラムを実行した結果であります. プログラムでは、, Pを計算し、n個の分画を計算するとき、Fは、右の小数点形まで変化しませんがで より正確な結果を10進数に新しいスイッチ.
コードアルゴリズム
//============================================================================ // 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; }
障害のあるコードは、私の友人が実行されます
エラーはあなたを行います?
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é. 🙂