[アルゴリズム] 最適な符号化 – 暗号化方式シャノン
コンテンツ
シャノン暗号
コードアルゴリズム
この記事では、今述べたシャノンと暗号化方式コード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é. 🙂