- 定義:文字ので、最小加重経路およびすべてのリーフノードこと、浅いノードツリーの深い、大きな周波数として、すなわち小さいクロックツリーノードに、最適なツリーを構築する周波数(周波数)に応じました。これの利点はである再リーフノード、可変長符号化は、最終的なテキストの長さは、データ圧縮を達成するために減少されるようにしてもよいので、ショートの高頻度の文字コード、低周波文字レングス符号化、文字路01エンコーディングに従って行われます;
-
// 树节点数据结构 typedef struct tnode{ char c; int weight; struct tnode *left, *right; //此时为链表 // unsigned int left, right; //也可以为 int,此时为数组 }
- ハフマンツリー構造:最適ハフマンツリーはツリーであるので、すなわちノードは、ツリーのn個のリーフノードでまとめ点の数を持つためにn文字2N-1 0又は2でありますデータ成果:
- 長さ2N + 1の開放空間アレイはARR、1〜Nであるリーフノードであり、n + 1〜2N非リーフが0の未使用スペースをノードです。
-
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]存放的是根节点
- ハフマン符号化の文字を取得します。
-
// 先序遍历树结构,路径即为结果 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); }
-
ファイル圧縮:再符号化からなる対応する文字列、ストレージへの8ビットunsigned char型圧縮の各列のコード配列に応じて