ハフマン符号化やハフマンツリーの[]データ構造

  • 定義:文字ので、最小加重経路およびすべてのリーフノードこと、浅いノードツリーの深い、大きな周波数として、すなわち小さいクロックツリーノードに、最適なツリーを構築する周波数(周波数)に応じました。これの利点はである再リーフノード、可変長符号化は、最終的なテキストの長さは、データ圧縮を達成するために減少されるようにしてもよいので、ショートの高頻度の文字コード、低周波文字レングス符号化、文字路01エンコーディングに従って行われます;
  • // 树节点数据结构
    typedef struct tnode{
        char c;
        int weight;
        struct tnode *left, *right;	 //此时为链表
        // unsigned int left, right; //也可以为 int,此时为数组
    }

 

  • ハフマンツリー構造:最適ハフマンツリーはツリーであるので、すなわちノードは、ツリーのn個のリーフノードでまとめ点の数を持つためにn文字2N-1 0又は2でありますデータ成果:
  1. 長さ2N + 1の開放空間アレイはARR、1〜Nであるリーフノードであり、n + 1〜2N非リーフが0の未使用スペースをノードです。
  2. int m = n*2 - 1
    for(int i = n+1; i <= m; i++){
        select(arr, i-1, left, right); // 从 [1,i]间选择最小的两个子节点
        //令 left, right 分别为 i 的子节点
        //令 i 为 left, right 的父节点,权值为其和
    }
    // 即可完成树的构建,其中 arr[m]存放的是根节点

     

  • ハフマン符号化の文字を取得します。
  1. // 先序遍历树结构,路径即为结果
    char path[MAX_SIZE];
    char code[SIZE][MAX_SIZE]; // 存放所有字符的编码
    traversalHuffmanTree(&root, path, 0); // 获取编码
    
    void traversalHuffmanTree(tnode *root, char* path, int len){
        if(root == NULL)    return ;
        if(root->left == NULL && root->right == NULL){
            path[len] = '\0'; //叶子节点,结束符
            strcpy(code[root->c], path]); // 将编码赋值到 root 的字符对应编码位置
            return ;
        }
        // 左子树路径为 0
        path[len] = '0';
        traversalHuffmanTree(root->left, path, len+1);
        // 右子树路径为 1
        path[len] = 1;
        traversalHuffmanTree(root->right, path, len+1);
    }
    

     

  2. ファイル圧縮:再符号化からなる対応する文字列、ストレージへの8ビットunsigned char型圧縮の各列のコード配列に応じて

公開された62元の記事 ウォンの賞賛9 ビュー7776

おすすめ

転載: blog.csdn.net/qq_40491305/article/details/104486563