首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言实现哈编码_哈编码压缩文件c语言

, 再由霍夫曼树得到霍夫曼编码**/ typedef struct huffman_tree_node{ int weight;//权重 char c;//字符 非叶子节点为0 struct huffman_tree_node...如 010, 00, .... int len;//编码长度 char c;//字符 }HuffmanCode; //霍夫曼编码(可以用来保存结果) /** * 创建一个节点 * @param c...* node = (HuffmanTreeNode *)calloc(1, sizeof(HuffmanTreeNode)); node->c = c; node->weight = weight;...* @param node 节点 * @param s 编码的字符串 如 001,00,01... * @param len 编码字符串的长度 */ void showCode(HuffmanTreeNode...= 0){ //到叶子节点了 //打印编码结果(或保存到结构体中): printf("%c->%s\n", node->c, s); free(s); return; } //遍历左节点 编码增加一个0

1K40

编码

在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈(HUFFMAN)树编码。哈编码是哈树的一个应用。哈编码应用广泛,如JPEG中就应用了哈编码。...首先介绍什么是哈树。 哈树又称最优二叉树,是一种带权路径长度最短的二叉树。...可以证明哈树的WPL是最小的。   哈编码步骤: 一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,......四、重复二三两步,直到集合F中只有一棵二叉树为止。   eg:对于这样的8个节点:5  29  7  8  14  23  3  11,我们进行哈编码的过程如下: ? ---- ?...然后,我们利用Huffman算法构造出的各字符的二进制编码为(节点的左子树编码为0,右子树编码为1): A: 1011110 B: 1011111 C: 101110 D: 10110

1.9K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C 实现 哈编码

    编码是一种用于数据压缩的无损熵编码,根据压缩数据符号出现频率大小进行编码, 出现频率越高,编码后占bit 越少的变长编码。...(其他详细介绍见参考) 刚好这两天看到,大学时信息论学完后基本忘记,顺便复习以下,并尝试C代码实现。 如何编码 假设, 准备压缩的数据源, 评估得到各个符号出现的频率如下, 则其编码过程如下图 ?...这里写图片描述 详细参考 huffman编码 程序流程 编码 : 遍历准备压缩的输入内容,累计各个符号出现频率 static void cal_char_freq_table(char *array,...= NULL) _build_hfm_code_table(root); } 得到对应的编码映射, 便可以对应编码了 解码时, 也需要二叉树, 依据编码值, 寻得叶节点,得到对应的符号。...---- 参考 wiki huffman编码

    82830

    树、哈编码字典树

    树的构建过程主要有两个步骤:(1)选取权值最小的两个节点构造新的二叉树,其权值为两个节点权值之和;(2)将新生成的节点加入到原来的节点集合中,重复执行步骤一步骤二,直到只剩下一个节点,这个节点就是哈树的根节点...在哈编码中,带权路径长度是一个重要的概念,因为哈编码的目的就是要最小化树的带权路径长度,以达到最优编码的效果。...使用哈编码进行压缩可以达到很高的压缩率,特别是对于包含大量重复字符的文本文件,哈编码的效果更加明显。 (2)无损压缩。哈编码是一种无损压缩方法,压缩后的数据可以完全恢复为原始数据。...哈编码编码和解码过程都可以通过哈树实现,因此哈编码具有很好的可逆性。...所以我们就可以使用哈编码,也就是最优无前缀编码。 通过这个哈树得到A:0 B:10 C:110 D:111,原文也就转换成了01001101101110,len= 14。

    38310

    编码-数据结构(C语言

    导语   本文使用C语言。...对某一输入的字符串,对其构造哈()树,并由此树的到字符串中每一个字符的哈编码   本文哈编码采用顺序存储结构实现   哈树   给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小...利用哈树来设计二进制的前缀编码,既满足前缀编码的条件,又保证报文编码总长最短,该前缀编码称为哈编码   哈编码   如上图所示,对于一个字符串“” 来说,很容易知道每个字符出现的频次{3,2...通过该哈树,我们可以得到每个字符的哈编码 A=10,B=001,C=01,D=11,E=000   容易证明,每个字符的编码都是前缀编码   C语言实现哈编码   网上许多大佬实现哈树的结点都是采用链式存储结构...,而实现哈编码则是采用指针。

    48930

    编码-# 哈树的应用——哈编码

    树的构造   我们观察哈树的形态哈编码,很容易看出,越大的数字应该放在越靠近根节点的位置,这样路径长度比较短:   构造这种树的算法是一种很好理解的贪心算法: 1....那么我们有一个问题,哈树唯一吗?其实即便在我们上面的例子中,他也不是唯一的哈编码,因为两个节点都可以选择放在左子树或者右子树,我们称这种树为同构树。   ...上图中,黄色的两个节点的左右子树左侧树对应的节点正好相反(镜像),他们都可以通过上面的生成算法生成,只在相关节点选择时,将左右子树交换位置即可。   如果排除同构的情况,哈树唯一吗?...哈树的应用——哈编码   哈树最经典的应用是哈编码。在介绍哈编码之前我们先要介绍下可变长度的编码。   假设我们有一篇文字需要编码,这篇文字只有ABCDE5个字符。...其中A出现1次,B出现1次,C出现2次,D出现4次,E出现9次。我们要如何编码呢?

    59230

    编码

    树的应用—哈编码 ?...1.哈编码是一种可以被唯一解读的二进制编码 2.前缀编码保证了解码时不会有多种可能 3.哈编码有不等长等长两种编码,为了保证不等长编码的唯一性,使用前缀编码 4.频率低的采用短编码,频率高的采用长编码...哈编码方案:从叶子到根逆向求每个字符的哈编码 第三个参数是所要求的哈编码的个数,要求几个字母的哈编码就传入几 ? ? ? ? ? ? ? ? ?...哈编码生成 //哈树 存放哈编码的指针数组 输入节点个数 void huffmanCode(HtnNode*& huffTree,char**& huffCode,int n)...void select(HtnNode*& node,int k,int& i1,int& i2) { int min=0; //找到哈树中权值最小最次小的节点的静态链表数组下标 for

    72110

    C++实验】哈树与哈编码实验

    问题描述: 利用哈编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。...(2)编码:利用已建好的哈树,对电文进行编码。 (3)打印编码规则:即字符与编码的一一对应关系。 (4)打印显示电文以及该电文对应的哈编码。...(5)接收原始数据(哈编码):从终端输入一串哈二进制哈编码(由 01构成)。 (6)译码:利用已建好的哈树对该二进制编码进行译码。 (7)打印译码内容:将译码结果显示在终端上。...//开始构建编码 int p,c; for(int i=0;i<number;i++)//有几个字符构建几个编码 { c=i; p=hfm[c].parent; while...=1; code[i]->start--; c=p; p=hfm[c].parent; } code[i]->start++; } //编码构建结束 cout<<"编码前的字符串

    10810

    编码

    编码编码是一种编码方式,其可以对信息进行压缩,而从提高存储,传输的效率 2.1 基本定义 等长编码:任何字符的编码长度都相同,比如ASCII。...[01,10,11,100,101]中10是100的前缀,因此不是无前缀编码 2.2 构建步骤 根据权值构建哈树 将哈树的左树标 0,右树标记1,根节点不计算 将权值替换为对应的字符 列出字符对应的二进制...2.3 构建图示 假设字符A、B、C、D对应的权值为1、9、4、6 (4) 字符 编码 A 000 B 1 C 001 D 01 2.4 哈编码应用 通过哈编码传输文本...、图片,查看前后对比 2.4.1 哈编码 java 实现 /** * @author Howl * 哈编码 */ public class HuffmanCode { /**...,记录字符及其对应的编码,保存文件为 HuffmanCode 将原文的字符用哈编码代替,保存文件为 HuffmanText 将上面两个文件发送给对方 对方根据这两份文件就可以解码出原文 3.

    36910

    看懂哈编码

    计算机中对于数据是以二进制来保存处理的,当我们读取一个文件,计算机得到的原始内容是一些二进制序列, 当需要对这些二进制序列进行显示时,计算机会依照对应的编码方式进行解码,而其中哈编码就是一种高效的编码方式...谈到哈编码就不得不提及哈树,之前有关树的文章对于哈树有过描述实现: 哈树 那么哈树跟哈编码有什么关系呢?...假设上面的文本文件中存储的字符为DCDDCBDACBCDDCDDD, 其中A出现一次,B两次,C五次,D九次,我们将其构建成如下的哈树(可以根据自己风格构建哈树)。 ?...), 读取到1的时候,发现编码表中1不存在对应的字符,那么继续读取,此时10对应编码表的C,那么转为 C,然后继续读取.......。...,那么哈编码为什么没有广泛用在数据传输中呢?

    84730

    编码-【数据结构】树形结构——哈编码

    目录   一、哈编码的概念   在电报业务和数字通信中,可以用01组成的编码表示一个字母或其他字符,用编码序列表示字符序列以进行远距离传送。...若需要编码的字符为C1、C2哈编码,……,Cn,它们在电文中出现的频率分别为W1、W2,……,Wn,以字符作为叶子结点构造一棵哈树。...规定哈树中每个分支结点的左分支表示0,右分支表示1,将从根结点到每个叶子结点所经过路径上的01连接起来,作为叶结点所代表字符的编码。这样得到的编码称为哈编码。...由哈树的定义可知,哈树是带权路径长度最小的二叉树,树的路径长度就是每个字符的编码长度与其出现频率的乘积之和,因此利用哈树构造的编码总长度最短。...二、哈编码的实现   哈编码过程由于是从叶子向上追溯到根,编码过程记录下的是每一个字符逆序的编码,因此除了存储从叶子到根经过的编码外,还需记录编码的起始位置start。

    50620

    编码-【UVA No. 12676】转换哈编码 Inverting Huffman

    【UVA No. 12676】转换哈编码   洛谷题目地址   【题意】   静态哈编码是一种主要用于文本压缩的编码算法。...给定一个由N 个不同字符组成的特定长度的文本,算法选择N 个编码编码,每个不同的字符都对应一个编码。...【样例】   【思路分析】   本题不是简单的哈编码问题,而是根据编码长度哈编码,推测最小字符数。   ...根据编码长度推测,该文本至少有5个字符:1个a、1个d、1个c、2个b。   ...② 根据输入的编码长度算出最大长度,即哈树的最大深度maxd。   ③ 从最大深度maxd向上计算并推测,直到树根。开始时temp=1。

    36620

    编码-哈树原理及Java编码实现

    :​​哈编码—​​   哈编码有两个特点:   带权路径长度WPL最短且唯一;【核心减少编码的操作】编码互不为前缀(一个编码不是另一个编码的开头)【可进行还原用途】。   ...哈编码是如何进行应用的呢,有什么具体的示例呢?   哈树是一颗二叉树哈编码,其是根据元素的权重来进行构成的一棵树,在树上的每个节点val都使用0或1来进行表示。   ...表示,那么1000次a仅仅只需要1000个字符即可哈编码,是不是大大减少了存储空间?...二、哈编码(Java题解)   编码思路过程: encode编码:构造哈树 -> 获取字符及路径map -> 根据map去构建指定编码 1、构造哈树: 准备条件:...哈编码细解& Java 实现​​   [3]. ​​视频:哈编码​​   [4]. ​​【JAVA】KMP算法保姆级教程​​ 本文共 1346 个字数,平均阅读时长 ≈ 4分钟

    46330
    领券