贪心算法——哈夫曼编码与Dijkstra算法

贪心算法——哈夫曼编码与Dijkstra算法_第1张图片

哈夫曼树是一个典型的贪心算法问题,在构造哈夫曼树的时候我们要使得WPL最小,将频率记作权值,那么频率越高,路长越小,WPL越小,所以最后构造的哈夫曼树中频率高的往往在上层,频率低的会放在下层。其核心思想是,每次选取两个最小频率结点作为孩子组成一个二叉树,其父节点频率=孩子节点频率之和,然后把这个父结点构成的树入队,重复上述操作n-1次直至只剩一个结点,即为我们所求的哈夫曼树。(不唯一)

贪心算法——哈夫曼编码与Dijkstra算法_第2张图片

(为了防止解码时对编码的误判,权值只会放在叶子结点。)

 贪心算法——哈夫曼编码与Dijkstra算法_第3张图片

 

 


贪心算法——哈夫曼编码与Dijkstra算法_第4张图片

 迪杰斯特拉算法是一个贪心算法求单源最短路径的经典问题,核心思想是在原有向图中,V1V2之间的权值可以记作c[1][2],若两点连通则c[1][2]中保存其路径长,否则c[1][2]=+∞。

贪心算法——哈夫曼编码与Dijkstra算法_第5张图片

 

贪心算法——哈夫曼编码与Dijkstra算法_第6张图片

贪心算法——哈夫曼编码与Dijkstra算法_第7张图片

 

 比如从点V1出发,我们需要经过多轮迭代计算,每轮需要算出当前路径到其他结点的最小路长,如果计算的新路长更大就保留原路长,更小就替换原路长。

比如第一轮,我们发现初始dist中dist[2]最小,说明点1到点2最短,因此我们第一轮选择路径为V1V2,集合{1,2}那么保持dist[2]不变(排除已选节点的dist),V2的前一个结点prev[2]=1。第二轮我们求出V2到其他可达节点的总路长并修改dist,并且这一轮中dist[4]最小,因此我们路径为V1V4,集合为{1,2,4},V4的前一个结点prev[4]=1。以此类推,直到最后经历了n-1伦集合中包含了全部的节点,最后的节点是5,prev[5]=3,prev[3]=4,prev[4]=1。所以最终的最短路径是V1435。

你可能感兴趣的:(算法设计与分析例题分析,贪心算法,算法)