/*
Copyright (c)2017,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:第十一周项目1 - 哈夫曼编码算法验证.cpp
作    者:孙仁圆
完成日期:2017年12月29日
版 本 号: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;
}  

第十周 项目一(4)哈夫曼编码的算法验证相关推荐

  1. C语言Huffman Encode霍夫曼编码的算法(附完整源码)

    C语言Huffman Encode霍夫曼编码的算法 C语言Huffman Encode霍夫曼编码的算法完整源码(定义,实现,main函数测试) C语言Huffman Encode霍夫曼编码的算法完整源 ...

  2. C++实现huffman哈夫曼编码的算法(附完整源码)

    C++实现huffman哈夫曼编码的算法 C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测试) C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测 ...

  3. 哈夫曼编码算法 c语言,《哈夫曼编码的算法》

    以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...

  4. 第六周作业1——利用哈夫曼编码英文字母表

    1. 哈夫曼编码.对教材P167中习题5.18,思考并完成问题a-d. 题目: 画出哈夫曼编码树如下: (a)这些字符的哈夫曼编码表如下: (b)每个字母的平均编码需要[5.70]=6位. (c)该值 ...

  5. 哈夫曼编码--贪心算法

    哈夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法.1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于<一种构 ...

  6. 【算法学习笔记】哈夫曼树的构建和哈夫曼编码的实现代码

    介绍 哈夫曼(Haffman)这种方法的基本思想如下: ①由给定的n个权值{W1,W2,-,Wn}构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,-,Tn}. ②在F中选取 ...

  7. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

    哈夫曼编码的实现及应用论文 毕 业 设 计(论文) 题目 哈夫曼编码的实现 及应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 学生姓名 张泽欣 学号 指导教师 职称 时 间 目录 摘要 ...

  8. 哈夫曼树(最优二叉树)、哈夫曼编码

    在此祝大家新年快乐,新的一年守住头发,不断进步! 哈夫曼树 一.哈夫曼树基本概念 二.哈夫曼树的构造算法 三.哈夫曼构造算法的实现 四.哈夫曼编码 五.哈夫曼编码的算法实现 一.哈夫曼树基本概念 (1 ...

  9. 5.1 Python图像处理之图像编码-哈夫曼编码

    5.1 Python图像处理之图像编码-哈夫曼编码 文章目录 5.1 Python图像处理之图像编码-哈夫曼编码 1 算法原理 2 代码 3 效果 1 算法原理 哈夫曼编码是一种根据词频变化的变长二进 ...

最新文章

  1. 太牛逼!一款软件几乎可以操作所有的数据库!
  2. visual studio 2005占用cpu100% -_-...
  3. DBA(六):MHA集群
  4. Java多线程面试准备:聊聊Executor框架
  5. Central Europe Regional Contest 2012 Problem c: Chemist’s vows
  6. 如何使用W5300实现ADSL连接(二)
  7. 文字不间断滚动(转)
  8. 按键精灵打卡怎么写_[按键精灵教程]过新手引导的各种姿势
  9. android 图片文字布局,Android自定义控件图片+文字布局
  10. 深入解读Docker底层技术cgroup系列(1)——cgroup介绍
  11. 报错:fdfs while reading from socket: (timed out))
  12. Ubuntu16.04 微信网页版安装
  13. 金蝶KIS专业版“登录时出现问题,请重新输入”终极解决全过程
  14. 微软Kinect for windows SDK 使用教程 (NUI部分)
  15. 低效程序员的9个坏习惯
  16. STM32F1主从定时器设置
  17. 【华为OD机试真题 JS】IPv4地址转换成整数
  18. word2016如何从指定页面设置页码
  19. Github无法访问的解决方法
  20. xp显示rpc服务器不可用,绿茶XP系统提示“RPC服务器不可用”如何解决

热门文章

  1. Python 用turtle库画八卦
  2. 什么是firmware?
  3. Linux学习-02-Linux的安装
  4. 从零开始搭建K8S集群(二)-- 搭建K8S集群
  5. 玩客云安装mysql_玩客云的使用经验总结
  6. 通信:5G孕育上游投资空间
  7. 什么是非关系型数据库,Redis概述、安装及部署Redis群集
  8. java调用OPC-DA出现0x00000005错误
  9. 我想起个公司名字,招投标行业的,快速搜索标讯的,科技公司,蓝色logo的
  10. 剑指offer算法题028:数组中出现次数超过一半的数字