赫夫曼(Huffman)树也称最有二叉树,是一类带全路径长度最短的树,有着广泛的应用。比方一棵判定树,依据学生的成绩划分及格还是不及格还是优、中等、良好。显然用if-else或者switch就能够简单实现,当然能够直接毫不考虑的直接这样写,可是假设我们再肯花点功夫,就能够得到更加高效的程序。

我们能够以学生的总的学科分数的占的各个分数段的比率为权,构造一棵赫夫曼树,这样能够降低比較次数,提高程序执行效率。

构造赫夫曼树的方法步骤事实上非常easy--赫夫曼算法:

(1). 依据给定的n个权值{w1,w2,w3...,wn}构成n棵二叉树的集合F = {T1,T2,....Tn},当中每棵二叉树Ti中仅仅有一个带权的wi的根节点,其左右子树为空。

(2). 在F中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左、右子树上根节点的权值之和。

(3). 在F中删除这两棵树,同一时候将新得到的二叉树增加到F中。

(4). 反复(2)、(3)。知道F中含一棵树为止。

以下是构造HuffmanTree的代码实现:

#include"stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>typedef struct
{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;       //动态分配数组,存储哈弗曼树
typedef char** HuffmanCode; //动态分配数组存储哈夫曼编码表void MaoPao(HuffmanTree HT,int* arr,int number,int &s1,int &s2) //传入HT、数组首地址、数组中元素的个数:m
{//仅仅需进行两趟比較就可以,得到两个最小数int i,j,m;printf("\n进入冒泡排序函数...");  for(i = 0;i<2;i++)        {for(j = 0;j<number - i;j++)  //number是数组中的实际元素个数..{//    printf("\n进入循环");//printf("\n arrj = %d,arrj+1 = %d",arr[j],arr[j+1]);if(HT[ arr[j] ].weight < HT[ arr[j+1] ].weight)       {m = arr[j];arr[j] = arr[j+1];arr[j+1] = m;}}}         s1 = arr[number - 1];s2 = arr[number];printf("\n.........%d,%d",s1,s2);
}
void Select(HuffmanTree HT,int n,int &s1,int &s2)   //n是总的节点数量
{printf("\n进入Select函数");int arr[20] = {0};   //存放parent为0的节点的编号int m = 0;   for(int i = 1;i<=n;i++){if(HT[i].parent == 0){         arr[m] = i;    //从0開始存,那么数组中的元素个数就 = mm++;printf("\nparent = 0的节点号:%d",i);         if(m > 19)m = 19;}}//比方n = 8,表示一共8个数。最后m++ = 8。实际数组是0~7的。那么m就是数组中的元素个数//OK,找到parent = 0 的节点,以下选择weight最小的两个。该用什么算法呢?我用的是冒泡法。上浮两个最小数MaoPao(HT,arr,m,s1,s2);   //m是数组中的元素个数..数组从1開始。数组中的最后一个元素是m,倒数一个是m-1得到两个权值最小的节点}int HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int* w,int n)   //n是叶子的数量,w存放n个字符(叶子)的权值
{int m;         //总共的节点数int s1 = 0;int s2 = 0;        //存储选择到的节点编号char* cd;       int c;int f;int start;HuffmanTree  p;int i = 0;if(n <= 1)return 0;m = 2 * n - 1;HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));for(p = HT+1,i = 1;i <= n; ++i,++p,++w)//第一号单元空出来的。从1開始。这里是初始化操作。分两步。一步是有权值的。已不是没有权值的。用if也是能够的{p->weight = *w;  p->parent = 0;p->lchild = 0;p->rchild = 0;}for(;i <= m;++i,++p){printf("a..aaaaaaa......i = %d",i);p->weight = 0;p->parent = 0;p->lchild = 0;p->rchild = 0;}printf("初始化完成.."); //建立哈弗曼树//8,这是后面測试的。

for(i = n+1;i<=m;++i) //这里要循环n-1次,也就是说,构造哈弗曼树须要同一个操作做n-1次,m = 2n-1,2n-1-(n+1)+1 = n-1 { Select(HT,i-1,s1,s2); printf("\n此时...i = %d,m = %d,,,被选中的编号..%d,%d",i,m,s1,s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; } return 1; } void ShowHT(HuffmanTree &HT,int n) //n是叶子的数量 { int m = 2*n - 1; //总共的节点数量 for(int i = 1;i<=m;i++) { printf("\n编号:%d--Weight:%d Parent: %d LeftChild: %d RightChild;%d",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); } }

以下是main函数的測试:

#include"stdafx.h"
//#include"BasicGraph2.h"
#include "HuffmanCode.h"
void main()
{ HuffmanTree HT;HuffmanCode ch;int n = 8;int m = 15;int arr[] = {5,29,7,8,14,23,3,11};if(HuffmanCoding(HT,ch,arr,n))ShowHT(HT,n);
}

执行结果:

图2:

说明:事实上依据上面的权值,树有多种。可是WPL都是一样的。

算法基础(八):超具体最优二叉树构建(1)相关推荐

  1. Python实现Huffman算法求最优二叉树

    Huffman算法基本步骤(离散数学p336):         给定实数w1,w2,.....,wt. 1.作t片树叶,分别以w1,w2,...,wt为权.         2.在所有入度为0的顶点 ...

  2. python svm超参数_grid search 超参数寻优

    http://scikit-learn.org/stable/modules/grid_search.html 1. 超参数寻优方法 gridsearchCV 和  RandomizedSearchC ...

  3. 《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)

    14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...

  4. python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索

    python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索 Jeff Dean在ICML 2019上进行了有关AutoML的演讲,并将自动化分为4个级别 手动构造预测变量,不引入学习的 ...

  5. 【超参数寻优】量子粒子群算法(QPSO) 超参数寻优的python实现

    [超参数寻优]量子粒子群算法(QPSO) 超参数寻优的python实现 一.粒子群算法的缺点     二.量子粒子群算法     三.QPSO算法的python实现     参考资料 一.粒子群算法的 ...

  6. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优

    DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优 目录 基于keras对LSTM算法进行超参数调优 1.可视化LSTM模型的loss和acc曲线

  7. 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现

    [超参数寻优]粒子群算法(PSO) 超参数寻优的python实现 一.算法原理 1.粒子群算法的名词解释 2.粒子更新 二.PSO算法参数寻优的python实现 参考资料 粒子群优化算法(Partic ...

  8. 算法基础知识——二叉树

    算法基础知识--二叉树 目录: 基础知识 基本定义 应用实例 重建二叉树[剑指Offer_编程题] 二叉树的镜像[剑指Offer_编程题] 从上往下打印二叉树[剑指Offer_编程题] 二叉搜索树的后 ...

  9. 算法基础之二叉树理论

    算法基础之二叉树理论 1.树基础 2.二叉树基础 3.二叉树基本操作 3.1插入结点 3.2二叉树遍历 3.2.1 深度优先遍历 3.2.2 广度优先遍历 1.树基础 官方定义:树是n(n>=0 ...

  10. 【数据结构与算法基础】树与二叉树的互化

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

最新文章

  1. c语言不能写入文件,求大神看看为什么不能将数据写入文件
  2. 【MATLAB】进阶绘图 ( Bar 条形图 | bar 函数 | bar3 函数 | Bar 条形图样式 | 堆叠条形图 | 水平条形图 | barh 函数 )
  3. cidaemon.exe是什么进程及如何关闭cidaemon.exe进程
  4. windows时间显示到秒
  5. 面经——Java基础
  6. SAP Kyma GraphQL storage实现
  7. java compareandset 包_Java AtomicReferenceArray compareAndSet()用法及代码示例
  8. java list 初始化_Java新特性:数据类型可以扔掉了?
  9. [转]Java常用概念解答
  10. 移动应用开发平台UDE上线V2.0,升级引擎,推出应用云托管服务
  11. 安装Mercurial进行版本管理
  12. centos7安装python3
  13. 马斯洛提出动机理论_马斯洛的需要层次理论
  14. Packet Tracer使用说明
  15. 输入框常规测试数据用例设计
  16. 修改手机状态栏字体的颜色(如:白底黑字)
  17. 获取iOS设备唯一标识
  18. 使用python绘制标准心形线
  19. termios程序范例
  20. 浅析嵌入式系统之uboot详解(5.1)—时钟分频

热门文章

  1. spoj 2798 Query on a tree again! 树链剖分
  2. 断开所有sql用户连接(转)
  3. Windows Phone 7 MVVM模式的学习笔记
  4. 各种翻页的效果! FILTER: revealTrans使用说明
  5. [Luogu] 树状数组
  6. 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement
  7. linux中下载迅雷链接
  8. SCRUM 12.23
  9. loadrunner中文件的操作
  10. Asp.Net 之 枚举类型的下拉列表绑定