三进制霍夫曼编码

合集下载

Huffman霍夫曼编码

Huffman霍夫曼编码

霍夫曼编码的局限性


利用霍夫曼编码,每个符号的编码长度只能 为整数,所以如果源符号集的概率分布不是 2负n次方的形式,则无法达到熵极限。 输入符号数受限于可实现的码表尺寸 译码复杂 需要实现知道输入符号集的概率分布 没有错误保护功能
尾码为DIFF的B位
原码,若DIFF0 反码,若DIFF0

按此规则,当DIFF0时,尾码的最高位是“1”; 而当DIFF0时则为“0”。解码时则可借此来判断 DIFF的正负。 书中例4—9
自适应霍夫曼编码提出的目的和意义:
在静态霍夫曼编码中,要构造编码树必须提前统计 被编码对象中的符号出现概率,因此必须对输入符 号流进行两遍扫描,第一遍统计符号出现概率并构 造编码树,第二遍进行编码,这在很多实际应用的 场合中之不能接受的。其次,在存储和传送霍夫曼
i 1 i
n
单位:以2为底的对数时是比特/符号(bit/symbol); 以e为底的对数时是奈特/符号(nat/symbol); 以10为底的对数时是哈特/符号( hart/symbol) 其中 I(xi)=-logp(xi) 表示某个事件xi的信息量。

平均码长 编码效率
例:现有一个由5个不同符号组成的30个符号的字 符串:BABACACADADABBCBABEBEDDABEEEBB 计算 (1) 该字符串的霍夫曼码 (2) 该字符串的熵 (3) 该字符串的平均码长




霍夫曼(Huffman)编码是一种统计编码。 属于无损(lossless)压缩编码。 以霍夫曼树─即最优二叉树,带权路径长 度最小的二叉树,经常应用于数据压缩。 根据给定数据集中各元素所出现的频率来 压缩数据的一种统计压缩编码方法。这些 元素(如字母)出现的次数越多,其编码的 位数就越少。 广泛用在JPEG, MPEG, H.2X等各种信息编 码标准中。

霍夫曼编码

霍夫曼编码

摘要内容:霍夫曼编码是可变字长编码(VLC)的一种。

在变字长编码中,如果码字长度严格按照对应符号出现的概率大小逆序排列,则其平均码字长度为最小。

霍夫曼编码用于数据的无损压缩,通过构建霍夫曼树,然后建立起一张特殊的霍夫曼编码表将元字符进行编码。

它是根据每一个源字符出现的估算概率,即权重而建立起来的,就是出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的,同时保持编码的惟一可解性。

霍夫曼编码并不是唯一的,当权重相同的时候,不同的编码方式会产生不同的码。

关键词:霍夫曼编码霍夫曼树霍夫曼编码表摘要目录任务书一 ........................................... 错误!未定义书签。

摘要 . 0目录 (1)一、课程设计内容 ................................... 错误!未定义书签。

二、课程设计目的 ................................... 错误!未定义书签。

三、环境需求 ....................................... 错误!未定义书签。

四、Huffman 编码的基本原理......................... 错误!未定义书签。

五、问题回答 (9)六、实验结果 (10)七、实验心得体会 (11)八、附录(参考文献、源程序) (11)一、课程设计内容利用 C 语言实现完整的Huffman 数据压缩编码和解码。

二、课程设计目的(1) 加深对数据结构相关算法的理解,综合运用C 语言编写信源编码程序。

(2) 理解Huffman 编码和解码的特点,掌握数据压缩的基本原理,并能够用C 语言编程实现。

(3) 掌握结构化分析,设计与编程方法,学会编写动态链接库程序。

三、环境需求Visual C++ 6.0 以上编程环境。

霍夫曼编码的基本步骤

霍夫曼编码的基本步骤

霍夫曼编码的基本步骤霍夫曼编码(Huffman coding)是一种用于数据压缩的有效方法。

该方法基于一种前缀编码技术,即没有任何两个编码的前缀是相同的,从而避免了歧义。

霍夫曼编码经常被用作数据压缩算法,以压缩图像、音频和文本等数据。

下面介绍霍夫曼编码的基本步骤。

1.统计字符出现频率。

在对数据进行霍夫曼编码前,首先需要统计每个字符在数据中出现的频率。

