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

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

Войти
Регистрация
Восстановить пароль
 
Levenyatko
2 / 2 / 0
Регистрация: 05.07.2012
Сообщений: 99
#1

реализация алгоритма Хаффмана - C++

24.04.2013, 20:05. Просмотров 479. Ответов 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;
 
class Node
{
    public:
     int a;
     char c;
     Node *left, *right;
     
     Node(){left=right=NULL;}
 
     Node(Node *L, Node *R) 
     {  left =  L;
        right = R;
        a = L->a + R->a;  }
};
 
 
struct MyCompare
{
    bool operator()(const Node* l, const Node* r) const { return l->a < r->a; }
};
 
 
vector<bool> code;                
map<char,vector<bool> > table;    
 
map<char, int> one;
 
void BuildTable(Node *root)
{   
    if (root->left!=NULL) 
                      { code.push_back(0);
                      BuildTable(root->left);}
     
    if (root->right!=NULL)
                       { code.push_back(1);
                       BuildTable(root->right);}
   
    if (root->c) table[root->c]=code;     
    
    code.pop_back();
}
 
 
int main (int argc, char *argv[])
{
    setlocale(LC_ALL,"rus");
////// считаем частоты символов 
    
    ifstream f("1.txt");
    
    map<char,int> m;
 
    while (!f.eof())
    { char c = f.get(); 
       m[c]++;}
    
  
////// записываем начальные узлы в список list
    
   list<Node*> t;
   for( map<char,int>::iterator itr=m.begin(); itr!=m.end(); ++itr)
   {  
      Node *p = new Node;
      p->c = itr->first; //cout<<p->c<<"  ";
      p->a = itr->second;//cout<<p->a<<endl;  
      t.push_back(p);      }    
    
 
//////  создаем дерево      
 
  while (t.size()!=1)
  {  
     t.sort(MyCompare());
 
      
   
     Node *SonL = t.front();
     t.pop_front();
     Node *SonR = t.front(); 
     t.pop_front();
     
     Node *parent = new Node(SonL,SonR); 
     t.push_back(parent);
 
  }
    
    Node *root = t.front();   //root - указатель на вершину дерева
 
////// создаем пары 'символ-код':           
 
    BuildTable(root);   
        
////// Выводим коды в файл output.txt
 
    f.clear(); f.seekg(0); // перемещаем указатель снова в начало файла
    
    ofstream g("output.txt");
        
    int count=0; char buf=0;
    while (!f.eof())
    { char c = f.get();
      vector<bool> x = table[c];
      for(int n=0; n<x.size(); n++)
       {buf = buf | x[n]<<(7-count);   
        count++;   
        if (count==8) { count=0;   g<<buf; buf=0; } 
       }
    }
 
    f.close();
    g.close(); 
    
///// считывание из файла output.txt и преобразование обратно
    
    ifstream F("output.txt");
    
    Node *p = root;
    count=0; char byte; 
    F>>byte;
    while(!F.eof())
    {   
        bool b = byte & (1 << (7-count) ) ; 
        if (b) p=p->right; else p=p->left;
        if (p->left==NULL && p->right==NULL) {cout<<p->c; p=root;}
        count++;
        if (count==8) {count=0; F>>byte;}
    }
    
    F.close();  
    system("pause");
    return 0;
}
подскажите, что не так..по моему сортировка работает неправильно.но как исправить что то не особо понимаю..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2013, 20:05     реализация алгоритма Хаффмана
Посмотрите здесь:

Реализация алгоритма Хаффмана с использованием классов - C++
Всем привет. Пишу Алгоритм Хаффмана. Хочу сделать все красиво в классах,но как-то не додумываюсь. Пытался сделать чтение файла методом,но...

Кодирование алгоритма Хаффмана - C++
Доброго времени суток. У меня есть на руках рабочий код. Вопрос стоит следующим образом: Нужно сделать шифрование не используя векторы или...

помогите с реализацией алгоритма сжатия Хаффмана - C++
помогите с реализацией алгоритма сжатия Хаффмана есть код в с++ в консольном приложении, помогите сделать в форме, и чтоб выводило в...

Подскажите ошибку в реализации алгоритма Хаффмана - C++
при архивации txt файла проблем не возникает, но со всеми остальными (например: png,doc,exe,docx и т.д.) он не работает, подскажите что не...

Реализация алгоритма последовательного сканирования - C++
Всем доброго времени суток. Нашел одну презентацию и на основе слайда решил написать код...но судя по всему - работает он точно не так как...

Параллельная реализация алгоритма Дейкстры - C++
Здравствуйте. Вообщем, надо сделать алгоритм Дейкстры на MPI, но выполнятся он будет не на кластере, а на одном компе. (далее узел -...

Визуализация графа (реализация алгоритма) - C++
Начало темы http://www.cyberforum.ru/cpp-beginners/thread783380.html Нашел описание алгоритма визуализации графа. Но как...

Реализация Алгоритма Грэхема и Джарвиса на С++ - C++
Ищу того, кто сделает за деньги с комментариями к каждой строке. В ЛС цену и за какое время.

Програмная реализация алгоритма Blowfish - C++
Люди,если может кто , подскажите где можна найти исходники програмной реализации криптографического алгоритма Blowfish ,хотя бы в...

Реализация алгоритма игры пятнашки - C++
Умоляю, помогите, нужна реализация алгоритма игры пятнашки, чтобы компьютер сам играл, т.е. фишки передвигал. проблема в том, что классы...


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

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

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