Добрый день!
Помогите, пожалуйста. Нашла код алгоритма Хаффмана. Но не до конца понимаю как он работает. Поняла, что в начале просматривается строка. Берется символ. Если он уже был записан, то увеличивается 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");
}