这个过程称为字符频率统计。

统计完字符频率后,我们可以得到一个字符频率表,它表示了每个字符的出现频率。

2.构造霍夫曼树。

根据字符频率表建立霍夫曼树。

霍夫曼树是一棵二叉树,它的叶子节点代表每个字符,节点的权值等于对应字符在数据中出现的频率。

构建霍夫曼树的过程中,需要按照权值大小将节点进行排序并分组,然后逐步合并节点,形成新的子树。

最后合并成一棵完整的霍夫曼树。

3.创建编码表。

根据霍夫曼树,可以为每个字符创建对应的编码。

编码的规则是:从根节点到对应叶子节点的路径表示该字符的编码。

当遍历树时,每次走向左子树添加0,每次走向右子树添加1、因为是前缀编码,所以如果某个字符的编码是另一个字符编码的前缀,则需要为该字符再添加一位编码。

创建编码表后,每个字符都有了对应的编码。

4.对数据进行编码。

在对数据进行编码时,挨个读取原始数据中的字符,并用相应的编码来进行替换。

最终的编码结果就是所有字符的编码串,即为压缩后的数据。

如果有一些字符的编码比其它字符的编码短,那么压缩后的数据就相对变得更小。

5.解码数据。

在解压数据时,需要先用霍夫曼树进行解码。

将压缩后的数据中每一位取出,并从霍夫曼树的根节点开始遍历直到叶子节点找到对应的字符。

将解码后的字符依次排列,即可得到原始的数据。

6.总结。

霍夫曼编码是一种十分有效的数据压缩算法,因为它可以通过对原始数据进行编码和解码来实现数据压缩和恢复。

通过统计字符出现频率、构建霍夫曼树,创建编码表、对数据进行编码和解码,霍夫曼编码过程能够显著减少数据的存储空间,提高数据传输效率。

霍夫曼编码c语言 -回复

霍夫曼编码c语言 -回复

霍夫曼编码c语言-回复什么是霍夫曼编码?霍夫曼编码是一种用于数据压缩的算法,其目的是通过重新编码数据来减小数据的存储空间。

它是以其发明者大卫·霍夫曼(David A. Huffman)的名字命名的。

霍夫曼编码算法的原理是:根据数据中各个符号出现的频率,将频率较高的符号用较短的编码表示,而将频率较低的符号用较长的编码表示。

这样就实现了对数据进行高效压缩的目的。

霍夫曼编码的步骤:1. 统计符号频率首先,需要对要进行编码的数据进行统计,以确定每个符号出现的频率。

符号可以是字符、字节、或者其他可以出现在数据中的任何单位。

通过扫描数据,可以统计每个符号出现的次数,并计算出每个符号的频率。

2. 创建霍夫曼树根据符号的频率,创建霍夫曼树。

霍夫曼树是一种特殊的二叉树,其中每个非叶子节点都有两个子节点,并且叶子节点对应于要编码的符号。

霍夫曼树的构建过程是通过将频率最低的两个符号合并,生成一个新的节点,并将其频率设置为两个合并的节点的频率之和。

这个过程一直重复,直到所有的符号都合并为一个根节点,形成一个完整的霍夫曼树。

3. 分配霍夫曼编码在霍夫曼树构建完毕后,需要给每个符号分配相应的霍夫曼编码。

编码是由霍夫曼树的路径确定的,从根节点开始,沿着左子树路径标记为0,沿着右子树路径标记为1。

当到达叶子节点时,就得到了对应符号的霍夫曼编码。

4. 进行数据编码根据霍夫曼编码表,对原始数据进行编码。

编码的过程是将每个符号替换为对应的霍夫曼编码。

这样可以将原始数据压缩为较短的编码序列。

5. 进行数据解码对编码后的数据进行解码,恢复为原始数据。

解码的过程是根据霍夫曼树的结构,从根节点开始,根据编码的0或1,依次遍历树的左右子树,直到到达叶子节点,得到对应的符号。

霍夫曼编码的优势:1. 压缩效率高:由于霍夫曼编码根据符号的频率来进行编码,频率高的符号用较短的编码表示,频率低的符号用较长的编码表示,从而实现了对数据的高度压缩。

霍夫曼编码代码

霍夫曼编码代码

