986: 哈夫曼译码

2024-05-09 21:44
文章标签 译码 哈夫曼 986

本文主要是介绍986: 哈夫曼译码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

解法:先把代码粘贴到编译器(vs)上,分享一个一键去除空白行的操作,ctrl+f调出查找窗口,输入查找(?<=\r\n)\r\n,选择正则表达式,替换就可以发现会去掉一百多行空白行。

本题只需要利用得到的哈夫曼码去译码即可。

推荐先学这个【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码_哈夫曼树编码-CSDN博客

要看 得到的哈夫曼树是什么样子

只需要加上

void print_haffman(haffnode ht[],int n) {cout << "下标i" << "   ";cout << "ch" << " ";cout << "weight" << " ";cout << "flag" << " ";cout << "parent" << " ";cout << "leftchild" << " ";cout << "rightchild" << " ";cout << endl;for (int i = 0; i < 2 * n - 1; i++) {cout <<"  "<< i << "      ";cout << ht[i].ch << "   ";cout << ht[i].weight << "     ";cout << ht[i].flag << "      ";cout << ht[i].parent << "      ";cout << ht[i].leftchild << "       ";cout << ht[i].rightchild << "     ";cout << endl;}
}

得到

一下子就可以画出哈夫曼树出来

要看 得到的哈夫曼译码表

只需加上

void print_haffmancode(code hc[], int n) {for (int i = 0; i < n; i++) {cout << hc[i].ch << " ";for (int j = hc[i].start+1; j < n; j++) {cout << hc[i].bit[j];}cout << endl;}
}

得到

回归正题。

译码(以a0001举例)

算法就是:遍历i给定01串,j每次从下标2*n-2开始回溯到0,若达到叶子节点也就是左右孩子为空,则打印ht[j]且重置j,否则继续遍历。

代码

void ccode(haffnode ht[], int n)
{ string s;cin >> s;int j = 2 * n - 2;for (int i = 0; i < s.size(); ) {while (ht[j].leftchild!=-1 || ht[j].rightchild!=-1) {if (s[i] == '0')j = ht[j].leftchild;elsej = ht[j].rightchild;i++;}cout << ht[j].ch;j = 2 * n - 2;}
}

这篇关于986: 哈夫曼译码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974581

相关文章

数据结构-非线性结构-树形结构:有序树 ->二叉树 ->哈夫曼树 / 霍夫曼树(Huffman Tree)【根据所有叶子节点的权值构造出的 -> 带权值路径长度最短的二叉树,权值较大的结点离根较近】

哈夫曼树概念:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 一、相关概念 二叉树:每个节点最多有2个子树的有序树,两个子树分别称为左子树、右子树。有序的意思是:树有左右之分,不能颠倒 叶子节点:一棵树当中没有子结点的结点称为叶子

BCC软译码和硬译码之间的性能差别

在探讨BCC(由于BCC并非广泛认知的术语,且没有直接对应到某个具体的技术或标准,这里假设它是指某种涉及编码或数据处理的技术或过程)的软译码和硬译码之间的性能差别时,我们可以从一般性的角度来解释这两种译码方式在性能上的不同。 软译码(Soft Decoding) 软译码通常指的是在解码过程中,解码器不仅输出最终的解码结果(如比特序列),还输出每个解码结果的不确定性或概率信息。这种信息通常用于后

哈夫曼树例子

五个字符:a,b,c,d,e,它们出现的的频率为8,14,10,4,18构造相应的哈夫曼树,求出每个字符的哈夫曼编码: 哈夫曼树:54/ \22 32/ \ / \c10 12 b14 e18/ \d4 a8哈夫曼编码:a:011 b:10 c:00 d:010 e:11

合并果子之哈夫曼树——优先队列解决哈夫曼

树-堆结构练习——合并果子之哈夫曼树 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit  Status Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆

九度OJ-1172-哈夫曼树

由于建立的哈夫曼树不唯一,所以机试多考察哈夫曼树的带权路径长度和,如此题。此问题最终转化为利用堆模拟建树过程,求出非叶节点的权值和(=该哈夫曼树的带权路径长度和)。(无需作出哈夫曼树的具体结构体)   收获如下:   ①关于哈夫曼树:该树非叶节点的权值和=该哈夫曼树的带权路径长度和   ②关于堆排序:堆排序建堆O(n*logn),初始堆完成后,每次重新调整只需O(logn)(树深),故是

最优二叉树(哈夫曼树)知识点

路径:在一棵树中从一个结点往下到孩子或孙子结点之间的通路 结点的路径长度:从根节点到该节点的路径上分支的数目 树的路径长度:树中每个结点的路径长度之和 结点的权:给树中的结点赋予一个某种含义的值,则该值为该节点的权 结点的带权路径长度:结点的路径长度乘以结点的权 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度 (Weight Path Length)   最优二叉树(哈夫

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right;};using HuffmanTree = TreeNode *; 结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针,用于指向哈夫曼树节点的左子节点。righ

使用Java实现哈夫曼编码

前言 哈夫曼编码是一种经典的无损数据压缩算法,它通过赋予出现频率较高的字符较短的编码,出现频率较低的字符较长的编码,从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码,包括哈夫曼编码的原理、具体实现步骤以及完整的代码示例。 哈夫曼编码原理 哈夫曼编码的基本原理可以概括为以下几个步骤: 统计字符频率:遍历输入数据,统计每个字符出现的频率。构建哈夫曼树:根据字符的频率构建一棵哈

C++哈夫曼树+哈夫曼编码的实现(双完整版)

注释详解哈夫曼Tree和哈夫曼Code 一、哈夫曼Tree二、哈夫曼Code   本文是根据B站视频👉青岛大学 - 王卓老师的数据结构来实现的,涉及到哈夫曼Tree 和 哈夫曼Code的C++版完整实现,若有不足欢迎大佬斧正-(/▽\) 一、哈夫曼Tree   具体理论请配合👉B站视频来学习,构造哈夫曼Tree主要的方法如下:   第一步:构造森林全是根   第二步:选用

半导体芯片结构以及译码驱动

一.半导体芯片结构   可能并不是只有一个芯片,有多个芯片就需要片选线了。 二.半导体存储芯片的译码驱动 主要有两种方式:线选法和重合法 线选法:每一个存储单元都用一根字选择线选中,直接选中存储单元的各位。(一维) 这种方式结构比较简单,但是只适用于容量不大的储存芯片。 重合法:用两个方向的地址共同选择一个存储矩阵的存储单元(二维),可以用更少的字选择先实现更多的储存单元的选择。