Шаг 0. Записать в массив Т символы в порядке убывания их частот встречаемости. Все вершины дерева пометить как свободные.
К := N; // —текущее количество вершин в дереве
Начальное состояние массива Т для строки “кол около колокола” из [1] представлено в таблице:
| 
   №  | 
  
   символ  | 
  
   свободный  | 
  
   частота  | 
  
   левый  | 
  
   правый  | 
  
   код  | 
 
| 
   1  | 
  
   о  | 
  
   истина  | 
  
   
  | 
  
   0  | 
  
   0  | 
  |
| 
   2  | 
  
   к  | 
  
   истина  | 
  
   
  | 
  
   0  | 
  
   0  | 
  |
| 
   3  | 
  
   л  | 
  
   истина  | 
  
   
  | 
  
   0  | 
  
   0  | 
  |
| 
   4  | 
  
   пробел  | 
  
   истина  | 
  
   
  | 
  
   0  | 
  
   0  | 
  |
| 
   5  | 
  
   а  | 
  
   истина  | 
  
   
  | 
  
   0  | 
  
   0  | 
  |
| 
   6  | 
  ||||||
| 
   7  | 
  ||||||
| 
   8  | 
  ||||||
| 
   9  | 
  
Шаг 1. Выбрать такие вершины дерева с номерами L и R, что
T[L].свободный = истина И
T[R].свободный = истина
Т[L].частота,
T[R].частота — минимальные из всех свободных вершин.
Создать новую вершину дерева:
K := K + 1;
T[K].свободный := истина;
T[K].частота := T[L].частота + T[R].частота;
T[K].левый := L;
T[K].правый := R;
T[L].свободный := ложь;
T[R].свободный := ложь;
Шаг 2. Если К < 2*N–1 то прейти на Шаг 1
T[К].код:= ””; // — это корень построенного дерева, код его равен пустой строке
Шаг 3.
// конкатенация строк:
T[T[K].левый ] := T[K].код + ”0”;
T[T[K].правый] := T[K].код + ”1”;
K := K – 1;
Шаг 4. Если К > N то перейти на Шаг 3.
В результате для нашего примера получим следующее состояние
массива T:
| 
   №  | 
  
   символ  | 
  
   свободный  | 
  
   частота  | 
  
   левый  | 
  
   правый  | 
  
   код  | 
 
| 
   1  | 
  
   о  | 
  
   ложь  | 
  
   
  | 
  
   0  | 
  
   0  | 
  
   “10”  | 
 
| 
   2  | 
  
   к  | 
  
   ложь  | 
  
   
  | 
  
   0  | 
  
   0  | 
  
   “11”  | 
 
| 
   3  | 
  
   л  | 
  
   ложь  | 
  
   
  | 
  
   0  | 
  
   0  | 
  
   “00”  | 
 
| 
   4  | 
  
   пробел  | 
  
   ложь  | 
  
   
  | 
  
   0  | 
  
   0  | 
  
   “010”  | 
 
| 
   5  | 
  
   а  | 
  
   ложь  | 
  
   
  | 
  
   0  | 
  
   0  | 
  
   “011”  | 
 
| 
   6  | 
  
   ложь  | 
  
   
  | 
  
   4  | 
  
   5  | 
  
   “01”  | 
 |
| 
   7  | 
  
   ложь  | 
  
   
  | 
  
   3  | 
  
   6  | 
  
   “0”  | 
 |
| 
   8  | 
  
   ложь  | 
  
   
  | 
  
   1  | 
  
   2  | 
  
   “1”  | 
 |
| 
   9  | 
  
   истина  | 
  
   
  | 
  
   7  | 
  
   8  | 
  
   “”  | 
 
В результате работы данного алгоритма для каждого элемента массива с номером от 1 до N в поле код будет записана строка, представляющая собой код Хаффмана для соответствующего символа.
Язык реализации – Си.
Написать программу, которая заданный текстовый файл архивирует методом сжатия по Хаффману.
На вход программе подается текстовый файл и код Хаффмана для этого файла.
Код Хаффмана может быть представлен либо в виде строк, записанных в другом файле, либо в виде дерева Хаффмана (как продолжение лабораторной работы №11).
Нужно вывести в выходной файл закодированный входной текст.
Архивный файл состоит из двух частей. В первой части находится информация об исходном файле и таблица кодировки. Во второй части — закодированный текст.
В первой части необходимо указать длину входного файла в байтах и количество различных символов в нем (размер входного алфавита — N).
Таблица кодировки может быть представлена двумя способами.
1) в виде последовательности их N троек <символ, длина кода, код>, где
символ — ASCII код символа входного алфавита (1 байт),
длина кода — количество битов в соответствующем кодовом слове (1 байт),
код — кодовое слово (1 или 2 байта).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.