`
代码小达人
  • 浏览: 24466 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

哈夫曼压缩及解压的具体实现

阅读更多
数据结构中的哈夫曼编码可以用来制作一个压缩和解压的小项目。因此,需要先写出哈夫曼的编码,具体步骤如下:
首先要创建一个数组,其大小为256,用于存储字节,再从给定路径中逐个读取字节,统计每个字节出现的次数,跟据出现的次数进行排序,此时可以用一个优先队列PriorityQueue,但是PriorityQueue中比较器的方法需要重写过。代码如下:

public class MyComparator implements Comparator<Node>{
	public int compare(Node o1, Node o2) {
		return o1.count - o2.count;
	}
}
比较的是两者的次数,并传入先序队列的构造方法。根据队列的排序逐个取出,然后根据排序构造哈夫曼树,代码如下:

public Node bulid(PriorityQueue<Node> queue) {
		// 当队列中至少有2个结点时
		while (queue.size() > 1) {
			Node node1 = queue.poll();
			Node node2 = queue.poll();
			// 创建2个子结点的父结点
			Node root = new Node(node1.count + node2.count);
			node1.parent = root;
			node2.parent = root;
			root.left = node1;
			root.right = node2;
			queue.add(root);

		}
		Node root = queue.poll();
		return root;
	}



然后根据构造的树进行遍历,得到相应的哈夫曼编码,并记录下来。代码如下:
public void traverse(Node root) {
		if (root != null) {
			if ((root.left == null) && (root.right == null)) {
				// System.out.println(root.b);
				data data = new data();
				data.b = root.b;
				data.s = root.sign;
				list.add(data);// 将数组加入队列
			}
			traverse(root.left);
			traverse(root.right);
		}
	}

然后就可以开始进行压缩的工作,先将刚刚的字符串及对应的01编码逐个对应存入文件中,作为头文件。而后用源文件的路径创建输入流,将源文件逐个按字符串输入,根据字符串得到相应的01字符串,将01字符串存入一个byte数组中,待所有源文件均读取完毕后,将得到的与源文件相对于的01字符串数组每8个一取,得到相对于的byte数组。
/**
	 * 将8位的字符串转化为一个byte类型的字符串
	 * 
	 * @param str所需转换的01字符串
	 * @return转换后的byte的字符串
	 */
	public byte change(String str) {
		// 因为转换成数字,而原先传入的只是其字符,所以要减去0所对于的字符码,从而转换的byte才不会溢出
		int s = ((int) str.charAt(0) - 48) * 128 + ((int) str.charAt(1) - 48)
				* 64 + ((int) str.charAt(2) - 48) * 32
				+ ((int) str.charAt(3) - 48) * 16 + ((int) str.charAt(4) - 48)
				* 8 + ((int) str.charAt(5) - 48) * 4
				+ ((int) str.charAt(6) - 48) * 2 + ((int) str.charAt(7) - 48);
		byte by = (byte) s;
		return by;
	}

若最后末尾不足8位,需要补0,并且要记录补0的个数。
// 文件字符串01个数 = 字符次数 * 编码长度
			for (int i = 0; i < list.size(); i++) {
				data data = list.get(i);
				if (data.b < 0) {
					data.b += 256;
				}
				addnum += (datas[data.b] * data.s.length());
			}
			addzero = 8 - (addnum % 8);
			dos.write(addzero);

然后将转换后的byte数组逐个写入压缩文件中。如此,便基本实现了哈夫曼压缩。需要注意的是,如果字符所对应的哈夫曼编码超过8位,可以不用哈夫曼编码,而直接写入该字节即可。这可以算是对哈夫曼压缩的优化。
解压时只有逐个文件写入的顺序读出并进行还原即可以得到原来的文件。
值得注意的是,若创建的为文件基本输入输出流的话,是不可以直接读入一个int,当读取的数据超过一个byte类型的话,需要把int转换为一个byte数组存入,byte数组的大小为4。具体代码如下:

private byte[] Int2Byte(int num) {
		byte[] bs = new byte[4];
		bs[0] = (byte)((num >>> 24) & 0xFF);
		bs[1] = (byte)((num >>> 16) & 0xFF);
		bs[2] = (byte)((num >>> 8) & 0xFF);
		bs[3] = (byte)((num >>> 0) & 0xFF);
		return bs;
	}

同样在解压时需要把byte数组还原为一个int,具体实现如下:
private int Byte2Int(byte b[]){
		int n1=(int)b[0];
		int n2=(int)b[1];
		int n3=(int)b[2];
		int n4=(int)b[3];
		int n=((n1 << 24)& 0xFF)+((n2 << 16)& 0xFF)+((n3 << 8)& 0xFF)+((n4 << 0)& 0xFF);
		return n;
	}
分享到:
评论

相关推荐

    哈夫曼压缩与解压算法(可以直接运行)

    在本压缩包中的文件“hafuaman”很可能包含了实现哈夫曼压缩和解压的C++源代码。源代码通常包括了数据结构(如哈夫曼树节点的定义)、算法实现(如哈夫曼树的构建和解码过程)以及文件操作(读写输入输出文件)。...

    java哈夫曼压缩和解压

    提供的博文链接(https://1471080924.iteye.com/blog/2154500)应该包含具体的代码示例和解释,可以参考这个资源来深入了解Java中的哈夫曼压缩和解压实现。 8. **文件名称列表**: 压缩包中的`.gif`文件可能是...

    哈夫曼树压缩解压C++代码

    `SRC`文件可能包含了C++源代码,展示如何构建哈夫曼树、生成编码、压缩和解压数据的具体实现。`DOC`文件可能是实验报告,详细解释了这些过程并分析了算法的效率。`EXE`文件则可能是编译后的可执行程序,可以直接运行...

    C语言实现哈夫曼编码压缩和解压各种文件

    实验内容:写出程序,利用哈弗曼编码实现对文件的压缩,并能解压文件。 实验步骤: 1、压缩 (1) 统计原始文件中各字节出现的概率(次数); (2) 采用哈弗曼算法对各字节进行编码,建立哈弗曼对照表; a) 构造...

    哈夫曼压缩与解压文件课程设计(代码+实习报告)

    在这个课程设计中,你将深入理解哈夫曼编码的原理,并通过C++编程语言实现文件的压缩与解压功能。 哈夫曼编码的核心思想是根据字符出现的频率来构建一个特殊的二叉树。在这个树中,频率较高的字符会被放在较近的叶...

    哈夫曼编码压缩解压文件

    在“哈夫曼编码压缩解压文件”中,我们将深入探讨如何利用哈夫曼编码实现文件的压缩和解压。 首先,哈夫曼树是哈夫曼编码的基础。它是一种特殊的二叉树,也称为最优二叉树或最小带权路径长度树。在构建哈夫曼树时,...

    哈夫曼压缩和解压c++(源码)

    在C++中实现哈夫曼压缩和解压,主要涉及到数据结构(如优先队列、二叉树)和文件操作(读写)。`huffmain`可能是这个C++项目的主程序文件,其中可能包含了构建哈夫曼树、生成编码、压缩和解压等核心功能的实现。具体...

    哈夫曼压缩与解压

    哈夫曼树的应用,实现对TXT文件的压缩和解压,操作简单,需要文件操作

    哈夫曼编码压缩解压.rar

    哈夫曼编码是一种高效的数据压缩方法,主要用于无损数据压缩,尤其在文本和图像压缩领域广泛应用。它基于一种称为哈夫曼树(Huffman ...通过实践项目,如“哈夫曼编码压缩解压.rar”所示,可以深入理解并提升这些技能。

    哈夫曼树压缩解压_压缩解压;哈夫曼树_

    在8.3版本的压缩包中,可能包含了一个实现哈夫曼树压缩和解压缩的程序。这个程序可能包括了对文件进行读取、频率统计、哈夫曼树构建、编码生成、编码文件写入、解码以及哈夫曼树重建等功能。通过学习和理解这个程序...

    基于哈夫曼树的文件压缩和解压(QT可视化界面)

    《基于哈夫曼树的文件压缩与解压技术在QT可视化界面中的实现》 哈夫曼编码是一种数据压缩算法,其核心是构建哈夫曼树,通过对数据出现频率的统计,构建出一棵特殊的二叉树——哈夫曼树,使得出现频率高的字符具有较...

    哈夫曼压缩与解压(1).txt

    哈夫曼的压缩与解压,我们老师给的代码。 构造Huffman树步骤: 根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令起权值为wj 在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,...

    基于哈夫曼编码的文件压缩解压程序的C语言实现

    在C语言中实现基于哈夫曼编码的文件压缩解压程序,需要深入理解哈夫曼编码的基本原理以及C语言编程技巧。 首先,哈夫曼编码是根据字符出现频率进行编码的一种方法。它通过构建一棵特殊的二叉树——哈夫曼树(也称为...

    用哈夫曼实现的无损压缩和解压

    在本项目中,"用哈夫曼实现的无损压缩和解压" 包含了两个部分:Compress 和 Decompress。Compress 文件夹中的代码实现了将原始数据进行哈夫曼编码并压缩的过程,而Decompress 文件夹中的代码则负责将已压缩的数据...

    哈夫曼压缩解压算法-C语言

    mypage文件可能包含了实现哈夫曼压缩和解压缩算法的C源代码文件,以及相关的测试数据或结果。通过阅读和理解这些代码,你可以深入学习哈夫曼编码的工作原理,以及如何在C语言中实现这一算法。同时,还可以了解到如何...

    数据结构大作业基于哈夫曼编码的压缩和解压实现 - 副本.doc

    数据结构大作业基于哈夫曼编码的压缩和解压实现 该项目旨在实现基于哈夫曼编码的压缩和解压,通过创建哈夫曼树、哈夫曼编码表和队列实现文件压缩和解压。 知识点一:哈夫曼树 * 哈夫曼树是一种特殊的二叉树结构,...

    哈夫曼树实现文件压缩和解压(源程序+实验报告)

    用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FAVORITE”。 字符 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N ...

    HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩

    综上所述,"HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩"是一个包含Java实现的哈夫曼编码压缩和解压工具。它涉及到了哈夫曼树的构建、编码生成、文件压缩和解压的算法,以及Java中处理二...

    运用哈夫曼编码压缩解压文件源代码

    哈夫曼编码压缩解压文件源代码 哈夫曼编码是一种变长前缀编码方案,用于压缩数据。哈夫曼树是一种特殊的二叉树,它的每个叶子结点对应一个字符,而每个内部结点对应一个符号的频率信息。哈夫曼编码的基本思想是:将...

Global site tag (gtag.js) - Google Analytics