Курсовая работа: Сжатие данных методами Хафмана и Шеннона-Фано
if (i1<i2) then
begin
s := 0;
for i := i1 to i2 do
s := s + massiv[i]^.SymbolStat;//Суммируем статистику частот
//появления символов в файле
k := i1; //Далее инициализируем переменные
g1 := 0;
g2 := s;
c := g2 - g1;
{Алгоритм: Переменные i1 и i2 это индексы начального и соответственно конечного элемента массива в k будем вырабатывать индекс пограничного элемента массива по которому мы его будем делить. с переменная в кторой будет хранится разность между g2 и g1. Потребуется для определения k. Сначала суммируем статистику появления символов в файле (Она как ни странно будет равна размеру файла =: т.е. количеству байт в нём)). Далее инициализируем переменные.
Затем цикл в котором происходит следующее к g1 нулевая статистика прибавляем статстику massiv[k] элемента массива massiv[k], а из g2 вычитаем ту же статистику. Далее oldc:=c это нам надо для определения дошли мы до значения k где статистика обойх частей массива равна. c := abs(g2-g1) именно по модулю иначе у нас не выполнится условие (c >= oldc) в том случае когда (g2<g1). Далее проверяется условие c > oldc, если оно верно то мы уменьшаем k на единицу, если не то оставляем k какое есть это и будет значение элемента в котором сумм статистик масивов примерно равны. Далее просто рекурсивно вызываем Эту же процедуру пока массивы полностью не разделятся на одиночные элементы или листья }
repeat
g1 := g1 + massiv[k]^.SymbolStat;
g2 := g2 - massiv[k]^.SymbolStat;
oldc := c;
c := abs(g2-g1);
Inc(k);
until (c >= oldc) or (k = i2);
if c > oldc then
begin
Dec(k); //вырабатываем значение k2
end;
CreateCodWord(i1, k-1,'0'); //Заполняем первый массив
//элементами
CreateCodWord(k, i2,'1'); //Заполняем второй массив
//элементами
DivGroup(i1, k-1);//снова вызываем процедуру
//деления массива (первой части)