• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鍵盤上的舞者

            My Email: marckywu@gmail.com
            隨筆 - 19, 文章 - 0, 評(píng)論 - 3, 引用 - 0
            數(shù)據(jù)加載中……

            HuffmanTree的創(chuàng)建及編碼

            typedef struct _HTNode {
                unsigned 
            int weight;        /* 權(quán)值 */
                unsigned 
            int parent;        /* 父節(jié)點(diǎn)索引 */
                unsigned 
            int lchild;        /* 左孩子索引 */
                unsigned 
            int rchild;        /* 右孩子索引 */
            } HTNode, 
            *HuffmanTree;         /* 動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼樹 */

            typedef 
            char **HuffmanCode;     /* 動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼編碼表 */

            /* 從ht的1~n的節(jié)點(diǎn)中找出權(quán)值最小的兩個(gè)節(jié)點(diǎn),分別存于s1, s2中 */
            void Select(HuffmanTree ht, int n, int *s1, int *s2)
            {
                
            int i;

                
            *s1 = 0;
                
            *s2 = 0;
                
            /*設(shè)置s1, s2到開始兩個(gè)parent等于0的節(jié)點(diǎn)位置*/
                
            for (i = 1; i <= n; ++i) {
                    
            if (*s1 != 0 && *s2 != 0)
                        
            break;
                   
                    
            if (ht[i].parent == 0)
                        
            *s1 == 0 ? *s1 = i : *s2 = i;
                }
                
            /*找出ht中parent等于0,且權(quán)值最小的兩個(gè)節(jié)點(diǎn)位置,分別存于s1, s2中*/
                
            for ( ; i <= n; ++i) {
                    
            if (ht[i].parent != 0continue;

                    
            if ( (ht[*s1].weight > ht[*s2].weight) && (ht[*s1].weight > ht[i].weight))
                        
            *s1 = i;
                    
            else if ( (ht[*s2].weight > ht[*s1].weight) && (ht[*s2].weight > ht[i].weight))
                        
            *s2 = i;
                }
            }

            /* 通過w存儲(chǔ)的n個(gè)權(quán)值,來創(chuàng)建一顆哈夫曼樹, ht_ptr指向這顆哈夫曼樹 */
            void CreateHuffmanTree(HuffmanTree *ht_ptr, int *w, int n)
            {
                
            int m;
                
            int i;
                
            int s1, s2;
                HuffmanTree p;
                
                
            if (n <= 1return;
                m 
            = 2 * n - 1;              /* n個(gè)字符,需要2n-1個(gè)空間來存儲(chǔ)整顆huffman tree */
                
            *ht_ptr = (HuffmanTree)malloc( (m + 1* sizeof(HTNode)); /* 0號(hào)單元不用 */

                
            for (p = *ht_ptr + 1, i = 1; i <= n; ++i, ++p, ++w) { /* 初始化數(shù)組中前n個(gè)單元存儲(chǔ)的字符 */
                    p
            ->weight = *w;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }
                
            for ( ; i <= m; ++i, ++p) { /* 初始化數(shù)組中剩余的單元 */
                    p
            ->weight = 0;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }

                
            for (i = n + 1; i <= m; ++i) {
                    Select(
            *ht_ptr, i - 1&s1, &s2);
                    
            /* 設(shè)置s1, s2的父親為i */
                    (
            *ht_ptr + s1)->parent = i;
                    (
            *ht_ptr + s2)->parent = i;
                    
            /* 設(shè)置i的左孩子為s1, 右孩子為s2 */
                    (
            *ht_ptr + i)->lchild = s1;
                    (
            *ht_ptr + i)->rchild = s2;
                    
            /* 設(shè)置i的權(quán)值為s1, s2之和 */
                    (
            *ht_ptr + i)->weight = (*ht_ptr + s1)->weight + (*ht_ptr + s2)->weight;
                }
            }

            /* 對(duì)ht_ptr存儲(chǔ)的哈夫曼樹的n個(gè)葉子節(jié)點(diǎn)進(jìn)行哈夫曼編碼 */
            void HuffmanCoding(HuffmanTree *ht_ptr, HuffmanCode *hc_ptr, int n)
            {
                
            int i;
                
            int start;
                
            char *cd = NULL;
                
                
            *hc_ptr = (HuffmanCode)malloc( (n + 1* sizeof(char *));

                cd 
            = (char *)malloc(n * sizeof(char));
                cd[n 
            - 1= '\0';

                
            for (i = 1; i <= n; ++i) {
                    start 
            = n - 1;

                    
            int current, father;
                    
            for (current = i, father = (*ht_ptr + i)->parent; /* 從葉子節(jié)點(diǎn)開始,并取得父節(jié)點(diǎn)father */
                         father 
            != 0;                                 /* 父節(jié)點(diǎn)為0時(shí)及到達(dá)了根節(jié)點(diǎn) */
                         current 
            = father, father = (*ht_ptr + father)->parent) { /* 逐漸向根節(jié)點(diǎn)靠攏 */
                        
            if ( (*ht_ptr + father)->lchild == current) /* 當(dāng)前節(jié)點(diǎn)為左孩子 */
                            cd[
            --start] = '0';
                        
            else
                            cd[
            --start] = '1';

                    }

                    
            *(*hc_ptr + i) = (char *)malloc( (n - start) * sizeof(char));
                    strcpy(
            *(*hc_ptr +i), &cd[start]);
                }
                free(cd);
            }


            posted on 2009-09-28 17:49 Marcky 閱讀(583) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法

            久久99精品久久久久子伦| 国产三级观看久久| 99久久无码一区人妻a黑| 热re99久久精品国产99热| 久久久久久久91精品免费观看| 97精品伊人久久久大香线蕉| 久久免费精品视频| 久久人与动人物a级毛片| 色综合合久久天天综合绕视看| 亚洲精品99久久久久中文字幕 | 久久久久亚洲AV片无码下载蜜桃| 日本免费久久久久久久网站| 国产成年无码久久久免费| 狠狠精品久久久无码中文字幕| 午夜天堂av天堂久久久| 久久久精品久久久久久| 成人久久精品一区二区三区| 2021国内久久精品| 久久精品国产精品亜洲毛片| 国产成人久久精品区一区二区| 久久精品无码一区二区WWW| 狠狠综合久久综合中文88 | 久久91精品综合国产首页| 久久精品国产亚洲AV无码偷窥| 午夜精品久久久久久影视riav| 国产999精品久久久久久| 精品精品国产自在久久高清| 一本久久知道综合久久| 久久久无码精品亚洲日韩蜜臀浪潮| 精品国产91久久久久久久a| 99久久精品这里只有精品| av午夜福利一片免费看久久| 久久人人爽人人爽人人片av高请| 久久久久久国产精品无码下载| 亚洲午夜精品久久久久久浪潮| 久久强奷乱码老熟女| 久久久久久国产a免费观看不卡| 精品久久久无码中文字幕天天| 久久国产影院| 久久亚洲av无码精品浪潮| 无码任你躁久久久久久久|