Скопируйте код кода следующим образом:
//Класс реализации кодирования Хаффмана
общественный класс HffmanCoding {
Private int charsAndWeight[][];// [][0] — символ, [][1] хранит вес (количество раз) символа
Private int hfmcoding[][];//Хранилище дерева Хаффмана
частный int я = 0 // переменная цикла
частная строка hcs[];
public HffmanCoding(int[][] символы) {
// конструктор TODO
charsAndWeight = новый int[chars.length][2];
charsAndWeight = символы;
hfmcoding = new int[2 * chars.length - 1][4];//Выделяем место для дерева Хаффмана
}
//Реализация дерева Хаффмана
публичное недействительное кодирование() {
int n = charsAndWeight.length;
если (п == 0)
возвращаться;
интервал м = 2 * п - 1;
//Инициализируем дерево Хаффмана
для (я = 0; я < n; я++) {
hfmcoding[i][0] = charsAndWeight[i][1];//Инициализируем вес дерева Хаффмана
hfmcoding[i][1] = 0;//Инициализируем корневой узел дерева Хаффмана
hfmcoding[i][2] = 0;//Инициализируем левый дочерний элемент дерева Хаффмана
hfmcoding[i][3] = 0;//Инициализируем правого дочернего элемента дерева Хаффмана
}
для (я = п; я < м; я++) {
hfmcoding[i][0] = 0;//Инициализируем веса дерева Хаффмана
hfmcoding[i][1] = 0;//Инициализируем корневой узел дерева Хаффмана
hfmcoding[i][2] = 0;//Инициализируем левый дочерний элемент дерева Хаффмана
hfmcoding[i][3] = 0;//Инициализируем правого дочернего элемента дерева Хаффмана
}
//Построим дерево Хаффмана
для (я = п; я < м; я++) {
int s1[] = select(i); // Находим узел с наименьшим весом, родители которого равны нулю в дереве Хаффмана;
hfmcoding[s1[0]][1] = i;// Платим родителям за минимальное значение дерева Хаффмана
hfmcoding[s1[1]][1] = я;
hfmcoding[i][2] = s1[0];//Левый дочерний элемент нового узла
hfmcoding[i][3] = s1[1];//правый дочерний элемент нового узла
hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];//Вес нового узла — это сумма весов левого и правого потомков
}
}
//Находим узел с наименьшим весом, родительский элемент которого равен нулю
частный int[] select(int w) {
// TODO Автоматически сгенерированная заглушка метода
int s[] = { -1, -1 }, j = 0 // s1 — порядковый номер узла с наименьшим весом и нулевым родителем, i — переменная цикла;
интервал мин1 = 32767, мин2 = 32767;
для (j = 0; j < w; j++) {
if (hfmcoding[j][1] == 0) {// Искать только в узлах, которые еще не построили двоичное дерево (узлы с нулевыми родителями)
if (hfmcoding[j][0] < min1) {
мин2 = мин1;
с[1] = с[0];
min1 = hfmcoding[j][0];
с[0] = j;
} else if (hfmcoding[j][0] < min2) {
min2 = hfmcoding[j][0];
с[1] = j;
}
}
}
вернуть с;
}
public String[] CreateHCode() {// Найдите код Хаффмана на основе дерева Хаффмана
int n = charsAndWeight.length;
интервал я, е, с;
Строка hcodeString = "";
hcs = новая строка [n];
for (i = 0; i < n; i++) {// Находим код Хаффмана на основе дерева Хаффмана
с = я;
hcodeString = "";
f = hfmcoding[i][1] // f — корневой узел дерева Хаффмана
while (f != 0) {//Последовательно до тех пор, пока корневой узел дерева
if (hfmcoding[f][2] == c) {// Обработка левого дочернего узла
hcodeString += "0";
} еще {
hcodeString += "1";
}
в = е;
е = hfmcoding[f][1];
}
hcs[i] = новая строка (новый StringBuffer (hcodeString).reverse());
}
вернуть ХКС;
}
public String show(String s) {// Отображение кодировки строки
Строка textString = "";
символ с [];
интервал к = -1;
c = новый символ [s.length()];
c = s.toCharArray() // Преобразуем строку в массив символов
for (int i = 0; i <c.length; i++) {
к = с[я];
for (int j = 0; j < charsAndWeight.length; j++)
если (k == charsAndWeight[j][0])
textString += hcs[j];
}
вернуть текстовую строку;
}
// Декомпиляция кода Хаффмана
перекодирование публичной строки (String s) {
String text = "";//Хранилище декомпилированных символов
int k = 0, m = hfmcoding.length - 1;//Начинаем запрос с корневого узла
символ с [];
c = новый символ [s.length()];
c = s.toCharArray();
к = м;
for (int i = 0; i <c.length; i++) {
если (c[i] == '0') {
k = hfmcoding[k][2];//Значение k — это порядковый номер левого дочернего элемента корневого узла
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// Определить, является ли это листовым узлом, условие (левый и правый дочерние элементы равны нулю)
{
текст += (символ) charsAndWeight[k][0];
к = м;
}
}
если (c[i] == '1') {
k = hfmcoding[k][3];//Значение k — это порядковый номер правого дочернего элемента корневого узла
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// Определить, является ли это листовым узлом, условие (левый и правый дочерние элементы равны нулю)
{
текст += (символ) charsAndWeight[k][0];
к = м;
}
}
}
вернуть текст;
}
}