霍夫曼编码代码霍夫曼编码是一种变长编码方式,常用于数据压缩领域。

它的基本思想是将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而达到压缩数据的目的。

一、霍夫曼树1. 定义霍夫曼树是一棵带权树,即每个节点都有一个权值。

在霍夫曼树中,权值越大的节点离根节点越近。

2. 构建方法(1) 将所有字符按照出现频率从小到大排序。

(2) 取出两个频率最小的字符作为叶子节点,构建一棵二叉树,并将这两个节点的权值相加作为父节点的权值。

(3) 将新生成的父节点插入到已排序好的序列中,并将序列重新排序。

(4) 重复步骤2和3,直到只剩下一个节点为止。

这个节点就是霍夫曼树的根节点。

二、霍夫曼编码1. 定义对于给定字符串中每个字符,在霍夫曼树中找到对应叶子节点所在路径上所有父节点组成一个二进制数作为该字符对应编码。

由于霍夫曼树中权值小的节点离根节点较远,所以编码长度较长的字符出现频率较低。

2. 编码方法(1) 遍历霍夫曼树,将左子树标记为0,右子树标记为1。

(2) 对于每个字符,在霍夫曼树中找到对应叶子节点所在路径上所有父节点组成一个二进制数作为该字符对应编码。

3. 解码方法(1) 遍历霍夫曼树,将左子树标记为0,右子树标记为1。

(2) 将编码字符串按照从左到右的顺序依次遍历,并在霍夫曼树上寻找对应叶子节点。

当遇到0时,向左走;当遇到1时,向右走。

直到找到叶子节点,则该编码对应的字符就是该叶子节点的值。

三、Python实现下面是一个简单的Python实现:```pythonimport heapqfrom collections import defaultdict# 构建霍夫曼树def build_tree(freq):heap = [[weight, [char, '']] for char, weight in freq.items()]heapq.heapify(heap)while len(heap) > 1:left = heapq.heappop(heap)right = heapq.heappop(heap)for pair in left[1:]:pair[1] = '0' + pair[1]for pair in right[1:]:pair[1] = '1' + pair[1]heapq.heappush(heap, [left[0] + right[0]] + left[1:] + right[1:])return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))# 编码字符串def encode(str, freq):tree = build_tree(freq)code_dict = dict(tree)encoded_str = ''for char in str:encoded_str += code_dict[char]return encoded_str# 解码字符串def decode(encoded_str, freq):tree = build_tree(freq)code_dict = dict(tree)decoded_str = ''while encoded_str:for char, code in code_dict.items():if encoded_str.startswith(code):decoded_str += charencoded_str = encoded_str[len(code):]breakreturn decoded_str# 测试代码if __name__ == '__main__':str = 'hello world'freq = defaultdict(int)for char in str:freq[char] += 1print('Frequency:', freq)encoded_str = encode(str, freq)print('Encoded string:', encoded_str)decoded_str = decode(encoded_str, freq)print('Decoded string:', decoded_str)```四、总结霍夫曼编码是一种常用的数据压缩算法,其基本思想是将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示。

霍夫曼编码解码过程

霍夫曼编码解码过程

霍夫曼编码解码过程霍夫曼编码是一种基于概率的变长编码方法,主要用于无损数据压缩。

其核心思想是给出现概率较高的符号赋予较短的编码,反之则赋予较长的编码。

这样,平均码长将会接近于原始数据的熵,从而实现有效的数据压缩。

以下是霍夫曼编码和解码的过程:霍夫曼编码过程:1.首先,统计出待编码数据中每个字符出现的频率,例如,对于字符串"ABABABABA",我们可以得到字符'A'出现4次,字符'B'出现5次。

2.创建一个霍夫曼树。

这个树是一个二叉树,其中每个节点代表一个字符,节点的频率作为权重。

3.从根节点开始,对于每个节点,如果其左子节点和右子节点代表的字符不同,则将当前节点替换为一个新的字符,这个新字符的码字是左子节点和右子节点码字的组合。

需要注意的是,实际的霍夫曼编码过程中可能会有多种不同的树结构生成相同的结果,因此在具体实现时需要保证算法的稳定性和可重复性。

霍夫曼解码过程:霍夫曼解码是将霍夫曼编码后的数据进行还原的过程。

