非码方差最小哈夫曼编码
附上此代码中用到的字符频率表
A:7.667
B:1.492
C:2.782
D:4.253
E:11.702
F:2.228
G:2.015
H:5.594
I:6.496
J:0.153
K:0.772
L:4.052
M:2.406
N:6.249
O:7.507
P:1.929
Q:0.095
R:5.487
S:6.327
T:9.056
U:2.758
V:0.978
W:2.360
X:0.150
Y:1.974
Z:0.074
,:1.000
:2.000
.:0.500
编码,解码代码展示(可运行
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
const int N = 100;
typedef struct {
char data;
double weight;
int parent;
int lchild;
int rchild;
}HTNode;
typedef struct {
char cd[N];
int start;
}HCode;
void CreateHT(HTNode ht[], int n0) {
int i, j, k, lnode, rnode;
float min1, min2;
for (i = 0; i < 2 * n0 - 1; i++)
ht[i].parent = ht[i].lchild = ht[i].rchild = -1;
for (i = n0; i < 2 * n0 - 1; i++) {
min1 = min2 = 132767;
lnode = rnode = -1;
for (k = 0; k <= i - 1; k++)
if (ht[k].parent == -1) {
if (ht[k].weight < min1) {
min2 = min1;
rnode = lnode;
min1 = ht[k].weight;
lnode = k;
}
else if (ht[k].weight < min2) {
min2 = ht[k].weight;
rnode = k;
}
}
ht[lnode].parent = i;
ht[rnode].parent = i;
ht[i].weight = ht[lnode].weight + ht[rnode].weight;
ht[i].lchild = lnode;
ht[i].rchild = rnode;
}
}
void CreateHCode(HTNode ht[], HCode hcd[], int n0) {
int i, f, c;
HCode hc;
for (i = 0; i < n0; i++) {
for (int j = 0; j <= n0; j++)
hc.cd[j] = '-2';
hc.start = n0;
c = i;
f = ht[i].parent;
while (f != -1) {
if (ht[f].lchild == c)
hc.cd[hc.start--] = '0';
else
hc.cd[hc.start--] = '1';
c = f;
f = ht[f].parent;
}
hc.start++;
hcd[i] = hc;
}
}
int main() {
HTNode ht[N];
HCode hcd[N];
int n0 = 29;
int x[29] = { 7667,1492,2782,4253,11702,2228,2015,5594,6496,153,772,4052,2406,6249,7507,1929,95,5487,6327,9056,2758,978,2360,150,1974,74,1000,2000,500 };
for (int i = 0; i < n0; i++)
ht[i].weight = x[i];
CreateHT(ht, n0);
CreateHCode(ht, hcd, n0);
for (int j = 0; j < n0; j++) {
switch ((int)ht[j].weight) {
case 7667:cout << "A" << ": weigth: "; break;
case 1492:cout << "B" << ": weigth: "; break;
case 2782:cout << "C" << ": weigth: "; break;
case 4253:cout << "D" << ": weigth: "; break;
case 11702:cout << "E" << ": weigth:"; break;
case 2228:cout << "F" << ": weigth: "; break;
case 2015:cout << "G" << ": weigth: "; break;
case 5594:cout << "H" << ": weigth: "; break;
case 6496:cout << "I" << ": weigth: "; break;
case 153:cout << "J" << ": weigth: "; break;
case 772:cout << "K" << ": weigth: "; break;
case 4052:cout << "L" << ": weigth: "; break;
case 2406:cout << "M" << ": weigth: "; break;
case 6249:cout << "N" << ": weigth: "; break;
case 7507:cout << "O" << ": weigth: "; break;
case 1929:cout << "P" << ": weigth: "; break;
case 95:cout << "Q" << ": weigth: "; break;
case 5487:cout << "R" << ": weigth: "; break;
case 6327:cout << "S" << ": weigth: "; break;
case 9056:cout << "T" << ": weigth: "; break;
case 2758:cout << "U" << ": weigth: "; break;
case 978:cout << "V" << ": weigth: "; break;
case 2360:cout << "W" << ": weigth: "; break;
case 150:cout << "X" << ": weigth: "; break;
case 1974:cout << "Y" << ": weigth: "; break;
case 74:cout << "Z" << ": weigth: "; break;
case 1000:cout << "," << ": weigth: "; break;
case 2000:cout << " " << ": weigth: "; break;
case 500:cout << "." << ": weigth: "; break;
}
cout << ht[j].weight*0.001 << ": HuffmanCode: ";
for (int i = 0; i < 100; i++) {
if (hcd[j].cd[i]=='0'||hcd[j].cd[i]=='1')
cout << hcd[j].cd[i];
}
cout<<endl;
}
string word;
cout << "请您输入待编码的码文:";
getline(cin,word);
int len = word.length();
char c;
for (int i = 0; i < len; i++) {
c = word[i];
if (c >= 'a'&&c <= 'z')
c = c - 'a' + 'A';
switch (c) {
case 'A':cout << "1101"; break;
case 'B':cout << "101100"; break;
case 'C':cout << "01001"; break;
case 'D':cout << "11111"; break;
case 'E':cout << "011"; break;
case 'F':cout << "111101"; break;
case 'G':cout << "111100"; break;
case 'H':cout << "0101"; break;
case 'I':cout << "1010"; break;
case 'J':cout << "1011011011"; break;
case 'K':cout << "1011010"; break;
case 'L':cout << "11101"; break;
case 'M':cout << "00101"; break;
case 'N':cout << "1000"; break;
case 'O':cout << "1100"; break;
case 'P':cout << "101110"; break;
case 'Q':cout << "1011011001"; break;
case 'R':cout << "0011"; break;
case 'S':cout << "1001"; break;
case 'T':cout << "000"; break;
case 'U':cout << "01000"; break;
case 'V':cout << "1110000"; break;
case 'W':cout << "00100"; break;
case 'X':cout << "1011011010"; break;
case 'Y':cout << "101111"; break;
case 'Z':cout << "1011011000"; break;
case ',':cout << "1110001"; break;
case ' ':cout << "111001"; break;
case '.':cout << "10110111"; break;
}
}
cout << endl;
string code;
cout << "请输入待解码的码文:";
cin >> code;
int len1 = code.length();
for (int i = -1; i < len1;) {
hh:;
if (i == len1 - 1) {
system("pause");
return 0;
}
char c[11] = { '-1' };
int count = 0;
c[0] = code[++i];
if (c[0] == '0') {
c[1] = code[++i];
if (c[1] == '0') {
c[2] = code[++i];
if (c[2] == '0') { cout << "T"; goto hh; }
else {
c[3] = code[++i];
if (c[3] == '1') { cout << "R"; goto hh; }
else {
c[4] = code[++i];
if (c[4] == '1') { cout << "M"; goto hh; }
else {
c[5] = code[++i];
if (c[5] == '0') { cout << "W"; goto hh; }
}
}
}
}
else {
c[2] = code[++i];
if (c[2] == '1') { cout << "E"; goto hh; }
else {
c[3] = code[++i];
if (c[3] == '1') { cout << "H"; goto hh; }
else {
c[4] = code[++i];
if (c[4] == '1') { cout << "C"; goto hh; }
else { cout << "U"; goto hh; }
}
}
}
}
else {
c[1] = code[++i];
if (c[1] == '0') {
c[2] = code[++i];
if (c[2] == '0') {
c[3] = code[++i];
if (c[3] == '0') { cout << "N"; goto hh; }
else { cout << "S"; cout << "S"; goto hh; }
}
else {
c[3] = code[++i];
if (c[3] == '0') { cout << "I"; goto hh; }
else {
c[4] = code[++i];
if (c[4] == '0') {
c[5] = code[++i];
if (c[5] == '0') { cout << "B"; goto hh; }
else {
c[6] = code[++i];
if (c[6] == '0') { cout << "K"; goto hh; }
else {
c[7] = code[++i];
if (c[7] == '1') { cout << "."; goto hh; }
else {
c[8] = code[++i];
if (c[8] == '0') {
c[9] = code[++i];
if (c[9] == '0') { cout << "Z"; goto hh; }
else { cout << "Q"; goto hh; }
}
else {
c[9] = code[++i];
if (c[9] == '1') { cout << "J"; goto hh; }
else { cout << "X"; goto hh; }
}
}
}
}
}
else {
c[5] = code[++i];
if (c[5] == '0') { cout << "P"; goto hh; }
else { cout << "Y"; goto hh; }
}
}
}
}
else {
c[2] = code[++i];
if (c[2] == '0') {
c[3] = code[++i];
if (c[3] == '0') { cout << "O"; goto hh; }
else { cout << "A"; goto hh; }
}
else {
c[3] = code[++i];
if (c[3] == '0') {
c[4] = code[++i];
if (c[4] == '1') { cout << "L"; goto hh; }
else {
c[5] = code[++i];
if (c[5] == '1') { cout << " "; goto hh; }
else {
c[6] = code[++i];
if (c[6] == '0') { cout << "V"; goto hh; }
else { cout << ","; goto hh; }
}
}
}
else {
c[4] = code[++i];
if (c[4] == '1') { cout << "D"; goto hh; }
else {
c[5] = code[++i];
if (c[5] == '0') { cout << "G"; goto hh; }
else { cout << "F"; goto hh; }
}
}
}
}
}
}
system("pause");
return 0;
}