Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
-6 / 0 / 0
Регистрация: 09.12.2013
Сообщений: 26

Подскажите ошибку в реализации алгоритма Хаффмана

04.12.2014, 10:07. Показов 4374. Ответов 22
Метки нет (Все метки)

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

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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
#include <string.h>
using namespace std;
 
class Node
{
    public:
     int a;
     unsigned 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; }
};
 
void print(Node* root, unsigned k=0)
{
    if(root!=NULL)
     {
      print(root->left, k+3);
      
      for(unsigned i=0;i<k;i++)
          cout<<"  ";
      
      if(root->c) cout<< root->a<<" ("<<root->c<<")"<<endl;
      else cout<<root->a<<endl;
      print(root->right, k+3);
      }
}
 
vector<bool> code;                
map<unsigned char,vector<bool> > table;    
 
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 ()
{
 
 
////// считаем частоты символов 
    char name[10];
    cin>>name;
    ifstream f(name);
    
    map<unsigned char,int> m;
 
    while (!f.eof())
    { unsigned char c = f.get(); 
       m[c]++;}
    
  
////// записываем начальные узлы в список list
                 
   list<Node*> t;
   for( map<unsigned char,int>::iterator itr=m.begin(); itr!=m.end(); ++itr)
   {  
      Node *p = new Node;
      p->c = itr->first;
      p->a = itr->second;  
      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 - указатель на вершину дерева
         print(root);
////// создаем пары 'символ-код':           
 
    BuildTable(root);   
        
////// Выводим коды в файл output.txt
 
    
 
    f.clear(); f.seekg(0); // перемещаем указатель снова в начало файла
    
    ofstream g("output.bin", ios::out | ios::binary);
        
    int count=0; unsigned char buf=0;
    while (!f.eof())
    { unsigned 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.bin", ios::in | ios::binary);
    strcat(name,name);
    ofstream first(name, ios::out);
    
    Node *p = root;
    count=0; unsigned char byte; 
    byte = F.get();
    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) {first<<p->c; p=root;}
        count++;
        if (count==8) {count=0; byte = F.get();}
    }
    
    F.close();  
    first.close();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2014, 10:07
Ответы с готовыми решениями:

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

Не могу найти ошибку в реализации алгоритма
Нужно перевести алгоритм в код. Вот мой код, но он не работает: double a = -10; double b = 10; ...

Сложность алгоритма Хаффмана
Кто нибудь может сказать какова сложность алгоритма Хаффмана, и как его подсчитать.

22
-6 / 0 / 0
Регистрация: 09.12.2013
Сообщений: 26
04.12.2014, 18:37  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да я исходную программу сильно и не менял... Вот эта работает:
заработало) блин столько сидел над ним) спасибо вам большое за помощь)

Добавлено через 5 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да, распакованный файл создаётся с именем исходного, к которому добавлено ".1"
помогли) я вам тут "спасибо" и "лучший ответ" по натыкал)
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 7
29.11.2015, 22:59
Здравствуйте! В данном (последнем и исправленном варианте) кода вылезает ошибка. Не могу понять как исправить. Подскажите, что надо сделать, пожалуйста.
Миниатюры
Подскажите ошибку в реализации алгоритма Хаффмана  
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 7
29.11.2015, 23:05
Поможете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2015, 23:05
Помогаю со студенческими работами здесь

Оптимизация алгоритма Хаффмана
Сделал архиватор, но работает он запредельно долго ~ 30 мин на папку размером 50Mb(и это только упаковка). нужна помощь &quot;Гуру&quot;...

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

Реализация Алгоритма Хаффмана
Здравствуйте. Прошу помочь, есть программа на ABC паскале, но необходимо чтобы было написано в Turbo паскале. Нужно ее исправить. Если...

Исходник алгоритма Хаффмана на C
Пожалуйсто дайте исходник алгоритма Хаффмана на C.

Дикодирования алгоритма Хаффмана
Есть в файле закодированная строка и кодовая таблица буква, код как мне раскодировать строку?


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru