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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2010, 14:31   #1
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
Вопрос Построение кода Хаффмена

Доброго времени суток!
Задача следующая: Вводится сообщение, для которого нужно посчитать кол-во каждого символа и его вероятность. После чего получить кодовую комбинацию. Для этого :
Буквы алфавита сообщений выписываются в основной столбец в порядке убывания вероятностей. Две последние буквы объединяются в одну вспомогательную, которой присваивается суммарная вероятность. Вероятности букв, не участвовавших в объединении, и полученная суммарная вероятность снова располагаются в порядке убывания вероятностей в дополнительном столбце, а две последние объединяются.
Процесс продолжается до тех пор, пока не получим единственную вспомогательную букву с вероятностью, равной 1.

Реализовать это у меня получилось...

Но возникла проблема с построением кодовой комбинации...
"Из точки, соответствующей суммарной вероятности, равной 1, направляются две ветви, причем ветви с большей вероятностью присваивается символ 1, а с меньшей 0.
Такое последовательное ветвление продолжаем до тех пор, пока не дойдем до вероятности исходной буквы."

Вот эту часть не получается реализовать... Не знаю даже как подлезть к ней...

Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

void psort(char *b, int nn);
void psort(float *b, int nn);
void psort(int *b, char *d,int nn);
void psort(float b[10][10], int nn,int e);
void nul(float yy[10][10],float verr[20],int ll);
void copy(float yy[10][10],int ll,int e);

int main()
{
	setlocale( LC_ALL,"Russian" );
	printf("Введите строку: ");
	float ch=0; //счетчик кол-ва введённых элементов
	char x; //переменная ввода
	char* a=new char[100]; //исходный массив, содержащий символы
	char* c=new char[100]; //преобразованый массив A, содежащий символы без их повторов.
	for(int i=0;i<100;i++)
	{
		cin>>x;
		if(x!='.'){ //Точкой обозначаем конец ввода
			ch++;
			a[i]=x;
		}
		else
			break;
	}
	cout<<"\nМощность массива: "<<ch;
	psort(a,ch); //функция сортировки
	cout<<"\n\nСтрока после сортировки: ";
	for (int i=0;i<ch;i++)//выводим массив после сортировки
		cout<<a[i];
	cout<<endl;
	int col[20]; //массив с количественными значениями введённых символов
	float ver[20]; //массив с вероятностями введённых символов
	int l=0,o=1;// 'o' -временная переменная для подсчёта кол-ва символов и последующего занесения в массив col
	for (int i=0;i<ch;i++){
		if(a[i]==a[i+1])
			o++;
		else{
			col[l]=o;
			ver[l]=col[l]/ch;// подсчёт вероятности символа
			c[l]=a[i];
			cout<<"\nКол-во символов ["<<a[i]<<"] равно: "<<col[l];
			o=1;
			l++; //кол-во различных сиволов и их вероятностей
		}
	}
	cout<<endl;
	psort(ver,l); //ф-ция сортировки вероятностей по убыванию
	psort(col,c,l); //ф-ция сортировки кол-ва символов по убыванию и на основе этого сортируем символы в массиве C по убыванию их вероятностей
	for(int i=0;i<l;i++)
		cout<<"\nВероятность ["<<c[i]<<"] равна: "<<ver[i];
	cout<<endl;
	float ver2[20];
	for (int i=0; i<20; i++)
		ver2[i]=ver[i];
	float y[10][10];
	cout<<"\nДвумерный массив:"<<endl; //Заполняем дв.массив элементами.
	for(int i=0;i<l;i++){ //Неиспользуемые элементы заменяем нулями.
		cout<<endl;
		for(int j=0;j<l;j++){//убираем элементы которые не участвуют в дальнейшей работе программы.
			if ((i+j)>=l) //все элементы ниже диагонали заменяем 0.
				y[i][j]=0;
			else
				y[i][j]=ver[i];//заносим вероятности в массив y
			cout<<y[i][j]<<"\t";
		}
	}
	cout<<"\n\nКодовое дерево:"<<endl;
	for(int j=1;j<l;j++){
			for(int i=l-1;i>=0;i--){//введём пересчёт по j в обратном порядке
				if ((y[i][j]==0)&&(y[i-1][j]!=0)){//если элементы равен 0 и следующий элемент не равен 0
					y[i-1][j]=y[i-1][j-1]+y[i][j-1];//суммируем 
					psort(y,l,j);//сортируем по убыванию
					copy(y,l,j);//копируем текущий столбец в следующий
					nul(y,ver,l);//заполняем нулями
				}
			}
	}
	for(int i=0;i<l;i++){
		cout<<endl;
		for(int j=0;j<l;j++)
			cout<<y[i][j]<<"\t";
	}
	system("pause");
	return 0;
}
Подскажите, пожалуйста, как это можно реализовать. Заранее спасибо.
frem-dag вне форума Ответить с цитированием
Старый 03.10.2010, 23:58   #2
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
По умолчанию

Хотя бы идейку подкиньте, с чего начать вообще...
frem-dag вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построения оптимального кода. По формуле Хаффмена didar_ Паскаль, Turbo Pascal, PascalABC.NET 2 22.04.2009 19:09
Сжатие Хаффмена zgest Общие вопросы C/C++ 1 23.03.2009 23:23
Кодирование методом Хаффмена(создание 2-ичьного файла) Руслантус Общие вопросы C/C++ 0 04.12.2008 16:58
C++ Метод Хаффмена. Очень нужно ! MTBiker Фриланс 2 11.05.2008 21:56
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51