Форум программистов, компьютерный форум CyberForum.ru

Код хаффмана - C++

Восстановить пароль Регистрация
 
Plazma
5 / 5 / 0
Регистрация: 20.11.2010
Сообщений: 51
17.04.2012, 21:52     Код хаффмана #1
Помогите разобраться с кодом кодирования Хаффмана. Нашел реализацию алгоритма Хаффмана, но некоторые места не понятны. Прокомментируйте пожалуйста функции count_chars и traverse в моем коде.
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
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
 
using namespace std;
 
class node {
    public:
    int probability;
    unsigned char ch; // character
    const node *child0;
    const node *child1;
 
    node( unsigned char c = 0, int i = -1 ):ch(c),probability(i), child0(0),child1(0){}
 
    node( const node* c0, const node *c1 );
 
    bool operator<( const node &a ) const {
        return probability >a.probability;
    }
    void traverse(string code) const ;
 
};
 
node::node( const node* c0, const node *c1 ) {
        ch = 0;
        probability = c0->probability + c1->probability;
        child0 = c0;
        child1 = c1;
    }
 
void node::traverse(string code="") const {
        
    if ( child0 ) {
        child0->traverse( code + '0' );
        child1->traverse( code + '1' );
    } else {
        cout <<" " <<ch <<"   ";
        cout <<probability;
        cout <<"     " <<code <<endl;
    }
}
 
void count_chars( int *counts )
{
    for ( int i = 0 ; i <256 ; i++ )
        counts[ i ] = 0;
    ifstream file( "input.txt" );
    if ( !file ) {
        cerr <<"Couldn't open the input file!\n";
        throw "abort";
    }
    file.setf( ios::skipws ); 
    for ( ; ; ) {
        unsigned char c;
        file>> c;
        if ( file ){
            counts[ c ]++;
            cout<<counts[ c ]<<endl;}
        else
            break;
   }
}
 
int main()
{
    int counts[ 256 ];
    count_chars( counts );
    priority_queue < node > q;
 
    for ( int i = 0 ; i <256 ; i++ )
        if ( counts[ i ] )
            q.push( node( i, counts[ i ] ) );
 
    while ( q.size() >1 ) {
        node *child0 = new node( q.top() );
        q.pop();
        node *child1 = new node( q.top() );
        q.pop();
        q.push( node( child0, child1 ) );
    }
 
    cout <<"Char.  Probab.  Huffman's code" <<endl;
    q.top().traverse();
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2012, 21:52     Код хаффмана
Посмотрите здесь:

C++ коды Фано, Хаффмана, Хэмминга, Шеннона, код с проверкой на четность
модифицированный код Хаффмана. Сделать прогу C++
C++ Код Хаффмана
C++ Код Хаффмана реализованный через построение бинарного дерева
Сжатие Хаффмана C++
C++ Кодирование Хаффмана
Сжатие Хаффмана C++
Кодирование Хаффмана C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 21:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru