انسخ رمز الكود كما يلي:
// فئة التنفيذ لترميز هوفمان
فئة عامة HffmanCoding {
Private int charsAndWeight[][];// [][0] هو الحرف، [][1] يخزن وزن (عدد المرات) للحرف
Private int hfmcoding[][];//شجرة تخزين هوفمان
int الخاص i = 0؛ // متغير الحلقة
سلسلة خاصة hcs[];
عامة HffmanCoding(int[][] chars) {
// منشئ TODO
charsAndWeight = new int[chars.length][2];
charsAndWeight = chars;
hfmcoding = new int[2 * chars.length - 1][4];// تخصيص مساحة لشجرة هوفمان
}
// تنفيذ شجرة هوفمان
ترميز الفراغ العام () {
int n = charsAndWeight. length;
إذا (ن==0)
يعود؛
كثافة العمليات م = 2 * ن - 1؛
// تهيئة شجرة هوفمان
لـ (i = 0; i < n; i++) {
hfmcoding[i][0] = charsAndWeight[i][1];// تهيئة وزن شجرة هوفمان
hfmcoding[i][1] = 0;// تهيئة العقدة الجذرية لشجرة هوفمان
hfmcoding[i][2] = 0;// تهيئة الطفل الأيسر لشجرة هوفمان
hfmcoding[i][3] = 0;// تهيئة الطفل المناسب لشجرة هوفمان
}
لـ (i = n; i < m; i++) {
hfmcoding[i][0] = 0;// تهيئة أوزان شجرة هوفمان
hfmcoding[i][1] = 0;// تهيئة العقدة الجذرية لشجرة هوفمان
hfmcoding[i][2] = 0;// تهيئة الطفل الأيسر لشجرة هوفمان
hfmcoding[i][3] = 0;// تهيئة الطفل المناسب لشجرة هوفمان
}
// بناء شجرة هوفمان
لـ (i = n; i < m; i++) {
int s1[] = Select(i); // ابحث عن العقدة ذات الوزن الأصغر والتي يكون أصلها صفرًا في شجرة هوفمان
hfmcoding[s1[0]][1] = i;// ادفع للوالدين مقابل الحد الأدنى لقيمة شجرة هوفمان
hfmcoding[s1[1]][1] = i;
hfmcoding[i][2] = s1[0];// الطفل الأيسر للعقدة الجديدة
hfmcoding[i][3] = s1[1];// الطفل الأيمن للعقدة الجديدة
hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];// وزن العقدة الجديدة هو مجموع أوزان الأطفال الأيسر والأيمن
}
}
// ابحث عن العقدة ذات الوزن الأصغر الذي يكون أصلها صفرًا
كثافة العمليات الخاصة[] حدد(int ث) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
int s[] = { -1, -1 }, j = 0; // s1 هو الرقم التسلسلي للعقدة ذات الوزن الأصغر والأصل الصفري، i هو متغير الحلقة
كثافة العمليات min1 = 32767، min2 = 32767؛
ل (ي = 0؛ ي < ث؛ ي ++) {
if (hfmcoding[j][1] == 0) {// ابحث فقط في العقد التي لم تقم بعد بإنشاء شجرة ثنائية (العقد التي ليس لها أي أصل)
إذا (hfmcoding[j][0] <min1) {
min2 = min1;
s[1] = s[0];
min1 = hfmcoding[j][0];
s[0] = j;
} وإلا إذا (hfmcoding[j][0] < min2) {
min2 = hfmcoding[j][0];
ق[1] = ي;
}
}
}
العودة ق.
}
public String[] CreateHCode() {// ابحث عن كود هوفمان بناءً على شجرة هوفمان
int n = charsAndWeight. length;
إنت ط، و، ج؛
String 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";
}
ج = و؛
f = hfmcoding[f][1];
}
hcs[i] = new String(new StringBuffer(hcodeString).reverse());
}
عودة هكس؛
}
عرض السلسلة العامة (سلسلة s) {// عرض ترميز السلسلة
سلسلة نصية = ""؛
شار ج[];
كثافة العمليات ك = -1;
c = new char[s.length()];
c = s.toCharArray(); // تحويل السلسلة إلى مصفوفة أحرف
لـ (int i = 0; i < c.length; i++) {
ك = ج[i];
لـ (int j = 0; j < charsAndWeight.length; j++)
إذا (ك == charsAndWeight[j][0])
textString += hcs[j];
}
إرجاع سلسلة النص؛
}
// فك ترميز هوفمان
إعادة ترميز السلسلة العامة (سلسلة ق) {
String text = "";// أحرف تم فك ترجمتها للتخزين
int k = 0, m = hfmcoding.length - 1;// ابدأ الاستعلام من العقدة الجذرية
شار ج[];
c = new char[s.length()];
c = s.toCharArray();
ك = م؛
لـ (int i = 0; i < c.length; i++) {
إذا (ج[i] == '0') {
k = hfmcoding[k][2];// قيمة k هي الرقم التسلسلي للطفل الأيسر للعقدة الجذرية
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// تحديد ما إذا كانت عقدة طرفية، الشرط (كل من الأطفال الأيسر والأيمن صفر)
{
text += (char) charsAndWeight[k][0];
ك = م؛
}
}
إذا (ج[i] == '1') {
k = hfmcoding[k][3];// قيمة k هي الرقم التسلسلي للطفل الأيمن للعقدة الجذرية
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// تحديد ما إذا كانت عقدة طرفية، الشرط (كل من الأطفال الأيسر والأيمن صفر)
{
text += (char) charsAndWeight[k][0];
ك = م؛
}
}
}
إرجاع النص؛
}
}