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

Адаптивный алгоритм Хаффмана (вывод в файл)

17.04.2018, 14:25. Показов 8247. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте. Собственно стала передо мной задача реализовать алгоритм Хаффмана для курсового проекта, обычный алгоритм трудностей не вызвал решил копнуть глубже и реализовать еще адаптивный алгоритм Хаффмана.
Собственно все почти получилось
Руководствуясь вот этой статьей https://cyberleninka.ru/articl... nformatsii
Сотворил следующее:
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
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
 
struct Node
{
    char c = NULL;
    int w = 0;
    Node *parent = NULL;
    Node *leftChild = NULL;
    Node *rightChild = NULL;
};
 
void incWeight(Node* root)
{
    root->w++;
    if (root->parent != NULL)
    incWeight(root->parent);
}
 
void checkChilds(Node* parent)
{
    if (parent->leftChild->w > parent->rightChild->w)
    {
        swap(parent->leftChild, parent->rightChild);
    }
}
 
void switchNodes(Node* n1, Node* n2)
{
    if (n1->parent->leftChild == n1) {
        n1->parent->leftChild = n2;
    } else {
        n1->parent->rightChild = n2;
    }
 
    if (n2->parent->leftChild == n2) {
        n2->parent->leftChild = n1;
    }
    else {
        n2->parent->rightChild = n1;
    }
 
    swap(n1->parent, n2->parent);
    checkChilds(n1->parent);
}
 
void recount(Node* escp)
{
    if (escp != NULL) {
        escp->w = escp->leftChild->w + escp->rightChild->w;
        recount(escp->parent);
    }
}
 
 
vector<Node*> sortTree(vector<Node*> tree)
{
    bool n = false;
    int ind;
    for (int i = tree.size() - 1; i > 0; i--) {
        for (int j = i - 1; j > -1; j--) {
            if (tree[i]->w > tree[j]->w) {
                n = true;
                ind = j;
            }
        }
        if (n) {
            switchNodes(tree[i], tree[ind]);
            swap(tree[i], tree[ind]);
            break;
        }
    }
    return tree;
}
 
vector<bool> getCode(Node* n, vector<bool> code) {
    if (n->parent == NULL)
        return code;
    if (n->parent->leftChild == n) {
        code.push_back(0);
    } else {
        code.push_back(1);
    }
    if (n->parent->parent != NULL)
        code = getCode(n->parent, code);
    return code;
}
 
void outCode(vector<bool> code)
{
    for (int i = code.size()-1; i > -1; i--)
    {
        cout << code[i];
    }
}
 
int main()
{
    char buf;
    ifstream file("../test.txt");
    vector<Node*> tree;
    map<char ,Node*> leaves;
    Node *root = new Node;
    Node *esc = root;
    tree.push_back(root);
 
    while (file >> buf) {
        if (leaves[buf] != NULL) {
            incWeight(leaves[buf]);
 
            outCode(getCode(leaves[buf], vector<bool>()));
        } else {
            leaves[buf] = new Node;
            leaves[buf]->c = buf;
            leaves[buf]->parent = esc;
 
            Node *tmp = new Node;
            tmp->parent = esc;
 
            esc->leftChild = tmp;
            esc->rightChild = leaves[buf];
            tree.push_back(leaves[buf]);
            tree.push_back(tmp);
 
            outCode(getCode(esc, vector<bool>()));
            cout << buf;
 
            esc = tmp;
            incWeight(leaves[buf]);
        }
        tree = sortTree(tree);
        recount(esc->parent);
    }
    file.close();
    system("pause");
    return 0;
}
При входном файле содержащем строку как в статье выше ("ABCCDDDDBB"), получил правильный результат
Название: Снимок.PNG
Просмотров: 209

Размер: 3.2 Кб
Но возник вопрос, а как это все в сжатом виде сбросить в файл? Если просто записать эту строку в файл, он еще больше чем исходный будет весить
В обычном алгоритме все просто брать по 8 бит и дропать в файл, тут же так не выйдет, но ведь его как-то используют)
Собственно хочу понять как, надеюсь на вашу помощь)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2018, 14:25
Ответы с готовыми решениями:

Алгоритм Хаффмана.Вывод в файл.
Доброго времени суток возник вопрос.Я написал программу кодирования файла по методу Хаффмана.Вопрос следующий каким образом надо записывать...

Адаптивный (динамический) алгоритм Хаффмана: Не получается реализовать функцию обновления дерева
Всем привет При реализации сабжа столкнулся с проблемой того, как задать дерево Хаффмана. Пытался сделать с помощью такой штуки : ...

Алгоритм Хаффмана с записью в файл
Коды Хаффмана (сжатие информации). Реализовать процедуры кодирования и декодирования согласно алгоритму Хаффмана. а)На вход процедуры...

1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
10.11.2020, 00:40
Руководствуясь вот этой статьей https://cyberleninka.ru/articl... nformatsii
Сотворил следующее:
ну народ-то не смеши! Сотворил он...
Этот код очень просто гуглится и он гуляет по сети с 2018 года минимум.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2020, 00:40
Помогаю со студенческими работами здесь

Алгоритм Хаффмана. Вывод таблицы закодированных символов
Вообщем, не люблю так делать, но уже все перепробовала. Вот код, реализации алгоритма Хаффмана. Подскажите пожалуйста, как вывести...

Алгоритм Хаффмана
Добрый вечер) Помогите пожалуйста написать прогу на дельфи - кодирование алгоритмом Хаффмана... Нужно, чтобы она выводила закодированный...

Алгоритм Хаффмана
Доброго времени суток.Если кто то может то объясните пожалуйста каким образом в приведённом ниже исходнике идёт построение дерева.Процедура...

Алгоритм Хаффмана
Решил разобраться с этим алгоритмом, собственно он состоит из нескольких из таких шагов: 1) Создать массив со всеми символами. 2)...

Алгоритм Хаффмана
Помогите пожалуйста с реализацией алгоритма хаффмана. Я зык C#


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru