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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2015, 11:45   #1
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание Алгоритм Хаффмана

Добрый день!

Помогите, пожалуйста. Нашла код алгоритма Хаффмана. Но не до конца понимаю как он работает. Поняла, что в начале просматривается строка. Берется символ. Если он уже был записан, то увеличивается count на 1. Если не было, тогда добавляется и count присваивается единица. То есть в начале считается количество каждого символа в строке. А вот как работает дальше не пойму. Помогите, пожалуйста

Код:
#include<vector>
#include<iostream>
#include<string>

using namespace std;

struct charC{
	char chr;
	int count;
	float prop;
};

void main(){
	vector<string> tmpS, res;
	vector<charC> voc;
	charC *tmpCChr;
	string srcStr;
	vector<vector<float>> mas1;
	vector<float> tmpM;
	vector<int> poses;
	int i, j, Count, tmpV;
	float tmpInt;
	setlocale(LC_ALL, "rus");
	//cin >> noskipws >> srcStr;
	srcStr = "мама мыла раму";
	bool add;

	for (i = 0; i < srcStr.length(); i++){
		add = true;
		for (j = 0; j < voc.size(); j++){
			tmpCChr = &voc[j];
			if (tmpCChr->chr == srcStr[i]){
				tmpCChr->count = tmpCChr->count + 1;
				add = false;
			}
		}
		if (add){
			tmpCChr = new charC;
			tmpCChr->chr = srcStr[i];
			tmpCChr->count = 1;
			voc.push_back(*tmpCChr);
		}
	}
	tmpM.clear();
	mas1.push_back(tmpM);
	Count = srcStr.length();
	for (i = 0; i < voc.size(); i++){
		tmpCChr = &voc[i];
		tmpCChr->prop = tmpCChr->count*1.0 / Count;
		mas1[0].push_back(tmpCChr->prop);
	}

	/*
	tmpM.clear();
	mas1.push_back(tmpM);
	for(i=0;i<12;i++){
	cin>>tmpInt;
	mas1[0].push_back(tmpInt);
	}
	*/
	while (i<mas1[0].size() - 1){
		if (mas1[0][i] < mas1[0][i + 1]){
			tmpV = mas1[0][i];
			mas1[0][1] = mas1[0][i + 1];
			mas1[0][i + 1] = tmpV;
			i = 0;
		}
		else{
			i++;
		}
	}


	//poses.push_back(0);
	i = 0;
	while (mas1[i].size()>2){
		tmpInt = mas1[i][mas1[i].size() - 1] + mas1[i][mas1[i].size() - 2];
		for (j = 0; j < mas1[i].size() - 2; j++){
			tmpM.push_back(mas1[i][j]);
		}
		j = tmpM.size() - 1;
		add = false;
		while (j >= 0){
			if (tmpM[j]>tmpInt){
				tmpM.insert(tmpM.begin() + j + 1, tmpInt);
				poses.push_back(j + 1);
				j = -1;
				add = true;
			}
			j--;
		}
		if (!add){
			tmpM.insert(tmpM.begin(), tmpInt);
			poses.push_back(0);
		}
		mas1.push_back(tmpM);
		tmpM.clear();
		i++;
	}
	res.push_back("0");
	res.push_back("1");
	i = mas1.size() - 1;
	while (i>0){
		for (j = 0; j <= mas1[i].size() - 1; j++){
			if (poses[i - 1] != j){
				tmpS.push_back(res[j]);
			}
		}
		tmpS.push_back(res[poses[i - 1]] + "0");
		tmpS.push_back(res[poses[i - 1]] + "1");
		res = tmpS;
		tmpS.clear();
		i--;
	}
	cout << "\nКодировка:\n";
	for (i = 0; i < res.size(); i++){
		tmpCChr = &voc[i];
		cout << tmpCChr->chr << ": " << res[i] << "\n";
	}
	cout << "\n Закодированое сообщение:\n";
	for (i = 0; i<srcStr.length(); i++){
		for (j = 0; j<voc.size(); j++){
			tmpCChr = &voc[j];
			if (tmpCChr->chr == srcStr[i]){
				cout << res[j] << " ";
			}
		}
	}
	system("pause");
}
Maray вне форума Ответить с цитированием
Старый 19.12.2015, 14:29   #2
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Самому частому присваивается однобитный код. Следующему по частоте присваивается код с однобитным префиксом, префикс получается операцией NOT от единственного однобитного кода. Как только неиспользованный код с однобитным префиксом остался один, весь этот код назначается префиксом следующей длины и присваиваем символу код с таким префиксом. Как только код и с таким префиксом остался один, он тоже целиком становится префисом. И так далее.
taras-proger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Хаффмана Bubel C# (си шарп) 3 17.05.2017 13:34
Алгоритм Хаффмана Bared Общие вопросы по Java, Java SE, Kotlin 0 22.06.2015 11:25
Алгоритм Хаффмана [BeNdeR] Общие вопросы Delphi 0 02.03.2012 20:48
Алгоритм Хаффмана 0479 Помощь студентам 1 15.09.2010 11:53
Алгоритм Хаффмана. Vetal115 Общие вопросы по Java, Java SE, Kotlin 0 22.04.2010 22:23