1. 程式人生 > >Huffman編碼的設計與應用

Huffman編碼的設計與應用

第一行,每個字元對應的Huffman編碼(用空格隔開)
第二行,字串對應的Huffman編碼序列
第三行,Huffman碼序列對應的字串

樣例輸入

4
a b c d
9 3 2 6
abcd
111001010

樣例輸出

0 101 100 11
010110011
dcba

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
#define Max_code_len 15
#define Max_tree_size 10 
const int inf=2147483647;
int n;
int w[1005];
char cc[1005];
char tm[1005];
struct node
{ 
	char c;
	int weight;
	int fa;
	int lc,rc;
	char code[Max_code_len];  
};
 

  node HT[2*Max_tree_size];
void  select(int nn,int&s1,int &s2)
{
	int minn=inf;
	int min_num=0;
	int i;
	for (i=1;i<=nn;i++)
	{
		if (HT[i].fa!=0) continue;
		if (HT[i].weight<minn)
		{
			minn=w[i];
			min_num=i;
		}
	}
	s1=min_num;
	minn=inf;
		for (i=1;i<=nn;i++)
	{
		if (HT[i].fa!=0||i==s1) continue;
		if (HT[i].weight<minn)
		{
			minn=w[i];
			min_num=i;
		}
	}
		s2=min_num;


}
void CreateHuffmanTree(char *cc,int *w) 
{
	int i;
	int m=2*n-1;
	for (i=1;i<=n;i++)
	{
		HT[i].fa=0;
		HT[i].c=cc[i];
		HT[i].weight=w[i];
		HT[i].lc=HT[i].rc=0;
	}
	for (;i<=m;i++)
	{
		HT[i].weight=0;
		HT[i].fa=HT[i].lc=HT[i].rc=0;
	}
	int s1,s2;
	for (i=n+1;i<=m;i++)
	{
		select(i-1,s1,s2);
		
		HT[s1].fa=HT[s2].fa=i;
		HT[i].lc=s1;
		HT[i].rc=s2;
		HT[i].weight=HT[s1].weight+HT[s2].weight;
	}
}
void HuffmanCoding()
{
	char cd[Max_code_len];
	int m=Max_code_len;
	cd[m-1]=0;
	int st;
	int c;
	int f;
	int i,j;
	for (i=1;i<=n;i++)
	{
		st=m-1;
		for (c=i,f=HT[i].fa;f!=0;)
		{
			if (c==HT[f].lc)
				cd[--st]='0';
			else
				cd[--st]='1';

			c=f;f=HT[f].fa;
		}
		for (j=st;j<m-1;j++)
			HT[i].code[j-st+1]=cd[j];
		HT[i].code[j-st+1]=0;
	}
}
void  ShowHuffmanCode()
{
	int i;
	for(i=1;i<n;i++)
		printf("%s ",HT[i].code+1);
	printf("%s\n",HT[i].code+1);
}
int ShowHuffmanEncode(char *tm) 
{
	int i,j;
	int len=strlen(tm);
	for (i=0;i<len;i++)
	{
		for (j=1;j<=n;j++)
		{
			if (tm[i]==HT[j].c)
			{ 
				printf("%s",HT[j].code+1);
			break; 
			}
		}
		if (i+1>=n) break;
	}
	printf("\n");
	return 0;
}
int ShowHuffmanDecode(char *tm) 
{
	int i,c,root;
	root=2*n-1;
	c=root;
	int len=strlen(tm);
	for (i=0;i<len;i++)
	{
		if (HT[c].lc==0&&HT[c].rc==0)
		{
			printf("%c",HT[c].c);
			c=root;
		}
		if (tm[i]=='0') 
		  c=HT[c].lc; 
		else 
		 	c=HT[c].rc;  
	}
	printf("%c\n",HT[c].c);

return 0;
}
int main()
{

	cin>>n;
	int i;
		for (i=1;i<=n;i++)
		cin>>cc[i];
	for (i=1;i<=n;i++)
		cin>>w[i];

	CreateHuffmanTree(cc,w);
	HuffmanCoding();
	ShowHuffmanCode();
	scanf("%s",tm+1); 
	ShowHuffmanEncode( tm+1);
	scanf("%s",tm+1); 
	ShowHuffmanDecode(tm+1);
	return 0;
	
}