2007年1月28日、树

     以前学图论的时候学过树的概念,也学过二叉树、二叉树遍历等,今天再次看树的内容,总体还是感觉看的轻松的,不过也碰到了几个新内容,首先就是霍夫曼编码,以前学习的编码格式如ASCII编码都是将固定的二进制来表示某一特定的字符,但是霍夫曼编码却显示了另一种编码形式,主要思想就是用较短的二进制串来表示常用的字符,用较长的二进制串来表示不常用的字符。霍夫曼编码很容易用一个根树来定义,首先为了对一个二进制串进行解码,我们从根结点开始沿树向下移动,直到遇一个字符。而二进制的0或1代表向左还是向右。如01010111解码,而它的霍夫曼编码为


 

 解码的过程为:先从根开始由于第一位是0,那么右移,然后为1,则左移,下来是0,那么就右移得到字符R,要对下一个字符进行解码,则从根再次开始,则方法同上可以得到以上的二进制串的解码为:RAT

    根据给出的霍夫曼编码树可以很方便的利用霍夫曼编码的原理进行编码,但是霍夫曼码是怎么得到的呢?根据字符出现的的频率,霍夫曼为从表中来构造霍夫曼码给出了一个算法,它可以使表示字符串的位码占用最少的空间,条件是该字符串中的字符是表中出现频率最高的。具体算发如下:


     算法的通俗语言描述就是这样的,n个频率组成的序列,n>=2。那么如果n =2的情况,那么就直接定义一个树,只有左右两个结点,即算法中的F1和F2,而如果n >2的情况,首先在序列中选择两个最小的,将他们相加,使序列的个数为n-1个,则递归调用就建立了这个序列的霍夫曼编码树。霍夫曼编码树并不是唯一的,或许有不同的形状树,但是他们的霍夫曼编码都占有相同的(最优)空间。

    生成树

    生成树的概念可以这么去理解,如果一个图,也就是说这个图是连通的,即每个结点都有边连接的回路图,那么这个图的左右结点可以生成一个树,这个树的边就是图中的边的子集。生成树的方法有两种:

1,广度优先搜索:在给定层上所有的结点进行处理之后,再移到下一层的结点上。算法如下:

    通俗的说该算法的思想是:V集合是图的所有结点的集合,E集合是图的所有边的集合,而V'是生成树的结点的集合,而E'生成树的边的集合,首先先设v1是树的根,则树结点包含v1,在循环中,先设定先选的哪个结点如v1,然后在其他结点中循环,如果这两个结点存在边,则结点加入树结点中,边加入到树边中,如果无法加入。则完成,

2,深度优先搜索:算法与广度优先搜索大体相同,只是思想有所不同,在深度优先搜索算法中,首先先将根v1放入树结点中,然后找到一条边,对这条边进行处理,首先选择具有最小k的边使它不产生回路,这时这条边就加入树边,而vk就加入树结点,然后把这个结点所有相关的边都进行这样的处理,到最后如果碰到vk等于v1的情况,则树生成。
    两个不同的算法的区别就是在于广度优先搜索是从上往下搜索,而深度优先搜索是相反的,是从下往上搜索。深度优先搜索算法中带出了回朔的概念,也就是说当某一子结点的所有边都处理完之后,就需要回朔到该子结点的父结点进行下次处理,在解决四皇后算法的问题上,可以采用回朔的方法来解决,解决的方法思想大致如下 :首先算法先设定从第一列开始放皇后,第一轮循环中,先设定放在第一行,然后放第二列的皇后,在满足要求的前提下放好第二列皇后,依次递推,但是如果在某一列的解决问题当中,放不下皇后,那么就回朔到上一列中重新定位该列的皇后位置,然后再次回到下一列进行放置。直到得出结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值