Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2014, 18:53   #1
thedoctor
Пользователь
 
Регистрация: 29.11.2013
Сообщений: 10
По умолчанию Кодировка Хаффмана. То ли тут все просто,то ли я не догоняю.

Дорогие программисты. Вот был написан код "кодировка Хаффмана", и тут мы вводим количество данных и их частоту. Но я не могу то ли понять,то ли я туплю, написать вероятность появления символов. Просто уже битый час сижу и ломаю голову.
Код:
#include <iostream>
#include <vector>
#include <string>
#include <climits>

using namespace std;
struct node
{
    node * leftChild;
    node * rightChild;
    double frequency;
    string content;
    string code;


};

vector<node> nodeArray;

node  extractMin()
{
    double temp = (double) INT_MAX;
    vector<node>::iterator i1,pos;
    for(i1 = nodeArray.begin(); i1!=nodeArray.end(); i1++)
    {

        if(temp>(*i1).frequency)
        {
            pos = i1;
            temp = (*i1).frequency;
        }
    }

    node tempNode = (*pos);
    nodeArray.erase(pos);

    return tempNode;
}
node getHuffmanTree()
{
    while(!nodeArray.empty())
    {


        node * tempNode = new node;
        node * tempNode1 = new node;
        node * tempNode2 = new node;
        *tempNode1 = extractMin();
        *tempNode2 = extractMin();


        tempNode->leftChild = tempNode1;
        tempNode->rightChild = tempNode2;
        tempNode->frequency = tempNode1->frequency+tempNode2->frequency;
        nodeArray.push_back(*tempNode);
        if(nodeArray.size() == 1)//only the root node exsits
        {
            break;
        }
    }
    return nodeArray[0];
}


void BFS(node * temproot,string s)
{
    node * root1 = new node;
    root1 = temproot;

    root1->code = s;
    if(root1 == NULL)
    {

    }
    else if(root1->leftChild == NULL && root1->rightChild == NULL)
    {

        cout<<"the content is "<<root1->content<<endl;
        cout<<"and its corresponding code is "<<root1->code<<endl;
    }
    else
    {

        root1->leftChild->code = s.append("0");
        s.erase(s.end()-1);
        root1->rightChild->code = s.append("1");
        s.erase(s.end()-1);


        BFS(root1->leftChild,s.append("0"));
        s.erase(s.end()-1);
        BFS(root1->rightChild,s.append("1"));
        s.erase(s.end()-1);
    }

}




void getHuffmanCode()
{
    int size,i;
    double tempDouble;
    string tempString = "";

    cout<<"Пожалуйста, введите количество данных, которые вы хотите закодировать!"<<endl;
    cin>>size;

    for(i = 0; i<size; i++)
    {
        cout<<"Пожалуйста, введите то, что вы хотите кодировать и их частоты появления!"<<endl;
        node tempNode;
        cin>>tempString;
        cin>>tempDouble;


        tempNode.frequency = tempDouble;
        tempNode.content = tempString;
        tempNode.leftChild = NULL;
        tempNode.rightChild = NULL;
        nodeArray.push_back(tempNode);
    }


    node root = getHuffmanTree();


    BFS(&root,"");

}


int main()
{

    vector<int> test;
    test.push_back(1);
    test.push_back(2);
    test.push_back(3);
    test.push_back(4);
    vector<int>::iterator i1 = test.begin();
    test.erase(i1);

    setlocale(LC_ALL,"Russian");
    getHuffmanCode();
    return 0;
}
thedoctor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ну не работает и все тут igole Общие вопросы C/C++ 6 24.04.2013 22:32
Кодировка Хаффмана Тапок Общие вопросы C/C++ 1 15.01.2012 19:23
А что вы все тут делаете? Вавел из ГМТУ Свободное общение 12 09.09.2009 00:17
Просто не догоняю как сделать, плиз помогите Великие ПРОГРАМЕРЫ )) PUSHkiN Помощь студентам 12 12.06.2008 17:57