huffman

Posted nlkog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了huffman相关的知识,希望对你有一定的参考价值。

今天试着做了个Huffman,结果压缩算法被硬生生写成膨胀算法

我好蒻啊!!!!!!!!!!!!!!!

加密:

 1 #include<bits/stdc++.h>
 2 #include<windows.h>
 3 #define ll long long
 4 #define N 10000001
 5 using namespace std;
 6 int cnt;
 7 struct node{
 8     int l,r,val;
 9     char ch;
10 }hfm[N];
11 
12 struct cmp{bool operator()(int a,int b){return hfm[a].val>hfm[b].val;}};
13 
14 char a[128],b[128],str[N];
15 int tohfm[256],len,root,cdl[256];
16 bitset<8>code[256];
17 bool apr[256];
18 priority_queue<int,vector<int>,cmp>q;
19 
20 void dfs(int x,int dep,int cd){
21     if(hfm[x].ch){
22         int ascii=(int)hfm[x].ch;
23         cdl[ascii]=dep;
24         for(int i=dep-1;i>=0;i--)
25             code[ascii][i]=cd&1,cd>>=1;
26         return;
27     }
28     dfs(hfm[x].l,dep+1,cd<<1);
29     dfs(hfm[x].r,dep+1,cd<<1|1);
30 }
31 
32 void huffman(){
33     for(int i=1;i<=cnt;i++)q.push(i);
34     while(q.size()>=2){
35         int a,b,c;
36         a=q.top(),q.pop();
37         b=q.top(),q.pop();
38         c=++cnt;
39         hfm[c].l=a,hfm[c].r=b,hfm[c].val=hfm[a].val+hfm[b].val;
40         q.push(c);
41     }
42     dfs(root=cnt,0,0);
43 }
44 
45 void Out(int x){
46     char ch[16]={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F};
47     printf("%c%c",ch[x/16],ch[x%16]);
48 }
49 
50 int main(){
51     scanf("%s%s",a,b);
52     freopen(a,"r",stdin);
53     freopen(b,"w",stdout);
54     while(~scanf("%c",&str[++len])){
55         int ascii=(int)str[len];
56         if(!apr[ascii])
57             tohfm[ascii]=++cnt,apr[ascii]=true,hfm[cnt].ch=str[len];
58         hfm[tohfm[ascii]].val++;
59     }
60     int cnt1=cnt;
61     huffman();
62     Out(cnt1);
63     for(int i=1;i<=cnt1;i++){
64         int ascii=(int)hfm[i].ch;
65         Out(ascii);
66         int ans=1;
67         for(int j=0;j<cdl[ascii];j++)ans=ans<<1|code[ascii][j];
68         Out(ans);
69     }
70     int tail=0,ans=0;
71     for(int i=1;i<=len;i++){
72         int ascii=(int)str[i];
73         for(int j=0;j<cdl[ascii];j++){
74             tail++;
75             ans=ans<<1|code[ascii][j];
76             if(tail==7){
77                 Out(ans);
78                 tail=0,ans=0;
79             }
80         }
81     }
82     if(tail)
83     Out(ans<<(7-tail));
84     return 0;
85 }

解密:

 1 #include<bits/stdc++.h>
 2 #include<windows.h>
 3 #include<conio.h>
 4 #define ll long long
 5 #define N 100001
 6 using namespace std;
 7 char hfm[1024],a[128],b[128];
 8 int n;
 9 
10 int In(){
11     int re=0;
12     char a,b;
13     if(!~scanf("%c%c",&a,&b))return -1;
14     re=(a<=9?a-0:a-A+10);
15     re=re<<4|(b<=9?b-0:b-A+10);
16     return re;
17 }
18 
19 int main(){
20     scanf("%s%s",a,b);
21     freopen(a,"r",stdin);
22     freopen(b,"w",stdout);
23     n=In();
24     for(int i=1;i<=n;i++){
25         int ch,code;
26         ch=In();
27         code=In();
28         hfm[code]=(char)ch;
29 //        printf("%c : %d
",ch,code);
30     }
31     int byte,last;
32     int val=1;
33     while(~(byte=In())){
34         for(int i=6;i>=0;i--){
35             val=val<<1|((byte&(1<<i))>>i);
36             if(hfm[val]){
37                 if(hfm[val]&(1<<7))
38                     if(!last)last=hfm[val];
39                     else printf("%s",last<<8|(hfm[val])),last=0;
40                 else printf("%c",hfm[val]);
41                 val=1;
42             }
43         }
44     }
45     return 0;
46 }

BUG很多,可行性很低,我很蒻

但是可以用来加密(雾)

其实就是模板改了一下

以上是关于huffman的主要内容,如果未能解决你的问题,请参考以下文章

Huffman树 建树方法代码实现

C++ class实现Huffman树(完整代码)

huffman编码代码

学习数据结构笔记(10) --- [赫夫曼树(Huffman Tree)与赫夫曼编码(Huffman coding)]

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