код хафмана

Чтоб разобраться в коде Хафмана, скопировал программу с инета и не могу понять некоторых деталей при реализации алгоритма Хафмана на паскаль, сам алгоритм понятен(как мне кажется), а вот с программным кодом туго...
Пока что у меня следующие вопросы...
почему, когда с текстового файла перегоняют символы в массив, запоминают аски код(во всех программах, которые встречал в инете), а не сам символ, почему в этом же массиве учитывается не частота появления символа в текстовом файле, а вероятность... и последнее, мне кажется в приведённом ниже коде есть ошибка в цикле вычисления вероятности в условии if (P[b+1].kol_symb <> 0) then ..., т.к. индекс b не определён, для этого цикла... но если индекс не b, то какой должен быть индекс...
Пока что у меня следующие вопросы...
почему, когда с текстового файла перегоняют символы в массив, запоминают аски код(во всех программах, которые встречал в инете), а не сам символ, почему в этом же массиве учитывается не частота появления символа в текстовом файле, а вероятность... и последнее, мне кажется в приведённом ниже коде есть ошибка в цикле вычисления вероятности в условии if (P[b+1].kol_symb <> 0) then ..., т.к. индекс b не определён, для этого цикла... но если индекс не b, то какой должен быть индекс...
- Код: Выделить всё
Procedure Get_pseudo_table (fname: string;
var P: Pseudo_table;
var k: integer;
var flen: longint);
Var
f: file;
b: byte;
i: integer;
KS: longint;
Begin
KS:= 0; { кол-во встреч символа }
k:= 0;
For i:=1 to 256 do
begin
P[i].kol_symb:= 0;
P[i].sum_ver:= 0;
P[i].code:= NIL;
end;
Assign (f, fname);
Reset (f, 1);
while (not eof (f)) do
begin
BlockRead (f, b, 1); { считывает 1 переменную из файла в перем b}
if (P[b+1].kol_symb = 0) then {если в псевдосимволе
кол-во символов=0} {1-ый раз встречается}
begin
inc (k);
P[b+1].kol_symb:= 1;
P[b+1].code:= New (PtrCode);
P[b+1].code^.symb:= b;
P[b+1].code^.len:= 0; { длина в двоичном разряде:=0 }
P[b+1].code^.next:= NIL;
for i:=1 to 32 do
P[b+1].code^.code[i]:= 0; { весь двоичный код записываем нулями}
end;
P[b+1].sum_ver:= P[b+1].sum_ver+1; { если встреч не 1-ый раз, то}
inc (KS); {увеличиваем кол-во этого эл-та в файле на 1}
end;
Close (f);
For i:=1 to 256 do
--> индекс b должен быть или нет? if (P[b+1].kol_symb <> 0) then { если псевдосимвол не пуст, т.е. там есть какие-то символы}
P[i].sum_ver:= P[i].sum_ver / KS; { вычисление вероятности появления}
flen:= KS;
End;