由于霍夫曼编码是前缀编码,也就是说编码后的码字没有前缀相同的后缀,因此解码过程是唯一的。

具体来说,解码步骤如下:1.从第一个字节开始,根据霍夫曼树的每个分支的权值(即字符出现的频率),从根节点向下查找对应的字符。

例如,对于码字"00",我们首先找到根节点,然后找到左子节点对应的字符'A'。

2.对于每个后续的字节,重复上述步骤。

需要注意的是,由于霍夫曼编码是前缀编码,因此我们不需要担心码字的结束位置,只要遇到一个码字,就可以一直解码下去,直到所有数据都被解码。

通过以上步骤,我们可以将霍夫曼编码的数据还原成原始的数据。

总的来说,霍夫曼编码是一种非常有效的无损数据压缩方法,尤其适用于数据中存在大量重复元素的情况。

哈夫曼编码算法详解

哈夫曼编码算法详解

哈夫曼编码算法详解在计算机科学中,哈夫曼编码是一种压缩算法,也叫做霍夫曼编码,是由霍夫曼(Huffman)在1952年首创的。

霍夫曼编码是一种无损压缩算法,可以对文本文件、音频文件、图像文件等各种类型的文件进行压缩。

1. 哈夫曼编码的原理哈夫曼编码是基于频率统计的思想,通过统计每个字符在文件中出现的频率,选择出现频率最高的字符,将其映射为一组比特位,出现频率较低的字符则映射为比高的比特位,从而实现对文件的压缩。

通过哈夫曼编码,可以将文件压缩到原始大小的一半甚至更小。

2. 哈夫曼编码的实现哈夫曼编码的实现需要进行几个步骤:2.1 统计字符的出现频率从文件中读取字符,统计每个字符在文件中出现的次数,可以使用一个数组或字典来保存每个字符的出现次数。

对于英文文本来说,出现频率最高的字符是空格,其次是字母“e”。

2.2 构建哈夫曼树将所有的字符按照出现频率从小到大排序,选出出现频率最小的两个字符作为左右子节点,其父节点的出现频率为左右子节点出现频率之和。

重复这个过程,直到节点数为1,这样就得到了一棵哈夫曼树。

2.3 生成哈夫曼编码从哈夫曼树的根节点开始,遍历所有的节点,将左子节点标记为0,将右子节点标记为1,将所有的叶子节点的字符和对应的哈夫曼编码保存到一个字典中。

最终得到了每个字符对应的哈夫曼编码。

2.4 进行压缩将文件中每个字符替换为对应的哈夫曼编码,然后将所有的哈夫曼编码拼接成一个二进制数,在最后不足8位的位置补零,将其存储到文件中。

这样就完成了文件的压缩。

3. 哈夫曼编码的优点哈夫曼编码具有以下优点:3.1 压缩率高由于哈夫曼编码是根据不同字符的出现频率来进行编码的,出现频率高的字符用较短的编码表示,出现频率低的字符用较长的编码表示,能够最大限度地减少文件的大小,从而达到高的压缩率。

3.2 唯一解哈夫曼编码是通过构建哈夫曼树来得到每个字符对应的编码,哈夫曼树的构建是唯一的,因此哈夫曼编码也是唯一的。

霍夫曼编码简介

霍夫曼编码简介

霍夫曼编码简介霍夫曼编码是一种被广泛应用而且非常有效的数据压缩技术,根据待压缩数据的特征,一个可压缩掉20%~90%。

这里考虑的数据指的是字符串序列。

要理解霍夫曼编码,先要理解霍夫曼树,即最优二叉树,是一类带权路径长度最短的树。

霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。

属于无损压缩编码。

霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。

这样,处理全部信息的总码长一定小于实际信息的符号长度。

在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。

路径是指从树中一个结点到另一个结点之间的通路,路径上的分支数目称为路径长度。

树的路径长度是从树根到每一个叶子之间的路径长度之和。

结点的带权路径长度为从该结点到树根之间的路径长度与该结点权的乘积,树的带权路径长度为树中所有叶子结点的带权路径长度之和.霍夫曼树是指所有叶子结点的二叉树中带权路径长度最小的二叉树.当给定了n个叶子结点的权值后,构造出的最优二叉树的结点数目m就确定了,即m=2n-1,所以可用一维结构树组来存储最优二叉树霍夫曼(Huffman)编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法。

