Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
#1

Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! - C++

07.12.2012, 17:21. Просмотров 340. Ответов 0
Метки нет (Все метки)

Здравствуйте! Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! Прокомментируйте кто-то программу, буду очень благодарен)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define line  "*********************************"
 
typedef struct node_t {
    struct node_t *left, *right;
    int freq;
    char c;
} *node;
 
struct node_t pool[256] = {{0}};
node qqq[255], *q = qqq - 1;
int n_nodes = 0, qend = 1;
char *code[128] = {0}, buf[1024];
 
node new_node(int freq, char c, node a, node b)
{
    node n = pool + n_nodes++;
    if (freq) n->c = c, n->freq = freq;
    else {
        n->left = a, n->right = b;
        n->freq = a->freq + b->freq;
    }
    return n;
}
 
void qinsert(node n)
{
    int j, i = qend++;
    while ((j = i / 2)) {
        if (q[j]->freq <= n->freq) break;
        q[i] = q[j], i = j;
    }
    q[i] = n;
}
 
node qremove()
{
    int i, l;
    node n = q[i = 1];
 
    if (qend < 2) return 0;
    qend--;
    while ((l = i * 2) < qend) {
        if (l + 1 < qend && q[l + 1]->freq < q[l]->freq) l++;
        q[i] = q[l], i = l;
    }
    q[i] = q[qend];
    return n;
}
 
void build_code(node n, char *s, int len)
{
    static char *out = buf;
    if (n->c) {
        s[len] = 0;
        strcpy(out, s);
        code[n->c] = out;
        out += len + 1;
        return;
    }
 
    s[len] = '0'; build_code(n->left,  s, len + 1);
    s[len] = '1'; build_code(n->right, s, len + 1);
}
 
void init(char *s)
{
    int i, freq[128] = {0};
    char c[16];
 
    while (*s) freq[(int)*s++]++;
 
    for (i = 0; i < 128; i++)
        if (freq[i]) qinsert(new_node(freq[i], i, 0, 0));
 
    while (qend > 2) 
        qinsert(new_node(0, 0, qremove(), qremove()));
 
    build_code(q[1], c, 0);
}
 
void encode(char *s, char *out)
{
    while (*s) {
        strcpy(out, code[*s]);
        out += strlen(code[*s++]);
    }
}
 
void decode(char *s, node t)
{
    node n = t;
    while (*s) {
        if (*s++ == '0') n = n->left;
        else n = n->right;
 
        if (n->c) putchar(n->c), n = t;
    }
 
    putchar('\n');
    if (t != n) cout<<"garbage input\n";
}
 
int main(void)
{
    int i;
    cout<<line<<"\n\tHuffman Coding\n"<<line<<"\n";
    cout<<"    Enter text for coding:\n";
    char str[100], buf[1024];
     gets(str);
    init(str);
    for (i = 0; i < 128; i++)
        if (code[i]) printf("'%c': %s\n", i, code[i]);
    encode(str, buf);
    cout<<"encoded:  "<<buf<<"\n";
    cout<<"decoded:  ";
    decode(buf, q[1]);
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 17:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! (C++):

Нужна программа. Совсем не понимаю как сделать - Pascal
Программа берет текстовый файл и считает сколько там предложений (учитывается символ многоточия и сокращение имени и отчества). Ну совсем...

Не совсем понимаю, что нужно найти в задании. - Алгоритмы
Здравствуйте. Задание: Последовательность треугольных чисел строится по правилу: член последовательности с номером p_n =...

Не совсем понимаю, что нужно объявлять в типах? - Delphi
Там прописывается все действующие элементы интерфейса моего приложения так?

Объясните подробно данный код программы. Знаю что это фильтр а пошагово что к чему не понимаю - C++ Builder
void __fastcall TForm1::suiButton7Click(TObject *Sender) { tdiag -&gt; Filtered = false; tdiag -&gt; Filt = «id_p=« + suiEdit6 -&gt; Text; ...

вводятся два числа шеснадцатеричных и преобразуются в двоичное представление. Далее первое (A) делится на 2. Во здесь не могу понять что к чему - Assembler
Здравствуйте! Сижу парюсь с делениеи уже третий час =( data segment 'data' mess1 db 'Inter number A : $' mess2 db 'Inter number...

Есть форма, есть скрипт на пхп, хочу ее оживить с помощью него, но что-то не хочет, что не так? - PHP
Господа, есть форма, есть скрипт на пхп, хочу ее оживить с помощью него, но что-то не хочет, что не так? &lt;form method=&quot;post&quot;...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 17:21
Привет! Вот еще темы с ответами:

Что здесь есть лямда стремящаяся к нулю? - Математический анализ
Возник вопрос, про какую лямду идёт речь? Там, где делят на (b-a) и почему у них сигма преобразуется в такое выражение, объяясните,...

Здесь есть какие нибудь ошибки ? и как здесь получается в ответе 6.25? - Turbo Pascal
program r2; var b:real; begin b:=100; repeat b:=b/2; until b&lt;10; writeln (b:0:2); end. Здесь есть какие нибудь ошибки ?...

Программа делает не совсем то, что нужно - C++ WinAPI
Задача выглядит так: Работа со строками. Одна строка - текст. Текст должен состоять из нескольких предложений и должен быть оформлен по...

Что здесь не правильно? Программа не исполняется - Java SE
package firstapplication; import java.util.Scanner; public class SalaryCalc { public static void main (String args){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.