哈夫曼编码的运用场景比较多,而且适用于数据压缩,且压缩率最高可达90%,可见其重要性。哈夫曼编码是基于0,1串表示的,且哈夫曼编码是变长码,即它的长度不是固定的,而是可变的。那么我们怎么建立哈夫曼编码树呢?
给出一组数据:{45,13,12,16,9,5}
先初始化,比如说{45,13,12,16,9,5},共6个数;
其中n=5,n为下标最大值;由公式[n-2]/2,得出1.5,向上取整为2(向下取整:1.5取1,去掉小数部分,仅保留整数部分;而向上取整:去掉小数部分,整数部分+1;不同于四舍五入);
值为2,指向12,即调整12及其子节点,12跟它的子节点5比较,12比5大,互换两者位置,结果为{45,13,5,16,9,12};
然后,指针左移,值为1,指向13,即调整13及其子节点,13跟它的子节点16和9比较,其中9比俩者都小,因此互换13和9,得出{45,9,5,16,13,12};
指针继续左移,值为0,指向45,即调整45及其子节点,其中5比9或45都小,因此5和45互换,得出{5,9,45,16,9,13,12};
45比12大,继续调整两者位置,最终为{5,9,12,16,13,45};
可以知道,堆顶元素一定是最小的。
将堆顶元素5取出,然后将最后一个子节点-45移动到堆顶,
继续按照上面的方法来进行排序,得出最终结果:
我们取出堆顶元素9,此时构建哈夫曼编码树:
然后又接着取出12,13,16,45;
最终构建的结果为:
这个为算法构建过程,其实我们自己理解的话,不需要这么复杂的想法。