同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率。

生成霍夫曼编码算法基于一种称为“编码树”(coding tree)的技术。

算法步骤如下:(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。

(2)把概率最小的两个符号组成一个新符号(节点),即新符号的概率等于这两个符号概率之和。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三进制霍夫曼编码 Prepared on 22 November 2020题目:将霍夫曼编码推广至三进制编码,并证明它能产生最优编码。

※将霍夫曼编码推广至三进制编码设一个数据文件包含Q个字符:A1,A2,……,Aq,每个字符出现的频度对应为P:P1,P2,……,Pq。

1.将字符按频度从大到小顺序排列,记此时的排列为排列1。

2.用一个新的符号(设为S1)代替排列1中频度值最小的Q-2k(k为(Q-1)/2取整)个字符,并记其频度值为排列1中最小的Q-2k个频度值相加,再重新按频度从大到小顺序排列字符,记为排列2。

(注:若Q-2k=0,则取其值为2,若Q-2k=1,则取其值为3.)3.对排列2重复上述步骤2,直至最后剩下3个概率值。

4.从最后一个排列开始编码,根据3个概率大小,分别赋予与3个字符对应的值:0、1、2,如此得到最后一个排列3个频度的一位编码。

5.此时的3个频度中有一个频度是由前一个排列的3个相加而来,这3个频度就取它的一位编码后面再延长一位编码,得到二位编码,其它不变。

6.如此一直往前,直到排列1所有的频度值都被编码为止。

举例说明如下(假设Q=9):频度中的黑体为前一频度列表中斜体频度相加而得。

编码后字符A1~A9的码字依次为:2,00,02,10,11,12,010,011,012。

构造三进制霍夫曼编码伪码程序如下:HUFFMAN(C)1 n ←∣C ∣2 Q ← C3 for i ← 1 to n-14 do allocate a new node s5 left[s] ← x ← EXTRACT-MIN(Q)6 middle[s] ← y ← EXTRACT-MIN(Q)7 right[s] ← z ← EXTRACT-MIN(Q)8 f[s] ← f[x]+f[y]+f[z]9 INSERT(Q,z)10 return EXTRACT-MIN(Q)※霍夫曼编码(三进制)最优性证明在二进制霍夫曼编码中,文件的最优编码由一棵满二叉树表示,树中每个非叶子结点都有两个子结点。

在此与之相对应,构造一棵满三叉树来表示三进制的霍夫曼编码,树中每个非叶子结点都有三个子结点。

对文件中A中的每个字符a,设f(a)表示a在文件中出现的频度,d T(a)表示字符a的编码长度,亦即a 的叶子在树中的深度。

这样,编码一个文件所需的位数就是B(T)=∑f(a)d T(a)设A为一给定文件,其中每个字符都定义有频度f[a]。

设x,y和z是A中具有最低频度的两个字符。

并设A'为文件A中移去x,y和z,再加上新的字符s后的文件,亦即A'=A-{x,y,z}∪{s};如A一样为A'定义f,其中f[s]=f[x]+f[y]+f[z]。

设T'为文件A'上最优前缀编码的任意一棵树,那么,将T'中叶子节点s换成具有x,y和z孩子的内部节点所得到的树T,表示文件A上的一个最优前缀编码。

证明:对每一个a∈A-{x,y,z},有d T(a)=d T'(a),故f[a]d T(a)=f[a]d T'(a)。

又d T'(x)=d T'(y)=d T'(z)=d T''(s)+1,从而有:f[x]d T'(x)+f[y]d T'(y)+f[z]d T'(z)=(f[x]+f[y]+f[z])(d T''(s)+1)=f[s]d T''(s)+(f[x]+f[y]+f[z])由此可得:B(T)=B(T')+f[x]+f[y]+f[z]假设T不表示A的最优前缀编码,那么存在一棵树T'',有B(T'')<B(T)。

设T'''是由T''中将x,y和z的父亲结点替换为叶子结点s而得,其中频度f[s]=f[x]+f[y]+f[z]。

则有B(T''')=B(T'')-f[x]-f[y]-f[z]<B(T)-f[x]-f[y]-f[z]=B(T')与之前假设的T'表示A'上的最优前缀编码矛盾,故T必定表示文件A上的最优前缀码,证毕。

构造三进制霍夫曼编码程序代码及运行结果如下:程序源码:#include <>#include <>#include <>int Sorting(int *x,int n){//排序int *a,b,i,j,r=0;a=x;for(j=0;j<n;j++){for(i=0;i<n-j-1;i++){if((*(a+i+1))<=(*(a+i))){b=*(a+i);*(a+i)=*(a+i+1);*(a+i+1)=b;if(i==r) r++;}}}return r;}char *strcatzp(char *str1,const char *str2){//字符串拼接//ASSERT((str1!=NULL)&&(str2!=NULL));char *addr=(char *)malloc((strlen(str1)+strlen(str2)+1)*sizeof(char));char *des=addr;//ASSERT(addr!=NULL);while(*str1){*addr=*str1;str1++;addr++;}while(*str2){*addr=*str2;str2++;addr++;}*addr='\0';return des;}void main(void){char character[100]={""};char *code[100]={""};char *temp=NULL;char InputChar;float Input_p;int p[100][100]={0};int count=6,i,j,m,tc=0;int *k;int i_charinput=0,i_pinput=1;//数据输入printf("请输入字符,按Enter键结束输入:\n");InputChar = getchar();while(InputChar!='\n')/*约定一个结束符为-1*/{if (InputChar!=' '){character[i_charinput++]=InputChar;}InputChar = getchar();}printf("请输入相应字符出现的频率,按0+Enter键结束输入:\n");scanf("%f", &Input_p);while(Input_p!=0){p[0][i_pinput++]= (int)((Input_p* +1)/10);scanf("%f", &Input_p);}if(i_charinput!=(i_pinput-1)){printf("输入字符与频率个数不相等,请确认后重新输入\n");return;}count = i_charinput;k=&p[0][1];for(j=0;j<count;j++){for(i=0;i<count-j-1;i++){if((*(k+i+1))<=(*(k+i))){m=*(k+i);*(k+i)=*(k+i+1);*(k+i+1)=m;InputChar=character[i];character[i]=character[i+1];character[i+1]=InputChar;}}}//for test/* for(i=1;i<10;i++){printf("%d ",p[0][i]);}*/Sorting(&p[0][1],count);if(count%2 != 0){tc=(count-3)/2;for(i=1;i<=tc;i++){p[i][1]=p[i-1][1]+p[i-1][2]+p[i-1][3];for(j=2;j<count-2*i+1;j++){}p[i][0]=1+Sorting(&p[i][1],count-2*i);}code[0]="2";code[1]="1";code[2]="0";for(i=tc;i>0;i--){temp=code[p[i][0]-1];for(j=count-2*i-1;j>=0;j--){if(j>p[i][0]-1)code[j+2]=code[j];else if(j<p[i][0]-1)code[j+3]=code[j];}code[0]=strcatzp(temp,"2");code[1]=strcatzp(temp,"1");code[2]=strcatzp(temp,"0");}printf("字符编码为:\n");for(i=0;i<count;i++){printf("%c->%s\n",character[i],code[i]);}printf("\n");//for test/* for(i=0;i<(count-1)/2;i++){for(j=0;j<1+count-2*i;j++){printf("%d ",p[i][j]);}printf("\n");}*/}else{tc=(count+2)/2;for(i=1;i<=tc;i++){for(j=2;j<count-i+1;j++){p[i][j]=p[i-1][j+1];}p[i][0]=1+Sorting(&p[i][1],count-i);}code[0]="2";code[1]="1";code[2]="0";for(i=tc;i>0;i--){temp=code[p[i][0]-1];for(j=count-i-1;j>=0;j--){if(j>p[i][0]-1)code[j+1]=code[j];else if(j<p[i][0]-1)code[j+2]=code[j];}code[0]=strcatzp(temp,"1");code[1]=strcatzp(temp,"0");}printf("字符编码为:\n");for(i=0;i<count;i++){printf("%c->%s\n",character[i],code[i]);}printf("\n");//for test/* for(i=0;i<tc;i++){for(j=0;j<count+1;j++){printf("%d ",p[i][j]);}printf("\n");}*/}}。

相关文档
最新文档