读书人

哈弗曼树以及压缩应用

发布时间: 2012-11-10 10:48:50 作者: rapoo

哈弗曼树以及压缩运用


?

//计算文件中每个字节出现的次数 while (bis2.available() > 0) { int i = bis2.read(); date[i]++; }

// 构建哈夫曼树 while (hufQueue.size() > 1) { hufNode min1 = hufQueue.poll();// 获取头对象,获得并删除对象 hufNode min2 = hufQueue.poll(); //通过两个子节点合成一个父节点 hufNode result = new hufNode(0, min1.getTimes() + min2.getTimes()); //设定左右子节点 result.setLeftChild(min1); result.setRightChild(min2); hufQueue.add(result);// 加入合并节点}

/** * 获得编码 * @param root : 根节点 * @param s :编码 */ public void getCode(hufNode root, String s) { if ((root.getLeftChild() == null) && (root.getRightChild() == null)) {// 左右子节点都为空,则编码结束 //创建一个编码对象 Code code = new Code(s.length(),s); saveCode[root.getDate()] = code; } if (root.getLeftChild() != null) {// 左子节点不为null,则继续编码 getCode(root.getLeftChild(), s + "0");// 左 0 } if (root.getRightChild() != null) {// 右子节点不为null,则继续编码 getCode(root.getRightChild(), s + "1");// 右 1 }}

while ((bis.available() > 0) || (count >= 8)) { // 如果缓冲区的写入字符个数大于8 if (count >= 8) { // 清空要转化的字符串 waiteString = writes.substring(0, 8); // 去除writes的前8位 writes = writes.substring(8); count -= 8;// 写入一个8位字节 int tempw = changeString(waiteString); // 写入文件 bos2.write(tempw); } else { idate = bis.read(); // 得到第i个字节的编码信息 count += saveCode[idate].getN(); writes += saveCode[idate].getNode(); } }

5).解析文件,完成压缩,其实这一步就是把文件里字节一个一个读取出来然后与码表进行比对,换成对应的编码,然后再重新写入文件,方式与写入码表时是一样的。这是压缩的整个过程,对于小文件,由于码表的写入,也许最终压缩后的占用空间并不一定减小,但对于较大的文件和重复率较高的文件最终的压缩率还是比较可观的。

读书人网 >编程

热点推荐