资源描述
java哈弗曼编码的实现Java code/哈弗曼编码的实现类public class HffmanCoding private int charsAndWeight;/ 0是 字符,1存放的是字符的权值(次数) private int hfmcoding;/ 存放哈弗曼树 private int i = 0;/ 循环变量 private String hcs; public HffmanCoding(int chars) / TODO 构造方法 charsAndWeight = new intchars.length2; charsAndWeight = chars; hfmcoding = new int2 * chars.length - 14;/ 为哈弗曼树分配空间 / 哈弗曼树的实现 public void coding() int n = charsAndWeight.length; if (n = 0) return; int m = 2 * n - 1; / 初始化哈弗曼树 for (i = 0; i n; i+) hfmcodingi0 = charsAndWeighti1;/ 初始化哈弗曼树的权值 hfmcodingi1 = 0;/ 初始化哈弗曼树的根节点 hfmcodingi2 = 0;/ 初始化哈弗曼树的左孩子 hfmcodingi3 = 0;/ 初始化哈弗曼树的右孩子 for (i = n; i m; i+) hfmcodingi0 = 0;/ 初始化哈弗曼树的权值 hfmcodingi1 = 0;/ 初始化哈弗曼树的根节点 hfmcodingi2 = 0;/ 初始化哈弗曼树的左孩子 hfmcodingi3 = 0;/ 初始化哈弗曼树的右孩子 / 构建哈弗曼树 for (i = n; i m; i+) int s1 = select(i);/ 在哈弗曼树中查找双亲为零的 weight最小的节点 hfmcodings101 = i;/ 为哈弗曼树最小值付双亲 hfmcodings111 = i; hfmcodingi2 = s10;/ 新节点的左孩子 hfmcodingi3 = s11;/ 新节点的右孩子 hfmcodingi0 = hfmcodings100 + hfmcodings110;/ 新节点的权值是左右孩子的权值之和 / 查找双亲为零的 weight最小的节点 private int select(int w) / TODO Auto-generated method stub int s = -1, -1 , j = 0;/ s1 最小权值且双亲为零的节点的序号 , i 是循环变量 int min1 = 32767, min2 = 32767; for (j = 0; j w; j+) if (hfmcodingj1 = 0) / 只在尚未构造二叉树的结点中查找(双亲为零的节点) if (hfmcodingj0 min1) min2 = min1; s1 = s0; min1 = hfmcodingj0; s0 = j; else if (hfmcodingj0 min2) min2 = hfmcodingj0; s1 = j; return s; public String CreateHCode() / 根据哈夫曼树求哈夫曼编码 int n = charsAndWeight.length; int i, f, c; String hcodeString = ; hcs = new Stringn; for (i = 0; i n; i+) / 根据哈夫曼树求哈夫曼编码 c = i; hcodeString = ; f = hfmcodingi1; / f 哈弗曼树的根节点 while (f != 0) / 循序直到树根结点 if (hfmcodingf2 = c) / 处理左孩子结点 hcodeString += 0; else hcodeString += 1; c = f; f = hfmcodingf1; hcsi = new String(new StringBuffer(hcodeString).reverse(); return hcs; public String show(String s) / 对字符串显示编码 String textString = ; char c; int k = -1; c = new chars.length(); c = s.toCharArray();/ 将字符串转化为字符数组 for (int i = 0; i c.length; i+) k = ci; for (int j = 0; j charsAndWeight.length; j+) if (k = charsAndWeightj0) textString += hcsj; return textString; / 哈弗曼编码反编译 public String reCoding(String s) String text = ;/ 存放反编译后的字符 int k = 0, m = hfmcoding.length - 1;/ 从根节点开始查询 char c; c = new chars.length(); c = s.toCharArray(); k = m; for (int i = 0; i c.length; i+) if (ci = 0) k = hfmcodingk2;/ k的值为根节点左孩子的序号 if (hfmcodingk2 = 0 & hfmcodingk3 = 0)/ 判断是不是叶子节点,条件(左右孩子都为零) text += (char) charsAndWeightk0; k = m; if (ci = 1) k = hfmcodingk3;/ k的值为根节点右孩子的序号 if (hfmcodingk2 = 0 & hfmcodingk3 = 0)/ 判断是不是叶子节点,条件(左右孩子都为零) text += (char) charsAndWeightk0; k = m; return text;
展开阅读全文