歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 哈夫曼編碼反編碼的實現

Java 哈夫曼編碼反編碼的實現

日期:2017/3/1 11:08:28   编辑:Linux編程

Java 哈夫曼編碼反編碼的實現:

  1. //哈弗曼編碼的實現類
  2. public class HffmanCoding {
  3. private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的權值(次數)
  4. private int hfmcoding[][];// 存放哈弗曼樹
  5. private int i = 0;// 循環變量
  6. private String hcs[];
  7. public HffmanCoding(int[][] chars) {
  8. // TODO 構造方法
  9. charsAndWeight = new int[chars.length][2];
  10. charsAndWeight = chars;
  11. hfmcoding = new int[2 * chars.length - 1][4];// 為哈弗曼樹分配空間
  12. }
  13. // 哈弗曼樹的實現
  14. public void coding() {
  15. int n = charsAndWeight.length;
  16. if (n == 0)
  17. return;
  18. int m = 2 * n - 1;
  19. // 初始化哈弗曼樹
  20. for (i = 0; i < n; i++) {
  21. hfmcoding[i][0] = charsAndWeight[i][1];// 初始化哈弗曼樹的權值
  22. hfmcoding[i][1] = 0;// 初始化哈弗曼樹的根節點
  23. hfmcoding[i][2] = 0;// 初始化哈弗曼樹的左孩子
  24. hfmcoding[i][3] = 0;// 初始化哈弗曼樹的右孩子
  25. }
  26. for (i = n; i < m; i++) {
  27. hfmcoding[i][0] = 0;// 初始化哈弗曼樹的權值
  28. hfmcoding[i][1] = 0;// 初始化哈弗曼樹的根節點
  29. hfmcoding[i][2] = 0;// 初始化哈弗曼樹的左孩子
  30. hfmcoding[i][3] = 0;// 初始化哈弗曼樹的右孩子
  31. }
  32. // 構建哈弗曼樹
  33. for (i = n; i < m; i++) {
  34. int s1[] = select(i);// 在哈弗曼樹中查找雙親為零的 weight最小的節點
  35. hfmcoding[s1[0]][1] = i;// 為哈弗曼樹最小值付雙親
  36. hfmcoding[s1[1]][1] = i;
  37. hfmcoding[i][2] = s1[0];// 新節點的左孩子
  38. hfmcoding[i][3] = s1[1];// 新節點的右孩子
  39. hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];// 新節點的權值是左右孩子的權值之和
  40. }
  41. }
  42. // 查找雙親為零的 weight最小的節點
  43. private int[] select(int w) {
  44. // TODO Auto-generated method stub
  45. int s[] = { -1, -1 }, j = 0;// s1 最小權值且雙親為零的節點的序號 , i 是循環變量
  46. int min1 = 32767, min2 = 32767;
  47. for (j = 0; j < w; j++) {
  48. if (hfmcoding[j][1] == 0) {// 只在尚未構造二叉樹的結點中查找(雙親為零的節點)
  49. if (hfmcoding[j][0] < min1) {
  50. min2 = min1;
  51. s[1] = s[0];
  52. min1 = hfmcoding[j][0];
  53. s[0] = j;
  54. } else if (hfmcoding[j][0] < min2) {
  55. min2 = hfmcoding[j][0];
  56. s[1] = j;
  57. }
  58. }
  59. }
  60. return s;
  61. }
  62. public String[] CreateHCode() {// 根據哈夫曼樹求哈夫曼編碼
  63. int n = charsAndWeight.length;
  64. int i, f, c;
  65. String hcodeString = "";
  66. hcs = new String[n];
  67. for (i = 0; i < n; i++) {// 根據哈夫曼樹求哈夫曼編碼
  68. c = i;
  69. hcodeString = "";
  70. f = hfmcoding[i][1]; // f 哈弗曼樹的根節點
  71. while (f != 0) {// 循序直到樹根結點
  72. if (hfmcoding[f][2] == c) {// 處理左孩子結點
  73. hcodeString += "0";
  74. } else {
  75. hcodeString += "1";
  76. }
  77. c = f;
  78. f = hfmcoding[f][1];
  79. }
  80. hcs[i] = new String(new StringBuffer(hcodeString).reverse());
  81. }
  82. return hcs;
  83. }
  84. public String show(String s) {// 對字符串顯示編碼
  85. String textString = "";
  86. char c[];
  87. int k = -1;
  88. c = new char[s.length()];
  89. c = s.toCharArray();// 將字符串轉化為字符數組
  90. for (int i = 0; i < c.length; i++) {
  91. k = c[i];
  92. for (int j = 0; j < charsAndWeight.length; j++)
  93. if (k == charsAndWeight[j][0])
  94. textString += hcs[j];
  95. }
  96. return textString;
  97. }
  98. // 哈弗曼編碼反編譯
  99. public String reCoding(String s) {
  100. String text = "";// 存放反編譯後的字符
  101. int k = 0, m = hfmcoding.length - 1;// 從根節點開始查詢
  102. char c[];
  103. c = new char[s.length()];
  104. c = s.toCharArray();
  105. k = m;
  106. for (int i = 0; i < c.length; i++) {
  107. if (c[i] == '0') {
  108. k = hfmcoding[k][2];// k的值為根節點左孩子的序號
  109. if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判斷是不是葉子節點,條件(左右孩子都為零)
  110. {
  111. text += (char) charsAndWeight[k][0];
  112. k = m;
  113. }
  114. }
  115. if (c[i] == '1') {
  116. k = hfmcoding[k][3];// k的值為根節點右孩子的序號
  117. if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判斷是不是葉子節點,條件(左右孩子都為零)
  118. {
  119. text += (char) charsAndWeight[k][0];
  120. k = m;
  121. }
  122. }
  123. }
  124. return text;
  125. }
  126. }
  127. 調用的時候直接調用該類就行了
  128. eg :
  129. int chars[][] ;
  130. String s =“101010110”;
  131. HffmanCoding hfc = new HffmanCoding(chars);
  132. hfc.coding();//哈弗曼樹
  133. String s[] = hfc.CreateHCode();//哈弗曼編碼
  134. s=hfc.show(s);
Copyright © Linux教程網 All Rights Reserved