数据结构与算法--哈夫曼树应用

这篇具有很好参考价值的文章主要介绍了数据结构与算法--哈夫曼树应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1关:统计报文中各个字符出现的次数

任务描述

本关任务: 给定一串文本,统计其中各个字符出现的次数;

测试说明

平台会对你编写的代码进行测试:

测试输入:` abcdeabcdeabcdabcdabcdabcbccc

预期输出: a 6 b 7 c 9 d 5 e 2

代码:

//第一关
//(2)统计message所指一串报文中的所有不同字符及其出现次数
Precord computeChar(char *message)
{
    //补充代码
    //补充代码
    int i;
    Precord rcd=(Precord)malloc(sizeof(struct record));
    //初始化rcd
    rcd->m=0;
    for (i=0;i<N;i++)
    {
        rcd->data[i].ww=0; //初始化各字符出现的次数为0
    }
   //统计
    for (i=0;i<strlen(message);i++)
    {
        for (int j=0;j<=rcd->m;j++)
        {
            if (rcd->data[j].ww==0)
            {
                rcd->data[j].ww++;
                rcd->data[j].ch=message[i];
                rcd->m++;
                break;
            }
            else if (rcd->data[j].ch==message[i])
            {
                rcd->data[j].ww++;
                break;
            }
        }
    }
    return rcd;
}

第2关:对第一关报文中的各个字符进行哈夫曼编码

任务描述

本关任务:以第一关计算得到的各个字符的出现次数作为权值,构建哈夫曼树,并对各个字符进行哈夫曼编码。输入一串字符,输出各个字符及其出现的次数,该字符在哈夫曼树中是作为左分支还是右分支、该字符的哈夫曼编码。

输入

abcdeabcdeabcdabcdabcdabcbccc

输出

字符: a 出现次数:6 左or右:0 哈夫曼编码:00

字符: b 出现次数:7 左or右:1 哈夫曼编码:01

字符: c 出现次数:9 左or右:1 哈夫曼编码:11

字符: d 出现次数:5 左or右:1 哈夫曼编码:101

字符: e 出现次数:2 左or右:0 哈夫曼编码:100

代码:

//第二关
//(3)初始化哈夫曼树
 PHtTree initHuffman(Precord r)
 {
      //补充代码
    int i;
    int n=2*(r->m)-1;
    PHtTree ht = (PHtTree)malloc(sizeof(struct HtTree));
    ht -> htable = (struct HtNode*)malloc(sizeof(struct HtNode)*n);
	ht -> m = r -> m;
    for(i=0; i<n; i++){
        ht->htable[i].ww = ht->htable[i].parent = ht->htable[i].llink = ht->htable[i].rlink = -1;
    }
    for(i=0; i<r->m; i++){
        ht -> htable[i].ww = r->data[i].ww;
    }
    return ht;

 }

// 第二关
//(4)构造哈夫曼树。 根据报文中出现的各字符及其出现次数,构造哈夫曼树
//约定:构造过程中每次选的根结点值最小的子树作为左子树,根结点值次小的子树作为右子树 
void createHuffman(PHtTree ht,Precord r)
{
	//补充代码
    int min1, min2, s1, s2;
    int i, j;
    int n=r->m;
	for(i=0; i<n; i++){
		min1=min2 = 255;
		s1=s2= -1;
		for(j=0; j<n+i; j++){

			if(ht->htable[j].ww < min1 && ht->htable[j].parent == -1){
				min2 = min1; 
                s2 = s1; 
                min1 = ht->htable[j].ww; 
                s1 = j;
			}
			else if(ht->htable[j].ww < min2 && ht->htable[j].parent == -1){
				min2 = ht->htable[j].ww; 
                s2=j;
			}
		}

		if(n+i != 2*n-1){
		    ht -> htable[s1].parent = n+i;
		    ht -> htable[s2].parent = n+i;
		}

		ht -> htable[n+i].ww = min1+min2;
		ht -> htable[n+i].llink = s1;
		ht -> htable[n+i].rlink = s2;
	}
	ht -> root = 2*n-2;

}

// 第二关
//(5)编码
void coding(PHtTree ht,Precord r)
{
	//补充代码
    int i,j;
    int n=r->m;
    int p, q;
	char str[5];
	for(i=0; i<n; i++){
		p = i;
		q = 0;
		while(ht->htable[p].parent != -1){
			if(ht->htable[ht->htable[p].parent].llink == p){
				str[q] = '0';
				q++;
			}
			else{
				str[q] = '1';
				q++;
			}
			p = ht->htable[p].parent;
		}
		str[q] = '\0';
		if(ht->htable[ht->htable[i].parent].llink == i)
			r->data[i].branch_code = '0';
		else
			r->data[i].branch_code = '1';
		p=q-1;
		for(j=0; j<q; j++){
			r->data[i].codes[j]=str[p];
			p--;
		}
	}


}

第3关:哈夫曼译码

任务描述

本关任务:对第二关的字符串所得到的二进制编码串进行译码,输出译码后的原文。

输入:

00011110110000011110110000011110100011110100011110100011101111111

输出:

abcdeabcdeabcdabcdabcdabcbccc

代码:

// 第三关
//(6)译码
void decoding(char *codes,char *codesToMessage,PHtTree ht,Precord r)
{
	//补充代码
    int i=0,j=0; 
    int p=0;
    int n=r->m;
    while(codes[j] != '\0'){
        p=2*n-2;
        while(ht->htable[p].llink != -1 && ht->htable[p].rlink != -1){
            if(codes[j] == '0')
                p = ht -> htable[p].llink;
            else
                p = ht -> htable[p].rlink;
            j++;
        }
        codesToMessage[i] = r->data[p].ch;
        i++;
    }
    codesToMessage[i] = '\0';

}

 文章来源地址https://www.toymoban.com/news/detail-735817.html

 

到了这里,关于数据结构与算法--哈夫曼树应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs 未来会重构实现该两个实验 内容要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树 2、建立编码

    2024年02月13日
    浏览(55)
  • 【数据结构与算法】哈夫曼编码(最优二叉树)实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(46)
  • 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构“基于哈夫曼树的数据压缩算法”的实验报告 一、实验目的 二、实验设备 三、实验内容 1.【问题描述】 2.【输入要求】 3.【输出要求】 4.【实验提示】 四、实验步骤

    2024年02月09日
    浏览(59)
  • 【数据结构与算法】哈夫曼编码(最优二叉树实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(44)
  • 数据结构与算法(C语言版)---哈夫曼编译码器

    1.1、问题阐述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道) ,每端都需要一个完整的编/译

    2024年02月03日
    浏览(85)
  • 数据结构——哈夫曼树与哈夫曼编码

    1.1 基本概念 路径 :指从根结点到该结点的分支序列。 路径长度 :指根结点到该结点所经过的分支数目。 结点的带权路径长度 :从树根到某一结点的路径长度与该结点的权的乘积。 树的带权路径长度(WPL) :树中从根到所有叶子结点的各个带权路径长度之和。 哈夫曼树 是由

    2024年02月05日
    浏览(43)
  • 数据结构之哈夫曼树与哈夫曼编码

    编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。 但其在传输和存储等情况下编码效率不高 。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例

    2023年04月15日
    浏览(61)
  • 数据结构之哈夫曼树和哈夫曼编码

    切入正题之前,我们先了解几个概念: 路径:从树的一个结点到另一个结点分支所构成的路线 路径长度:路径上的分支数目 树的路径长度:从根结点出发到每个结点的路径长度之和 带权路径长度:该结点到根结点的路径长度乘以该结点的权值 树的带权路径长度:树中所有

    2024年02月11日
    浏览(43)
  • 数据结构课程实验五:哈夫曼树与哈夫曼编码

    实验日期:2022-12-20   目录 一、实验目的 1、掌握哈夫曼树的建立 2、掌握哈夫曼编码方式 二、实验内容

    2024年02月05日
    浏览(47)
  • 数据结构【哈夫曼树】

    最优二叉树也称哈夫曼 (Huffman) 树 ,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 涉及到的几个概念: 路径: 从树中一个结点到另一个结

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包