闲来无事写写-Huffman树的生成过程
前言:最近项目上一直没事干,感觉无聊到了极点,给自己找点事做,补一下大学没有完成的事情,写一个huffman算法Java版的,学校里面写过c语言的。
因为很久没搞数据结构和算法这方面了(现在搞Java web,真心感觉没什么挑战啊),代码写的一般,边听歌边写,3小时,不知道为什么现在效率这么低,写习惯了
xml配置,感觉纯写算法代码手生的紧,悲呼唉哉!
1、哈夫曼树:
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)
2、生成过程:
1. 在n个权值里面首先寻找最小的两个权值作为子节点,开始生成第一棵子树;
2.将新子树的父节点作为一个新的权值与剩余的权值继续做比较,选出最小的两个权值继续构造新子树;
3.依次进行,直到最后一棵子树生成;
4.这时候,最后一棵子树的根节点就是整个哈夫曼树的根节点,从此根节点开始遍历,就能遍历完整个哈夫曼树。
3、图形表示:
假设有6个权值:1、2、3、4、5、6,生成哈夫曼树的过程如下:
依次下去...
这样,最终得到的父节点21就是哈夫曼树的根节点,遍历树的话,
c/c++就是:root->left root->right就可以通过递归的方式从root节点访问到最后一个子节点。
Java就是: root.left root.right通过递归从root访问到最后一个子节点。
当然,二叉树的遍历不止递归一种方法,递归是最有效率的一种,还可以通过数据结构里面堆/栈的方式进行遍历。
下面是我写的实现哈夫曼树的Java代码(为了完成功能,绝壁不是优秀的,但可以方便看懂)
注:储存权值使用了List列表,随时增或者删方便一点。
1 import java.util.ArrayList; 2 import java.util.List; 3 4 class Node 5 { 6 int weight; 7 Node left,right,parent; 8 public Node(int weight) 9 { 10 this.weight=weight; 11 } 12 } 13 public class Huffman { 14 private static List<Node> list=new ArrayList<Node>(); 15 public static Node root; 16 public void insert(Node node) 17 { 18 //按照插入排序的方式将节点有序插入list 19 if(list.size()==0){ 20 list.add(node); 21 return; 22 } 23 int size=list.size(); 24 for(int i=0;i<size;) 25 { 26 if(list.get(i).weight<node.weight){ 27 i++; 28 if(i>=list.size()) 29 list.add(node); 30 } 31 else 32 { 33 //交换位置 34 list.add(list.get(list.size()-1)); 35 for(int j=list.size()-1;j>i;j--) 36 { 37 list.set(j, list.get(j-1)); 38 } 39 list.set(i, node);//插入新数据 40 return; 41 } 42 43 } 44 45 } 46 public Node createTree(Node n1,Node n2) 47 { 48 //返回新子树的父节点 49 Node parentNode=new Node(0); 50 parentNode.weight=n1.weight+n2.weight; 51 parentNode.left=n1; 52 parentNode.right=n2; 53 n1.parent=parentNode; 54 n2.parent=parentNode; 55 return parentNode; 56 } 57 public void run(List<Node> list) 58 { 59 int length=list.size(); 60 while(length!=0) 61 { 62 if(length==1){ 63 root=list.get(0); 64 return; 65 } 66 if(length==2){ 67 root=createTree(list.get(0),list.get(1)); 68 return; 69 } 70 Node n1=list.get(0); 71 Node n2=list.get(1); 72 Node newNode=createTree(n1,n2); 73 for(int i=0;i<length-2;i++) 74 { 75 //转移数据 76 list.set(i, list.get(i+2)); 77 } 78 list.remove(length-1); 79 list.remove(length-2); 80 insert(newNode); 81 length=list.size(); 82 } 83 84 } 85 public void display(Node node) 86 { 87 if(node!=null) 88 { 89 display(node.left); 90 System.out.print(node.weight+"\t"); 91 display(node.right); 92 } 93 } 94 public void drawTree(Node node) 95 { 96 if(node!=null) 97 { 98 //中序遍历,打算打印树形状,有些麻烦,后面改进 99 // if(node.parent!=null&&node.parent.left==node) 100 // System.out.print("/"); 101 // if(node.parent!=null&&node.parent.right==node) 102 // System.out.print("\\"); 103 System.out.print(node.weight+"\t"); 104 drawTree(node.left); 105 drawTree(node.right); 106 } 107 } 108 public static void main(String[] args) 109 { 110 Huffman hf=new Huffman(); 111 hf.insert(new Node(1)); 112 hf.insert(new Node(2)); 113 hf.insert(new Node(3)); 114 hf.insert(new Node(4)); 115 hf.insert(new Node(5)); 116 hf.insert(new Node(6)); 117 hf.run(list); 118 System.out.println("前序遍历"); 119 hf.display(root); 120 System.out.println("\n中序遍历"); 121 hf.drawTree(root); 122 } 123 }
执行结果:
后面,将写通过哈夫曼解析具体报文。
转载于:https://www.cnblogs.com/dftencent/p/4042545.html
闲来无事写写-Huffman树的生成过程相关推荐
- huffman树和huffman编码
不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...
- 数据结构源码笔记(C语言):Huffman树字符编码
#include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...
- 数据结构实验三:Huffman树及Huffman编码的算法实现
Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...
- 数据结构-Huffman树
Huffman树的编码和解码 思想:1.统计字符串每个字母出现的个数2.依次取出两个最小的字母进行合并(分别作为左右子节点,另左子节点<右子节点的值),使用他们值之和作为根节点的值,并将根节点加 ...
- 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)
文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
- Huffman树进行编码和译码
//编码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...
- Huffman树压缩和解压文件
Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树: ②选择 ...
最新文章
- 2022-2028年中国辉石行业市场全景调查及发展前景分析报告
- 鱼眼相机标定_鱼眼相机模型(二)
- arcgis for server 登陆manager失败解决办法
- python中国大学排名爬虫写明详细步骤-Python爬虫--2019大学排名数据抓取
- 子报表修改后需要重新导入,0.00显示.00的调整方法
- java二分查找递归_java学习之—递归实现二分查找法
- 一个长方体玻璃容器从里面量长宽_养观赏鱼用玻璃鱼缸吗?3种常见养鱼容器,另外2种养鱼效果不差...
- c++调用求平方根函数_如何使用java语言求一个正整数的平方根?(不使用库函数)...
- 为什么说微服务一定要有 API 网关?
- python免费全套教程-python入门免费教程看这些就够了
- MATLAB 学习资料整理
- 设置新版谷歌浏览器自动启用flash
- pr如何处理音效_pr怎么把视频声音去掉 去掉视频中的所有声音,视频消音操作...
- MATLAB:gca、gcf、gco区别
- 数据分析项目实战:电影数据分析
- Kali linux破解Wi-Fi
- pci配置基地址_PCI/PCIe基础——配置空间
- dashboard android,Dashboard软件下载
- intel英特尔NUC主机bug大清除案例
- 使用scrapy简单爬取网易新闻
热门文章
- C# 删除 文件 里面的第一行数据
- NameError: name ‘os‘ is not defined - 解决
- 使用vs2019和pyinstaller将py文件打包成一个exe文件(含图标),pyinstaller安装失败解决方案
- 2021牛客暑期多校训练营9,签到题HE
- Win10删除资源管理器左侧的Onedrive图标
- 【图论】最小生成树学习笔记
- 小学用计算机画画的课件,用计算机画图画.ppt
- 无法扩展该卷 因为群集的数量将超过文件系统_Ubifs文件系统分析
- spark的python开发安装方式,最简单的方式来安装Python依赖关系的Spark执行器节点?...
- OpenGL基础12:进入3D世界