哈夫曼树及哈夫曼编码


   


     一,引言




         哈夫曼树及哈夫曼编码_第1张图片






如上图,是一个判断体重在什么范围内的判定树,例如,学校体检的时候,我们反复用这个算法,当你输入一个体重:200斤,然后程序就开始反复判断了,经过三次判断,它发现你过重,然后重启系统了,又来一个人,还是200斤,三次判断之后,又系统重启了…后面的200多个200多斤的盘子判断完了之后,来了个120的,终于是个比较正常的体重了,但是系统一判断完,系统还是重启,反复检查之后,发现你那台8086时代的电脑终于撑不住了~

 

   于是你改了下算法,换了一棵判定树,这次,先判断这个人是不是个200多斤的胖子,让后再……….

 

    想表达的就是,对于不同的判定树,它们比较的次数是不一样的.

 

   对于同一个问题,判断树的总共的比较次数是由一个条件出现的概率和问题的规模决定的.出现的概率越大,也就意味着这个条件被比较的次数越多,那么,我们就得先对这样的条件进行判断.

 

 

 

二,哈夫曼树

 

    鉴于上面的问题,我们可以用数学上很类似求加权平均数的一个公式来求,这里就不写了.还是图解一下,no picyou say a 'sha'~


  首先,列出所有根节点:



   哈夫曼树及哈夫曼编码_第2张图片



哈夫曼树及哈夫曼编码_第3张图片

 

 此时,在森林中,我们将2和4删去,并将新生成的根节点6加入,

 

哈夫曼树及哈夫曼编码_第4张图片



然后我们再从森林中选两个根节点权值最小的,如步骤二那样,将56加起来,删去57,将生成的11加入森林。。。




哈夫曼树及哈夫曼编码_第5张图片




直到森林中只含一棵二叉树为止。



最后,我们得到:


哈夫曼树及哈夫曼编码_第6张图片







三,哈夫曼编码


     在得到哈夫曼树之后,对哈夫曼树结点的左右分支分别置“0”和“1”就可以得到哈夫曼编码。如图:


哈夫曼树及哈夫曼编码_第7张图片



小结:利用哈夫曼树,可以将将整体选择判断的次数降到最低,优化算法,进而将得到的哈夫曼树进行编码时,则可以将字符在传输过程中总的编码长度降到最短。



你可能感兴趣的:(算法,二叉树)