Автор: Пользователь скрыл имя, 03 Ноября 2011 в 09:22, курсовая работа
Производительность существующих компьютерных сетей может быть заметно увеличена за счет повышения скорости передачи данных по каналам связи, которое обеспечивается использованием методов сжатия информации (эффективное кодирование). Для решения этой проблемы было разработано большое количество разнообразных методов кодирования информации, которые могут быть реализованы программно. Данная разработка представляет собой программный модуль, обеспечивающий комрессию и декомпрессию информации.
Аннотация 2
Введение 4
1. Постановка задачи 5
2. Основные обозначения 6
3. Обзор и характеристика существующих методов сжатия информации, основанные на процедуре кодирования хаффмена 7
3.1. Динамическое кодирование хаффмена 7
3.2. Алгоритм динамического кодирования методом fgk 8
3.3. Алгоритм динамического кодирования виттера 9
Программная реализация 12
Руководство пользователя 13
Заключение 15
Библиографический список 16
Приложения 17
Таблица 10. Итерация№10
Итерация №10 |
Сообщение: Hello_ worl |
Закодировнное
сообщение:
01101000 001100101 1001101100 01 110 01101111 100 00100000 01001110111 111 1110 01110010 111 |
9
h
w e
-
3
4
5
6
/
7
Таблица 11. Итерация№11
Итерация №11 |
Сообщение: Hello_ world |
Закодировнное
сообщение:
01101000 001100101 1001101100 01 110 01101111 100 00100000 01001110111 111 1110 01110010 111 1100 01100100 |
11
h
5
6
7
8
ПРИЛОЖЕНИЕ В
Текст программы
unit Form;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Core;
type
TForm1 = class(TForm)
InChar: TEdit;
Panel1: TPaintBox;
Panel2: TPaintBox;
Label1: TLabel;
Label2: TLabel;
CodeTableMemo: TMemo;
MessageMemo: TMemo;
Label3: TLabel;
Label4: TLabel;
CodedMsg: TMemo;
Button1: TButton;
DecodedMsg: TMemo;
Button2: TButton;
Label5: TLabel;
procedure InCharKeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Tree, DecodeTree: PTree;
codetable: array [char] of string;
decodetable: array [char] of string;
procedure MakeCodeTable(Top: PTree);
implementation
{$R *. DFM}
procedure DrawTree(D: TPaintBox; P: Ptree; w,h: integer);
var
C: TCanvas;
procedure Draw(T: PTree; x,y,level,ofs: integer);
begin
if(T<>nil) then
begin
if(T. Left<>nil) then
begin
c. MoveTo(x,y);
c. LineTo(x-(ofs div 2),y+30);
end;
if(T. Right<>nil) then
begin
c. MoveTo(x,y);
c. LineTo(x+(ofs div 2),y+30);
end;
C. Ellipse(x-12,y-12,x+12,y+12);
if t. isleaf then if t. symbol=#0 then C. TextOut(x-4,y-25,'*') else C. TextOut(x-4,y-25,t. Symbol);
C. TextOut(x-6,y-7, inttostr(T. wiegth));
C. TextOut(x-6,y+12, inttostr(T. number));
Draw(T. Left,x-(ofs div 2),y+30,level+1,ofs div 2);
Draw(T. Right,x+(ofs div 2),y+30,level+1,ofs div 2);
end;
end;
begin
C: =D. Canvas;
C. Brush. Color: =clBtnFace;
C. FillRect(D. ClientRect);
Draw(P,w div 2,30,1,w div 2);
end;
procedure MakeDeCodeTable(Top: PTree);
procedure CT(P: PTree; code: string);
begin
if P<>nil then
begin
if (P. Wiegth>=0) and (P. IsLeaf) then
begin
decodetable [P. Symbol] : =code;
end;
if not P. IsLeaf then
begin
CT(P. Left,code+'0');
CT(P. Right,code+'1');
end;
end;
end;
begin
CT(Top,'');
end;
var
DCounter: integer;
DString: String;
DByte: byte;
DB: Boolean;
procedure AddCharToDMess(C: Char);
var
S: String;
begin
With Form1. DecodedMsg do
begin
S: =Text;
Clear;
Text: =S+C;
end;
end;
procedure Decode(BIT: Char);
var
i,j: integer;
c: char;
begin
if DB then
begin
if DCounter=0 then
DCounter: =7 else
dec(DCounter);
DByte: =((DByte shl 1) or (byte(bit) and 1));
if DCounter=0 then
begin
AddSymbol(DecodeTree,
CheckWiegth(DecodeTree);
Enumerate(DecodeTree);
Huffman(DecodeTree);
Vitter(DecodeTree);
DrawTree(Form1. Panel2,DecodeTree,Form1. Panel2. ClientWidth,500);
MakeDeCodeTable(
AddCharToDMess(chr(
DString: ='';
DB: =false;
end;
end else
if DecodeTree=nil then
begin
DB: =true;
Decode(BIT);
end else
begin
DString: =DString + Bit;
for c: =#0 to #255 do
begin
if DecodeTable [c] =DString then
begin
if c=#0 then
begin
DB: =true;
DCounter: =0;
end else
begin
AddSymbol(DecodeTree,c);
CheckWiegth(DecodeTree);
Enumerate(DecodeTree);
Информация о работе Компрессия информации и упорядочение дерева по алгоритму Виттера