[工学]CH6 树和二叉树
S = Nx(5%x4+10%x4+15%x3+30%x2+40%x1) = Nx1%x(5x4+10x4+15x3+30x2+40x1) 问题的解决 以各个分数段上学生所占的百分比作为权值,构造一棵哈夫曼树: W={ 5, 15, 40, 30, 10 } (设学生总人数为常数N ) 总的比较次数 S为 : WPL 即 S=N x 1% x WPL 70?a80 a60 C Y N B Y N D Y N E Y N A 80?a90 60?a70 B E D C A S=N x 1% x WPL 练习: (1)已知权值的集合W={ 21,17,6,8,9,8,13 }, 构造哈夫曼树。 (2)已知权值的集合 W={ 0.4, 0.3, 0.1, 0.1, 0.02, 0.08 }, 构造哈夫曼树。 哈 夫 曼 编 码 引 例 前 缀 编 码 哈夫曼 编 码 电 报 手 机 ( 数字信号 ) ? 数 据 传 输 主 要 方 式 ? 快 速 远 距 离 通 信 数据 二进制电文 原数据 编码 译码 发送方 接收方 一、引 例 编码方式 (一) 等长编码 假设要发送的数据中可能出现的字符只有 4个:A、B、C、D,则可用 2位二进制数进行编码,如图: A B C D 00 01 10 11 若要发送的数据是:“ A B C D ” 编码总长 传送电文时,总是希望电文的总长尽可能 短。 这是基于以下两个原因: 电文越短,则在相同条件下传输越快,效率高 。 电文越短,则在传输中出错的机率越小,准确率高 。 怎样缩短电文的总长度? 可缩短每个字符的编码。如: A B C D 0 1 00 01 不等长编码 (二) 不等长编码 A B C D 0 1 00 01 若要发送的数据是: “ A B C D ” 译码出现 “二义性” ! 能否在正确的进行编码和译码的前提下,实现电文的总长最短 ? 二、前缀编码 若任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀,则此编码称为前缀编码。 如:等长编码 不等长编码 A B C D 00 01 10 11 A B C D 0 1 00 01 是前缀编码 非前缀编码 可以证明 其四个叶子结点分别表示A、B、C、D 四个字符;且约定左分支表示字符“0”,右分支表示字符“1”。则可以把从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码。 A B C D 0 0 0 1 1 1 设有如图所示二叉树: A B C D 0 10 110 111 任一条从根结点到叶子结点的路径都不可能经过其它任一叶子结点。这就保证了这样得到的编码一定是前缀编码。 根 对应到二叉树上,若置 wi为叶子结点的权值,li 即第 i个字符的编码长度,就等于从根结点到叶子结点的路径长度。则 恰好就是此二叉树的带权路径长度。 三、哈夫曼编码 假设数据中共包含 n 种字符,每种字符在数据中出现的次数为 wi ,其编码长度为 li ,则电文总长为 。 所以,使电文总长度 最短,只要设计带权路径 长度最短的哈夫曼树即可,这样得 到的编码,称为哈夫曼编码。 练习 : 设某系统在通讯联络中只 可能出现五种字符 A、B、C、 D、E、,其出现概率分别为: 0.21、0.39、0.07、0.20、0.13 。 设计哈夫曼编码。 0 1 40 20 20 0 1 21 39 0 1 7 13 0 1 60 100 C E D A B 字 符 A B C D E 编 码 10 11 000 01 001 哈 夫 曼 编 码 下面讨论哈夫曼编码的具体做法: 由于哈夫曼树中没有度为1的结点,所以,一棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中。(n0=n2+1) 设哈夫曼树的存储表示为: typedef struct { unsigned int weight; unsigned int parent , lchild , rchild; } HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树 Typedef char *HuffmanCo
原创力文档

文档评论(0)