³É¼¨
Êý¾Ý½á¹¹Éè¼ÆÐÔʵÑé
Huffman±àÂëÓëÒëÂë
2007120302
ѧ ºÅ 13 ÐÕ Ãû °à ¼¶
·¶ ¸ß »ª ÐÅÏ¢ 072
Éè¼ÆÐÔʵÑ顪Huffman±àÂëÓëÒëÂë
Ò»£®ÊµÑéÄ¿µÄ£º
ÔÚÕÆÎÕÏà¹Ø»ù´¡ÖªÊ¶µÄ»ù´¡ÉÏ£¬Ñ§»á×Ô¼ºÉè¼ÆÊµÑéËã·¨£¬ÊìÁ·ÕÆÎÕHuffmanÊ÷µÄ½¨Á¢·½·¨£¬Huffman±àÂëµÄ·½·¨£¬½ø¶øÉè¼Æ³öHuffmanÒëÂëËã·¨£¬²¢±à³ÌʵÏÖ¡£
¶þ¡¢ÊµÑéÒªÇó£º
ÔÚ6ѧʱÒÔÄÚ£¬ÖÆ×÷³öÄܹ»ÊµÏÖ»ùÓÚ26¸öÓ¢ÎÄ×ÖĸµÄÈÎÒâ×Ö·û´®µÄ±àÒëÂ롣д³ö¼¼Êõ¹¤×÷±¨¸æ²¢¸½Ô´³ÌÐò¡£
Èý£®ÊµÑéÄÚÈݼ°ÈÎÎñ£º
1£®Éè×Ö·û¼¯Îª26¸öÓ¢ÎÄ×Öĸ£¬Æä³öÏÖÆµ¶ÈÈçϱíËùʾ¡£ ×Ö·û ¿Õ¸ñ Ƶ¶È ×Ö·û Ƶ¶È ×Ö·û t Ƶ¶È
a 64 k 5 u 23
b 13 l 32 v 8
c 22 m 20 w 18
d 32 n 57 x 1
e 103 o 63 y 16
f 21 p 15 z 1
1
g 15 q
h 47 r 48
i 57 s 51
186 j 1
80
2£®½¨HuffmanÊ÷£» 3£®ÀûÓÃËù½¨HuffmanÊ÷¶ÔÈÎÒ»×Ö·û´®Îļþ½øÐбàÂ롪¡ª¼´Éè¼ÆÒ»¸öHuffman±àÂëÆ÷£»
4£®¶ÔÈÎÒ»×Ö·û´®ÎļþµÄ±àÂë½øÐÐÒëÂ롪¡ª¼´Éè¼ÆÒ»¸öHuffmanÒëÂëÆ÷¡£ ʵÏÖ²½Ö裺
1£®Êý¾Ý´æ´¢½á¹¹Éè¼Æ£» 2£®²Ù×÷Ä£¿éÉè¼Æ£» 3£®½¨Ê÷Ëã·¨Éè¼Æ£» 4£®±àÂëÆ÷Éè¼Æ£»
5£® ÒëÂëÆ÷Éè¼Æ£»
·ÖÎö¼°Éè¼Æ²½Öè
1. ·ÖÎöÎÊÌâ
1) Ê×ÏÈѧϰ¶þ²æÊ÷µÄ֪ʶ£¬Á˽â¶þ²æÊ÷µÄ·¾¶¡¢È¨ÊýÒÔ¼°´øÈ¨Â·¾¶³¤¶È¼ÆËã¡£ 2) ÈÏʶ»ô·òÂüÊ÷£¬Á˽â»ô·òÂüÊ÷µÄ¶¨Ò壬¹¹Ôì»ô·òÂüÊ÷¹¹ÔìËã·¨
¢Ù ÓÖ¸ø¶¨µÄn¸öȨֵ{w1£¬w2£¬w3£¬¡¡£¬wn}¹¹Ôì¸ù½ÚµãµÄ¶þ
²æÊ÷£¬´Ó¶øµÃµ½Ò»¸ö¶þ²æÊ÷ÉÁÖF={T1£¬T2£¬T3£¬¡¡Tn}¡£
¢Ú ÔÚ¶þ²æÊ÷ÉÀïѡȡ¸ù½Úµãȫְ×îСºÍ´Ë×îСµÄÁ½¿Ã¶þ²æÊ÷×÷Ϊ×óÓÒ
½Úµã¹¹ÔìеĶþ²æÊ÷£¬´ËʱеĶþ²æÊ÷µÄ¸ù½ÚµãȨֵΪ×óÓÒ×ÓÊ÷Ȩֵ֮ºÍ¡£
¢Û ÔÚ¶þ²æÊ÷ÉÁÖÖÐɾ³ý×÷Ϊжþ²æÊ÷µÄ¸ù½Úµã×óÓÒ×ÓÊ÷µÄÁ½¿Ã¶þ²æÊ÷£¬
½«ÐµĶþ²æÊ÷¼ÓÈëµ½¶þ²æÊ÷ÉÁÖFÖС£
¢Ü ÖØ¸´?ºÍ?£¬µ±¶þ²æÊ÷ÉÁÖFֻʣÏÂÒ»¿Ã¶þ²æÊ÷ʱ£¬Õâ¿Ã¶þ²æÊ÷ÊÇËù
¹¹ÔìµÄ»ô·òÂüÊ÷¡£
3) Á·Ï°Í¨¹ýÆÕͨÊ÷À´¹¹Ôì»ô·òÂüÊ÷¡£ 4) ¸ù¾ÝÒÔÉÏ·ÖÎö¹ý³ÌÉè¼ÆÏàÓ¦µÄËã·¨¡£
5) Á˽â»ô·òÂüÊ÷Óë»ô·òÂü±àÂëµÄ¹ØÏµ£¬×¼±¸Éè¼ÆÏàÓ¦µÄËã·¨¡£ 2. Ëã·¨Éè¼Æ
1£® Êý¾Ý½á¹¹
»ô·òÂüÊ÷µÄ½Úµã½á¹¹ typedef struct { int weight; int flag; int parent; int leftChild; int rightChild; } HaffNode; »ô·òÂü±àÂëµÄ½á¹¹ typedef struct { unsigned int bit[MaxN]; int start; int weight; } Code;
2.Éè¼Æ¹¹Ôì»ô·òÂüÊ÷µÄËã·¨£º
void Haffman(int weight[],int n,HaffNode haffTree[])
{
int i,j,m1,m2,x1,x2; for(i=0;i<2*n-1;i++) {if(i haffTree[i].weight=weight[i]; else haffTree[i].weight=0; haffTree[i].parent=-1; haffTree[i].flag=0; haffTree[i].leftChild=-1; haffTree[i].rightChild=-1;} for(i=0;i for(j=0;j {if(haffTree[j].weight m1=haffTree[j].weight; x1=j; } else if(haffTree[j].weight haffTree[x1].parent=n+i; haffTree[x2].parent=n+i; haffTree[x1].flag=1; haffTree[x2].flag=1; haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight; haffTree[n+i].leftChild=x1; haffTree[n+i].rightChild=x2; } } 3.Éè¼Æ±àÂëµÄËã·¨£ºvoid HaffCode(HaffNode haffTree[],int n,Code haffCode[]) { Code *cd=(Code *)malloc(sizeof(Code));
Ïà¹ØÍÆ¼ö£º