### 学生信息
0. 学号:
### 编程语言
Java
### 运行环境
0. jdk1.8以上(1.8版本以下会报错)
0. IDEA 开发工具
### 运行过程说明
点击进入Main类,启动main方法,根据提示,输入数据文件编号,然后自动运行程序
### 算法设计
#####分析
1. 实质上是贪心算法求最优解问题。
2. 采用哈夫曼编码的方式压缩文件,将文件中字符按照哈夫曼树进行编码,然后将编码转换为二进制输出到文件中。
#####算法分析
0. 采用Collections.sort排序的时间复杂度为O(nlogn)
0. 总的时间复杂度为O(nlogn)
#####伪码描述:
1.输入数据文件的编号;
2.while (文件编号 <1 || 文件编号 > 5){
2.1 重新输入数据文件的编号;
3.通过FileRead.getFileData方法获取数据文件数据(getFileData方法利用FileReader、BufferedReader读取);
4.将文件中文件路径、文件数据的哈夫曼树、文件中每一个字符的出现次数等信息封装到FileContent实体bean中;
5、统计文本文件中每个字符的使用频度,
5.1、List<Node> nodes = fileContent.getNodeList();
5.2、对list排序并输出
SortList sort = new SortList();
sort.sortList(nodes);
nodes.forEach(node -> {
System.out.println("char:\'"+(char)node.getCharacter()+"\'>>> times: "+node.getWeight());
});
6.通过哈夫曼实体类HuffmanTree()的构造方法,获取哈夫曼树的权重和节点;
//当nodes只含有哈夫曼树的根节点时,退出循环
while (nodes.size() > 1) {
//左节点
Node left = nodes.get(0);
//右节点
Node right = nodes.get(1);
//父节点
Node parent = new Node(left.weight + right.weight, -1);
parent.setLeftNode(left);
parent.setRightNode(right);
//删除左节点
nodes.remove(0);
//删除右节点
nodes.remove(0);
//添加父节点
nodes.add(parent);
sort.sortList(nodes);
}
if (nodes.size() == 0) {
root = null;
} else {
root = nodes.get(0);
}
7、为了写入文件的效率,构造HashMap<Integer, String> map = new HashMap<>();把哈夫曼树的权重和节点存在map中;
7.1 利用哈夫曼树的树转map方法:huffmanTree.treeToMap();
8、以二进制流形式压缩文件
8.1使用文件写入类FileWrite.writeFile()方法,将每一个字符用对应的哈夫曼编码替换
int value = inputStream.read();
while (value != -1) {
String str = map.get(value);
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
outputStream.write(ch);
}
value = inputStream.read();
}
9.将压缩文件写到路径中
#### 贪心算法,利用huffman编码对文本文件进行压缩作业--整体目录结构
```
file-huffman/src/main
└─java
└─com
└─han
└─huffman 项目名
├─bean 实体
└─utils 工具包
└─resource 资源包(包含输入输出数据文件集)
```
##### 类设计说明
0. Main :main方法,程序入口
0. FileContent : 文件信息bean
0. HuffmanTree : 哈夫曼树 工具类
0. FileRead : 文件读取类
0. FileWrite : 文件输出类
0. SortList : List排序工具类
0. Node : 哈夫曼树节点bean
##### 数据结构设计
FileContent类 : 文件信息bean
0. filePath 文件路径
0. huffmanTree 文件数据的哈夫曼树
0. nodeList 文件中每一个字符的出现次数信息
Node类 : 哈夫曼树节点bean
0. rightNode 树的右节点
0. leftNode 树的左节点
0. weight 字符权重(字符出现次数)
0. character 字符
##### 数据文件说明
0. 文件内字符需为ASCII码对应字符
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
北京工业大学--算法作业3--huffman编码对文本文件进行压缩与解压---Java代码 设计并实现贪心算法,利用huffman编码对文本文件进行压缩与解压。 输入:一个文本文件 输出:压缩后的文件 算法过程: (1)统计文本文件中每个字符的使用频度 (2)构造huffman编码 (3)以二进制流形式压缩文件
资源推荐
资源详情
资源评论
收起资源包目录
assign03.zip (36个子文件)
file-huffman
src
main
resource
input_assign03_02.dat 79B
input_assign03_01.dat 78B
output_assign03_01.dat 315B
input_assign03_03.dat 59B
input_assign03_05.dat 87B
output_assign03_03.dat 228B
input_assign03_04.dat 74B
java
com
han
huffman
utils
FileRead.java 2KB
SortList.java 776B
HuffmanTree.java 2KB
FileWrite.java 2KB
Main.java 3KB
bean
Node.java 1KB
FileContent.java 1023B
han.iml 437B
.idea
misc.xml 579B
uiDesigner.xml 9KB
workspace.xml 29KB
modules.xml 271B
readme.txt 4KB
out
production
file-huffman
input_assign03_02.dat 79B
input_assign03_01.dat 78B
com
han
huffman
utils
FileWrite.class 2KB
HuffmanTree.class 2KB
FileRead.class 2KB
SortList.class 1KB
Main.class 5KB
bean
FileContent.class 1KB
Node.class 2KB
han.iml 437B
input_assign03_03.dat 59B
input_assign03_05.dat 87B
output_assign03_03.dat 228B
META-INF
file-huffman.kotlin_module 16B
input_assign03_04.dat 74B
file-huffman.iml 532B
共 36 条
- 1
大大大飞啊
- 粉丝: 21
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- springboot-mavenBaseDemo 内容包含:springboot的maven基础状态,1.8JDK可以直接运行
- otis rsl远程串行接口协议标准.pdf
- buildx构建镜像时所需的镜像文件
- F103-霸道开发板2.8寸电阻触摸屏例程.rar
- Google(高德)地图瓦片python代码下载
- Python实现输出杨辉三角形
- polsarpro官方教程、操作说明 PolSARpro v5.0 Software Training Course
- STM32 TouchGFX的使用二图片显示
- buildx镜像文件,也可以通过网上其他方式获取
- 【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页