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

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

Войти
Регистрация
Восстановить пароль
 
PhenixOfDoctor
1 / 1 / 0
Регистрация: 29.12.2013
Сообщений: 23
#1

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

05.01.2014, 14:47. Просмотров 261. Ответов 0
Метки нет (Все метки)

Дорогие программисты, тут вышла одна проблемка с кодом Хаффмана. Я написал код Хаффмана для препода, а он попросил еще доделать его, добавив туда высчет вероятности(то есть, если в предложении какая нибудь буква встречается 2 раза, то нужно общее количество букв разделить на 2, если 3 раза,то на 3 и этот результат вывести на экран,чтобы было так:

буквы: вероятность: код Хаффмана:
а 0,33 110
б 0,11 010

чтобы вот так было,а как эт сделать,я хз вообще. Если не сложно,можете помочь?

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
#include <iostream>
#include <queue>
#include <map>
#include <climits> // for CHAR_BIT
#include <iterator>
#include <algorithm>
 
const int UniqueSymbols = 1 << CHAR_BIT;
const char* SampleString = "bep or!";
 
typedef std::vector<bool> HuffCode;
typedef std::map<char, HuffCode> HuffCodeMap;
 
class INode
{
public:
    const int f;
 
    virtual ~INode() {}
 
protected:
    INode(int f) : f(f) {}
};
 
class InternalNode : public INode
{
public:
    INode *const left;
    INode *const right;
 
    InternalNode(INode* c0, INode* c1) : INode(c0->f + c1->f), left(c0), right(c1) {}
    ~InternalNode()
    {
        delete left;
        delete right;
    }
};
 
class LeafNode : public INode
{
public:
    const char c;
 
    LeafNode(int f, char c) : INode(f), c(c) {}
};
 
struct NodeCmp
{
    bool operator()(const INode* lhs, const INode* rhs) const { return lhs->f > rhs->f; }
};
 
INode* BuildTree(const int (&frequencies)[UniqueSymbols])
{
    std::priority_queue<INode*, std::vector<INode*>, NodeCmp> trees;
 
    for (int i = 0; i < UniqueSymbols; ++i)
    {
        if(frequencies[i] != 0)
            trees.push(new LeafNode(frequencies[i], (char)i));
    }
    while (trees.size() > 1)
    {
        INode* childR = trees.top();
        trees.pop();
 
        INode* childL = trees.top();
        trees.pop();
 
        INode* parent = new InternalNode(childR, childL);
        trees.push(parent);
    }
    return trees.top();
}
 
void GenerateCodes(const INode* node, const HuffCode& prefix, HuffCodeMap& outCodes)
{
    if (const LeafNode* lf = dynamic_cast<const LeafNode*>(node))
    {
        outCodes[lf->c] = prefix;
    }
    else if (const InternalNode* in = dynamic_cast<const InternalNode*>(node))
    {
        HuffCode leftPrefix = prefix;
        leftPrefix.push_back(false);
        GenerateCodes(in->left, leftPrefix, outCodes);
 
        HuffCode rightPrefix = prefix;
        rightPrefix.push_back(true);
        GenerateCodes(in->right, rightPrefix, outCodes);
    }
}
 
int main()
{
    // Build frequency table
    int frequencies[UniqueSymbols] = {0};
    const char* ptr = SampleString;
    while (*ptr != '\0')
        ++frequencies[*ptr++];
 
    INode* root = BuildTree(frequencies);
 
    HuffCodeMap codes;
    GenerateCodes(root, HuffCode(), codes);
    delete root;
 
    for (HuffCodeMap::const_iterator it = codes.begin(); it != codes.end(); ++it)
    {
        std::cout << it->first << " ";
        std::copy(it->second.begin(), it->second.end(),
                  std::ostream_iterator<bool>(std::cout));
        std::cout << std::endl;
    }
    return 0;
}
Добавлено через 2 часа 41 минуту
ой,то есть не написал сам,а нашел код Хаффмана,прошу прощения=)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 14:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Код Хаффмана (C++):

Код Хаффмана - C++
Всем доброго дня! имеется код хафманна, работает, но считает неправильно! кто может объяснить в чем дело? #include &lt;iostream&gt; ...

Модифицированный код Хаффмана - C++
Каждому числу соответствует любое двоичное (специальная таблица пример 1 соответствует 00111, 2 соответствует 11 и так далее). При вводе...

Код шеннон или хаффмана в dev c++ - C++
всем добрый день; сможете помочь с кодом, надо написать код шеннон или хаффмана в dev c++, плиииз. по братский

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

Коды Фано, Хаффмана, Хэмминга, Шеннона, код с проверкой на четность - C++
Помогите пожалуйста!!!!!!очень срочно надо!!!:(:(нужно реализовать коды Фано,Хаффмана,Хэмминга((7,4),(8,4)),Шеннона,код с проверкой на...

Алгоритм Хаффмана - C++
Возможно и наболевшая тема на форуме, но всё же есть реализация алгоритма Хаффмана. Допустим, у меня в файле есть следующая строка: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 14:47
Привет! Вот еще темы с ответами:

Кодирование Хаффмана - C++
Есть дерево Хаффана, с помощью функции, приведенной ниже прохожусь по дереву и &quot;выписываю&quot; 0 и 1, получившиеся коды символов записываю в...

Дерево Хаффмана - C++
Здравствуйте. Хотел узнать как работает дерево Хаффмана и 4 дня изучал материалы в интернете (статьи, видеоуроки) и т.д.), написал...

Сжатие Хаффмана - C++
Есть прога, реализующая сжатие Хаффмана: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;map&gt; #include...

Алгоритм Хаффмана - C++
Доброго времени суток, пишу сюда, так как отчаялся найти ошибку сам. Собственно проблема состоит в непонимании где я допустил ошибку....


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

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

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