第十一周项目1——二叉树算法验证(4) 哈夫曼编码的算法验证
- /*
- * Copyright (c)2016,烟台大学计算机与控制工程学院
- * All rights reserved.
- * 文件名称:wu.cpp
- * 作 者:陈朋
- * 完成日期:2016年11月11日
- * 版 本 号:v1.0
- *问题描述:实现哈夫曼树的算法验证,并测试数据。
- *输入描述:无
- *程序输出:测试数据
- */
- #include <stdio.h>
- #include <string.h>
- #define N 50 //叶子结点数
- #define M 2*N-1 //树中结点总数
- //哈夫曼树的节点结构类型
- typedef struct
- {
- char data; //结点值
- double weight; //权重
- int parent; //双亲结点
- int lchild; //左孩子结点
- int rchild; //右孩子结点
- } HTNode;
- //每个节点哈夫曼编码的结构类型
- typedef struct
- {
- char cd[N]; //存放哈夫曼码
- int start;
- } HCode;
- //构造哈夫曼树
- void CreateHT(HTNode ht[],int n)
- {
- int i,k,lnode,rnode;
- double min1,min2;
- for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1
- ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
- for (i=n; i<2*n-1; i++) //构造哈夫曼树
- {
- min1=min2=32767; //lnode和rnode为最小权重的两个结点位置
- lnode=rnode=-1;
- for (k=0; k<=i-1; k++)
- if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找
- {
- if (ht[k].weight<min1)
- {
- min2=min1;
- rnode=lnode;
- min1=ht[k].weight;
- lnode=k;
- }
- else if (ht[k].weight<min2)
- {
- min2=ht[k].weight;
- rnode=k;
- }
- }
- ht[i].weight=ht[lnode].weight+ht[rnode].weight;
- ht[i].lchild=lnode;
- ht[i].rchild=rnode;
- ht[lnode].parent=i;
- ht[rnode].parent=i;
- }
- }
- //实现哈夫曼编码
- void CreateHCode(HTNode ht[],HCode hcd[],int n)
- {
- int i,f,c;
- HCode hc;
- for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码
- {
- hc.start=n;
- c=i;
- f=ht[i].parent;
- while (f!=-1) //循序直到树根结点
- {
- if (ht[f].lchild==c) //处理左孩子结点
- hc.cd[hc.start--]='0';
- else //处理右孩子结点
- hc.cd[hc.start--]='1';
- c=f;
- f=ht[f].parent;
- }
- hc.start++; //start指向哈夫曼编码最开始字符
- hcd[i]=hc;
- }
- }
- //输出哈夫曼编码
- void DispHCode(HTNode ht[],HCode hcd[],int n)
- {
- int i,k;
- double sum=0,m=0;
- int j;
- printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码
- for (i=0; i<n; i++)
- {
- j=0;
- printf(" %c:\t",ht[i].data);
- for (k=hcd[i].start; k<=n; k++)
- {
- printf("%c",hcd[i].cd[k]);
- j++;
- }
- m+=ht[i].weight;
- sum+=ht[i].weight*j;
- printf("\n");
- }
- printf("\n 平均长度=%g\n",1.0*sum/m);
- }
- int main()
- {
- int n=8,i; //n表示初始字符串的个数
- char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
- double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1};
- HTNode ht[M];
- HCode hcd[N];
- for (i=0; i<n; i++)
- {
- ht[i].data=str[i];
- ht[i].weight=fnum[i];
- }
- printf("\n");
- CreateHT(ht,n);
- CreateHCode(ht,hcd,n);
- DispHCode(ht,hcd,n);
- printf("\n");
- return 0;
- }
第十一周项目1——二叉树算法验证(4) 哈夫曼编码的算法验证相关推荐
- 哈夫曼编码算法 c语言,《哈夫曼编码的算法》
以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...
- 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
- 程序员的算法课(8)-贪心算法:理解霍夫曼编码
一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...
- C语言Huffman Encode霍夫曼编码的算法(附完整源码)
C语言Huffman Encode霍夫曼编码的算法 C语言Huffman Encode霍夫曼编码的算法完整源码(定义,实现,main函数测试) C语言Huffman Encode霍夫曼编码的算法完整源 ...
- C++实现huffman哈夫曼编码的算法(附完整源码)
C++实现huffman哈夫曼编码的算法 C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测试) C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测 ...
- 二叉树的基本操作及哈夫曼编码/译码系统的实现
二叉树的基本操作及哈夫曼编码/译码系统的实现 实验目的和要求 掌握二叉树的二叉链表存储表示及遍历操作实现方法. 实现二叉树遍历运算的应用:求二叉树中叶结点个数.结点总数.二叉树的高度,交换二叉树的左右 ...
- 第十周 项目一(4)哈夫曼编码的算法验证
/* Copyright (c)2017,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十一周项目1 - 哈夫曼编码算法验证.cpp 作 者:孙仁圆 完成日期:2 ...
- 哈夫曼算法以及求哈夫曼编码
哈夫曼树又称最优树,是一类带权路径长度最短的树.其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼的构造算法: (1):根据给定的n个权值{w1,w2,w3.....},构造n课只有 ...
- 哈夫曼编码--贪心算法
哈夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法.1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于<一种构 ...
- 树与二叉树转换,森林与二叉树的转换,哈夫曼编码例题详解
二叉树的前序序列和后序序列正好相反,则该二叉树一定是(B) A.空或只有一个结点 B.高度等于其结点数 C.任一结点无左孩子 D.任一结点无右孩子 2.任何一棵二叉树的叶子结点在前序.中序.后序遍历序 ...
最新文章
- MongoDB系列:二、MongoDB常用操作练习
- 部署SQL AZURE的客户端管理工具,云计算体验之二
- gtkorphan清理孤立软件包
- 成功解决TypeError: object of type ‘int‘ has no len()
- 提高Python运行效率的六个窍门
- 最小函数值(信息学奥赛一本通-T1370)
- 2021-06-20 pip有时候需要加上--user安装才好使
- QT5之MYSQL操作
- 程序员的小技能,1行代码修改开机密码、1张图片让你电脑死机
- 无法打开登录所请求的数据库 xxxx。登录失败。 用户 'NT AUTHORITY\SYSTEM' 登录失败。...
- 【C#】使用OWIN创建Web API
- Linux上,最常用的一批命令解析
- 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
- 学模具设计应该掌握哪些内容?
- Excel房贷计算表(商贷)1/2
- 移动磁盘提示文件名目录名或卷标语法不正确怎么修复?
- 微信朋友圈信息流可能采用算法排序吗?
- 5月第2周安全回顾 Wi-Fi无线安全建议 微软修补4个漏洞
- java基于ssm框架开发的高校实验室预约管理系统实战项目
- Java学习——JDBC之从导Jar包到封装
热门文章
- Button点击事件的五种写法
- 大数据系列之Java调用elasticsearch的增删查改聚合
- mysql 视图 统计_mysql 视图
- 苹果雪豹操作系统_苹果 M1 版 MacBook 软件兼容实测:VS Code、PhotoShop 目前还不能用(附列表)...
- 京东和天猫的运营模式的区别
- 快速搜索Wox工具之Everything Service没有运行报错,解决办法!
- Skype for business之Skype会议直播
- 单例模式及常用使用场景简析
- Monitor(二分,二维前缀和板子记录)
- c语言中的 #ifndef/#define/#endif的作用