zoukankan      html  css  js  c++  java
  • 哈夫曼树和哈夫曼编码

    2.6哈夫曼树和哈夫曼编码

    2.6.1什么是哈夫曼树(Huffman Tree)?

    带权路径长度(WPL):设有二叉树有n个叶子结点,每个叶子结点带有权值wk,从根结点到每个结点的长度为lk,则每个叶子结点的带权路径长度之和就是WPL,WPL=$sum _{n=1}^n w_k l_k$

    最优二叉树/哈夫曼树:WPL最小的二叉树。

    2.6.2哈夫曼树的构造

    每次把权值最小的两棵二叉树合并(如何选取权值最小的树?利用最小堆!

     1 //构造哈夫曼树
     2 HuffmanTree Huffman(MinHeap H) {
     3     HuffmanTree T;
     4     BuildMinHeap(H);//调整成最小堆
     5     //做S->Size-1次合并
     6     for (int i = 1; i < H->Size; i++) {
     7         T = CreateHuff();
     8         T->left = DeleteHeap(H);
     9         T->right = DeleteHeap(H);
    10         T->weight = T->left->weight + T->right->weight;
    11         InsertHeap(H, T);
    12     }
    13     T = DeleteHeap(H);//最小堆的树根
    14     return T;
    15 }

    时间复杂度为O(NlogN)

    2.6.3哈夫曼树的特点

    • 没有度为 1 的结点
    • n 个叶结点的哈夫曼树共有 2n-1 个结点(因为n2=n0-1,又n1=0,故n=2*n0-1)
    • 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树
    • 对同一组权值,可能存在不同构的多棵哈夫曼树,但是得到的最优的WPL是一样的

    2.6.4哈夫曼编码

    怎么进行不等长编码?如何避免二义性

    前缀码(prefix code):任何字符的编码都不是另一个字符编码的前缀

    • 左右分支分别代表0、1
    • 字符只出现在叶结点上

    a:4 x:1 u:2 z:1

  • 相关阅读:
    Linux终端复用——tmux
    python中的global和nonlocal
    Pytorch中的错误和bug
    vue之Mutations 理解
    js 对象的合并(3种方法)转载
    json 数组
    vue-cli 安装时 npm 报错 errno -4048
    vue-cli 安装步骤(转载)
    安卓输入框调起键盘后输入框自动上浮
    jquery on 事件嵌套 事件执行多次
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12637682.html
Copyright © 2011-2022 走看看