20182324 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码测试报告
20182324 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码测试报告
课程:《程序设计与数据结构》
班级: 1823
姓名: yyh
学号: 20182324
课程教师:王志强
测试日期:2019年11月22日
必修/选修: 必修
1.测试内容
设有字符集:S = { a , b , c , d , e , f , g , h , i , j , k , l , m , n , o , p , q , r , s , ,t , u , v , w , x , y , z}。
给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
并完成对英文文件的编码和解码。
要求:
-
(1)准备一个包含 26 个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
-
(2)构造哈夫曼树
-
(3)对英文文件进行编码,输出一个编码后的文件
-
(4)对编码文件进行解码,输出一个解码后的文件
-
(5)撰写博客记录实验的设计和实现过程,并将源代码传到码云
-
(6)把实验结果截图上传到云班课
2. 实验过程及结果
-
(1)事先准备好一个包含 26 个英文字母的文本文件,相对路径为
src\HuffmanTree.txt
,使用读写流将其内容读出并存储英文字母出现的个数。File file = new File("src\\HuffmanTree.txt"); if (!file.exists()) { file.createNewFile(); } BufferedReader br = new BufferedReader(new FileReader(file)); String s; String message = ""; while((s = br.readLine()) != null) { message += s; } String[] result = message.split(""); for (int n = 0;n < result.length; n++){ for (int i = 0; i < 27; i++){ if (result[n].equals(list.get(i))){ number[i] += 1; } } }
-
(2)构造 HuffmanTree
while (nodes.size() > 1) { Collections.unmodifiableList(nodes); HuffmanNode left = nodes.get(nodes.size() - 2); left.setCode("0"); //左子树置为 0 HuffmanNode right = nodes.get(nodes.size() - 1); right.setCode("1"); //右子树置为 1 HuffmanNode parent = new HuffmanNode(null, left.getLength() + right.getLength()); parent.setLeft(left); parent.setRight(right); nodes.remove(left); nodes.remove(right); nodes.add(parent); }
-
(3)将 26 个英文字母出现的次数与文本总字数相除,使用
DecimalFormat
规范小数位,输出各字母出现的概率。List<HuffmanNode> nodeList = new ArrayList<HuffmanNode>(); DecimalFormat df = new DecimalFormat( "0.0000000"); double wei; double sum = result.length; for(int i = 0;i < 27;i++) { wei = ((double) number[i]/sum); System.out.println(list.get(i) + "出现" + number[i] + "次,概率为" + df.format(wei)); nodeList.add(new HuffmanNode(list.get(i),number[i])); }
-
(4)将 Huffman 树中的内容进行编码。
List<HuffmanNode> list = new ArrayList<HuffmanNode>(); Queue<HuffmanNode> queue = new ArrayDeque<HuffmanNode>(); if (root != null) { queue.offer(root); root.getLeft().setCode(root.getCode() + "0"); root.getRight().setCode(root.getCode() + "1"); } while (!queue.isEmpty()) { list.add(queue.peek()); HuffmanNode node = queue.poll(); if (node.getLeft() != null) { node.getLeft().setCode(node.getCode() + "0"); } if (node.getRight() != null) { node.getRight().setCode(node.getCode() + "1"); } if (node.getLeft() != null) { queue.offer(node.getLeft()); } if (node.getRight() != null) { queue.offer(node.getRight()); } }
-
(5)对源文件进行编解码操作,并分别输出结果。
HuffmanTree huffmanTree = new HuffmanTree(); HuffmanNode node = createTree(nodeList); List<HuffmanNode> inlist = new ArrayList<HuffmanNode>(); inlist = huffmanTree.breadth(node); String[] name = new String[number.length]; String[] code = new String[number.length]; File file1 = new File("src\\Huffman编码文件.txt"); File file2 = new File("src\\Huffman解码文件.txt"); FileWriter fileWriter1 = new FileWriter(file1); FileWriter fileWriter2 = new FileWriter(file2);
-
最终运行结果如图所示: