有关树上的序列的问题

1.Huffman Tree(哈弗曼树)

   1.1首先存在定义:

  树的带权路径长度:树中所有叶节点的权值乘上其到根的路径长度之和

    构造一棵二叉树使其带权路径长度最小,称这样的二叉树为哈夫曼树。也叫最优二叉树

 

 1.2 性质1:哈弗曼树是一颗满二叉树:

  证明:如果不是满二叉树,我们就把儿子数为1的节点变为叶子节点,这样会更优;

  性质2:哈夫曼树中权重较小的叶结点的深度不可能小于权重较大的叶结点的深度。

  证明:如果不正确,那么交换这两个节点就会得到更优的答案;

  性质3:存在这样一株哈夫曼树,其中权重最小的两个叶结点的父结点相同。

  证明:很显然吧?如果不成立,那么就会不是满二叉树,与性质1矛盾;

1.3 构造方法:

假设有n 个权值w1; w2; w3.......wn,则哈夫曼树的构造规则为:
将w1; w2; w3......wn 看成有n 棵树的森林(每棵树仅有一个点)
在森林中选出两个根节点的权值最小的树合并,作为一棵新树的左右子树,定义新树根节点的权值为左右子树根节点的权值之和
从森林中删除选取的两棵树,并将新树加入森林
重复2,3 两步,直到森林中只剩一棵树,该树为所求的哈夫曼树


此时哈夫曼树根节点的权值为树的带权路径长度

构造哈夫曼树时可以维护一个堆,每次从堆中取两个权值最小的点,将
其合并,然后把合并后的点加入堆

1.4 Huffman Coding(哈弗曼编码)

考虑将一个文件二进制编码,给每个字符赋一个二进制编码
为了方便解码,我们要求任意一个字符的编码不是另一个字符编码的前缀;
因为如果一个字符编码是另一个的前缀那么在解码时会发生混淆
哈夫曼编码是一种满足如上条件的使总编码长度最短的一种编码

1.5构造方法

首先统计每个字符的出现次数
然后将出现次数作为叶子节点的权值构造哈夫曼树
将字符编码为从根到字符所在叶节点的路径(左儿子为0,右儿子为1)
那么总编码长度就是树的带权路径长度
因为哈夫曼树使带权路径长度最小,因此这种编码方式使总编码长度最小

哈弗曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。

2.prufer序列

 2.1 prufer序列是一个比较实用的东西,有关与度数有关的树上计数问题,都可以用它以及它的性质来解决。

 2.2 将一颗无根树转化为prufer序列;

      我们需要重复进行以下操作,直至树中只剩下两个点:

    找到一个度数为1的点(编号一定要最小,否则编码不能保证唯一性),把这个点的父亲节点加入序列,并把这个点从树上删除;

    这个长度为n-2的序列就是prufer序列;

 2.3 prufer序列转化为无根树

    与上面的方法所对应地:我们需要重复进行以下操作,直至点集中只剩下两个点(刚开始所有点都在点集S中)

    取出prufer序列中最前面的元素x,然后寻找一个在点集中,但不在prufer序列中的编号最小的一个点y,把y从点集中删除,并连接点x和点y

    最后,我们在点集剩下的两个点之间连一条线;

    显然的,它有n-1条边,且绝对不会形成环,因此它是一棵树,且就是原树。

 2.4 性质

    1.prufer序列与无根树一一对应;(由每次找最小的编号的点得到这个性质)

    2.prufer序列中某个编号出现的次数就等于这个编号的节点在无根树中的度数-1 (由定义得到)

    3.n个点的完全图所构成的生成树的计数,就是n^(n-2);

    证明:一个n个节点的树,它的prufer序列的长度是n-2,每个位置有n种选择;

猜你喜欢

转载自www.cnblogs.com/kamimxr/p/11830432.html
今日推荐