二元树的应用

元树的应用----前缀码(哈夫曼编码)。

在通讯系统中,常用二进制来表示字符。但由于字符出现的频率不一样以及为了保密的原因,能否用不等长的二进制数表示不同的字符,使传输的信息所用的总码元尽可能少呢?

但是不等长的编码方案给编码和译码带来了困难。为了解决这个问题,需要引入前缀码(哈夫曼编码)。

设ab…cd为一个长为n的字符串,则a,ab,…,ab…c分别为它的长为1,2,…,n-1的前缀(Prefix)。

设A是一个字符串集,若其中的任一字符串都不是其它字符串的前缀,则称A为一个前缀码(哈夫曼编码)(Prefixed Code)。若组成A的字符串的只有字符0和1,则称A为二元前缀码(Binary Prefixed Code)。如{000,001,01,10,110,111}是一个二元前缀码,而{000,001,01,10,11,111}不是一个二元前缀码。

那么如何构造一个二元前缀码并用它进行编码和译码呢?

我们利用二元树来产生一个二元前缀码:

1 构造一棵二元树,树根的左侧用0标记,右侧用1标记;

2 分支点v的左侧(右侧)的标记就是标记v的二进制数最右端加上0(1);

3 任一片树叶的标记串不是其它树叶的标记串的前缀;

4 将所有树叶的标记串取来就可构成一个二元前缀码。

然后对要发送的信息中的每个字符分别用这个二元前缀码中的字符串代表,当然应该用越长的字符串代表出现频率越最低的字符串。

当接收方接到发送方发过去的信息(实际上是二进制位组成的一个序列),他也将按照那棵标记过的二元树来进行译码,还原出真正的信息。过程如下:

接收方一边接收一边译码,从第一个接收的二进制位开始,按接收到的是0还是1,分别从当前结点的左子树和右子树往下走。如果遇到一片树叶,说明已得到一个字符的码元。从下一个接收的位开始又从根结点起重复上述过程。

如我们由一棵二元树得到一个二元前缀码{010()011()11()10()00()}对应的二元树,现将下列二进制串“101100100100111100”译码。译码的结果是:101100100100111100。翻译成中文就是“我爱你,我确实爱你。

构造编码 构造一颗二叉树的编码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值