首页 > 其他分享 >数据结构实验三

数据结构实验三

时间:2025-01-10 16:56:22浏览次数:1  
标签:weight 哈夫曼 int s2 HT 实验 HC 数据结构

石 家 庄 铁 道 大 学
实 验 报 告

课程名称: 信2305-3 任课教师: 刘 丹 实验日期: 2024.12.15
班 级: 信2305-3 姓 名: 徐戌 学 号: 20234316

实验项目名称:实验三
一、 实验目的
1.掌握二叉树的定义;
2.掌握哈夫曼树和哈夫曼编码算法的实现

二、 实验内容

三、 设计文档

四、 源程序
7-1 哈夫曼树哈夫曼编码

include

include

include <string.h>

include <stdio.h>

using namespace std;

typedef struct{
int weight; //权重
int parent,lchild,rchild; //节点双亲,左右孩子
}HTNode,*HuffmanTree; //动态分配数组存哈夫曼树

int Select(HuffmanTree &HT, int n)
{
int p=0;
for(int i=1;i<=n;i++)
{
if(HT[i].parent0 && (p0||HT[i].weight < HT[p].weight))
{
p=i;
}
}
return p;
}

void CreateHuffmanTree(HuffmanTree &HT,int n)
{
if(n<=1) return;
int m = 2*n - 1;
HT = new HTNode[m+1];
for(int i = 1; i<=m ;i++) //初始化下标为0
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i = 1; i <= n; i++)
{
cin>>HT[i].weight; //输入节点
}

for(int i=n+1; i <= m ;i++) //n-1次选择
{
//选择双亲为0,权值最小的节点,返回他们的序号s1,s2
int s1 = Select(HT, i-1);
HT[s1].parent = i; //删除s1,s2,双亲改为i
int s2 = Select(HT, i-1);
HT[s2].parent = i;
//s1,s2作为i的孩子
HT[i].lchild = s1;
HT[i].rchild = s2;
//i的权值等于孩子的权值之和
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
}

typedef char **HuffmanCode;
void CreateHuffmanCode( HuffmanTree HT,HuffmanCode &HC , int n)
{
HC = new char*[n+1]; //编码数组
char cd[n]; //临时编码数组
cd[n-1] = '\0'; //结束符
for(int i = 1; i<=n ;i++)
{
int start = n-1; //开始指向最后
int c = i;
int f = HT[i].parent; //f指向c的双亲
while( f!=0 )
{
--start; //回溯

      if(HT[f].lchild == c)
          cd[start] = '0';
      else
          cd[start] = '1';
      //回溯
      c = f;
      f = HT[f].parent;
  }
  HC[i] = new char[n-start];
  strcpy(HC[i] , &cd[start]);

}
//delete cd;
}

void show(HuffmanTree HT,HuffmanCode &HC , int n)
{
int wpl = 0;
for(int i=1;i<=n;i++)
{
string s = HC[i];
cout<<HT[i].weight<<"编码为"<<HC[i]<<endl;
wpl+=HT[i].weight*s.length();
}
cout<<"WPL:"<<wpl;
}
int main()
{
int n;
HuffmanTree HT = new HTNode;
cin>>n;
if(n1||n0)
{
cout<<"error";
return 0;
}
CreateHuffmanTree(HT,n);
HuffmanCode HC;
CreateHuffmanCode(HT ,HC,n );
show(HT ,HC,n);
return 0;
}
五、 个人体会
构建哈夫曼树时节点选择错误
构建哈夫曼树的过程中,错误地选择频率较高的节点作为合并对象,导致树的结构不正确。
解决方案:使用优先队列(最小堆)来管理节点,每次从队列中取出频率最小的两个节点进行合并,确保每次选择的都是当前频率最小的节点。
实验感想
通过这次哈夫曼树哈夫曼编码实验,我深刻体会到了数据压缩算法的实际应用和重要性。哈夫曼编码不仅能够有效地减少数据存储空间,还能提高数据传输效率。在实验过程中,我遇到了一些具体的编程问题,如节点选择错误、路径记录错误和数据丢失等。通过使用优先队列、递归记录路径和确保数据格式一致等方法,这些问题得到了有效解决。这次实验不仅提升了我的编程能力,还增强了我对数据结构和算法的理解。未来,我将继续深入学习和探索更多的数据压缩技术,以应对更复杂的实际问题。

标签:weight,哈夫曼,int,s2,HT,实验,HC,数据结构
From: https://www.cnblogs.com/-Xuxu/p/18664246

相关文章

  • 数据结构实验五
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验五一、 实验目的1.掌握散列表......
  • 数据结构实验3
    7-3修改数组(蓝桥杯)给定一个长度为N的数组A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。当修改Ai时,小明会检查Ai是否在A1∼Ai−1中出现过。如果出现过,则小明会给Ai加上......
  • 数据结构实验四
    石家庄铁道大学实验报告课程名称:信2305-3 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验四一、 实验目的1)掌握图的邻接矩......
  • 数据结构实验4
    7-2栈实现表达式求值使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。输入格式:输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERR......
  • 数据结构实验六
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验六一、 实验目的1.掌握插入排......
  • 【西南科技大学计算机学院、智能计算与系统结构实验室主办 | ACM独立出版 | 往届均已
    ACM独立出版|往届均已成功检索,最快刊后1个月内实现EI检索征稿主题范围广:计算机网络安全、软件工程、信号处理、程序分析等领域主办单位:西南科技大学计算机学院、智能计算与系统结构实验室第五届计算机网络安全与软件工程国际学术会议(CNSSE2025)20255thInternational......
  • 数据结构(红黑树)
    问题的起源学习一个知识模块,一般先要厘清学习的目的,一个技术分支的出现必然是应对某个具体问题而产生的解决方案,搞清楚了问题的起源,对解决问题的思路就有了根本性的理解,来龙去脉把握清楚了学习起来就既有动力又有目标了。回归到红黑树的问题,红黑树其实也是一种平衡树,之前......
  • JSP开放实验室预约管理系统2118f--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着教育和科研的不断发展,实验室资源的有效管理和开放共享成为重要议题。传统的人工管理方式存在效率低、资源浪费等问题,无法满......
  • 数据结构全书简答题汇总(期末、考研)三万多字
    第一章:绪论-灰灰考研汇总1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并 被计算机程序处理的符号的集合。2.数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。3.数据项:数据项是数据结构中讨论的最小单位。 是数据......
  • 从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,C++实现亲试可跑)
    目录 怎么判断两个链表是否相交?怎么优化?(字节跳动、货拉拉)手撕冒泡排序(美团)手撕快速排序(作业帮)手撕堆排序(美团)手撕归并排序(美团)手撕二分查找(VIVO)字符串的全排列(要求去重)(字节跳动)求一个字符串中最长不重复子串的长度(字节跳动) 反转字符串的单词:如何在原字符串上翻转......