Автор работы: Пользователь скрыл имя, 11 Мая 2012 в 19:11, курсовая работа
Основоположником науки о сжатии информации принято считать Клода Шеннона. Его теорема об оптимальном кодировании показывает, к чему нужно стремиться при кодировании информации и на сколько та или иная информация при этом сожмется.
Первые алгоритмы сжатия были примитивными в связи с тем, что была примитивной вычислительная техника. С развитием мощностей компьютеров стали возможными все более мощные алгоритмы. Настоящим прорывом было изобретение Лемпелем и Зивом в 1977 г. словарных алгоритмов. До этого момента сжатие сводилось к примитивному кодированию символов. Словарные алгоритмы позволяли кодировать повторяющиеся строки символов, что позволило резко повысить степень сжатия.
ВВЕДЕНИЕ 3
ГЛАВА I Алгоритмы Сжатия 4
Типы сжатия 4
Кодирование Хафмана 5
Словарные методы
1.3.1 LZ77(скользящее окно) 7
1.3.2 Недостатки LZ77 10
1.3.3 LZ78 11
1.3.4 LZW 13
1.3.5Декодирование LZW 14
1.3.6 Структура LZW 15
ГЛАВА II Разработка архиватора ArchivatorLZW 16
2.1 Блок-схема алгоритма сжатия файла 17
2.2 Алгоритм 18
2.2.1 Алгоритм сжатия файла 19
2.2.2 Алгоритм распаковки файла 20
2.3 Создание интерфейса 21
2.4 Программная реализация алгоритмов 22
2.5 Примеры 23
2.6 Листинг программы 25
ВЫВОД 34
ЛИТЕРАТУРА 35
If Result<0 Then Result:=-1024;
End;
Procedure ProcessNewByte(Var InpWord:TSingleWord; NewChar:Byte; Var OutN:Integer);
Var
NewW:TSingleWord;
Begin
NewW:=InpWord;
{Если строка уже слишком длинная}
If AddCharToWord(NewW, NewChar)<0 Then
Begin
OutN:=FindInDic(NewW); //запишем эту строку
ClearWord(InpWord);
AddCharToWord(InpWord, NewChar); //Изменим вх. слово
Exit;
End;
OutN:=FindInDic(NewW);
If OutN>=-256 Then //если есть в словаре
Begin //то ничего не делаем
OutN:=-1024;
InpWord:=NewW; //Изменим вх. слово
End
Else Begin //Если нет в словаре, то...
Dic.Add(NewW); //добавим новую строку в словарь
OutN:=FindInDic(InpWord); //а на выход пошлем пред. строку
ClearWord(InpWord);
AddCharToWord(InpWord, NewChar); //Изменим вх. слово
End;
End;
Procedure ProcessCompression;
Var
SrcWord:TSingleWord;
NewByte:Byte;
OutN:Integer;
Begin
NowBitsForDic:=
If ReadStream.FileRead Then Exit;
ClearWord(SrcWord);
NewByte:=ReadStream.Read(8);
AddCharToWord(SrcWord, NewByte);
While Not(ReadStream.FileRead) Do
Begin
NewByte:=ReadStream.Read(8);
ProcessNewByte(SrcWord, NewByte, OutN);
WriteByDic(OutN);
End;
OutN:=FindInDic(SrcWord);
WriteByDic(OutN);
WriteStream.Write(0,
8-WriteStream.AdditionalBits+
End;
Function CompressFile(SrcFile, DestFile:String):Integer;
Var
FSize:Integer;
Begin
Result:=0; Dic.Clear;
ReadStream.OpenStream(SrcFile)
WriteStream.OpenStream(
FSize:=ReadStream.Size;
WriteFileName(SrcFile, FSize);
ProcessCompression;
ReadStream.CloseStream;
WriteStream.CloseStream;
End;
Function ReadFileName(Var FSize:Integer):String;
Var
Len, i:Word;
Tmp:Integer;
Begin
Result:='';
FSize:=0;
Len:=ReadStream.Read(16);
For i:=1 To Len Do
Result:=Result+Char(
ReadStream.Read(8);
FSize:=ReadStream.Read(16);
Tmp:=ReadStream.Read(16);
Tmp:=Tmp ShL 16;
FSize:=Tmp+FSize;
ReadStream.Read(16);
End;
Procedure SaveSingleWord(SingleWord:
Var
i:Word;
Tmp:Byte;
Begin
If GetWordLength(SingleWord)=0 Then Exit;
For i:=1 To GetWordLength(SingleWord) Do
Begin
Tmp:=Byte(SingleWord[i]);
WriteStream.Write(Tmp, 8);
End;
End;
Procedure WriteByDicOrig(N:Integer);
Var
Data:Word;
SrcWord:TSingleWord;
Begin
If N<-256 Then Exit;
Data:=Abs(N);
If N<0 Then
Begin
Dec(Data);
WriteStream.Write(Data, 8);
End
Else Begin
SrcWord:=Dic.Words[Data];
SaveSingleWord(SrcWord);
End;
End;
Procedure ProcessDeCompression(FSize:
Var
SrcWord, SaveWord:TSingleWord;
NewByte, BitFlag:Byte;
OutN, TempN:Integer;
OrdinaryWord:Boolean;
i:Integer;
Begin
NowBitsForDic:=
OrdinaryWord:=True;
If FSize=0 Then Exit;
ClearWord(SrcWord);
While ((WriteStream.BytesWrote<
Begin
BitFlag:=ReadStream.ReadBit;
If BitFlag=0 Then //если это просто байт
Begin
NewByte:=ReadStream.Read(8);
ProcessNewByte(SrcWord, NewByte, OutN);
WriteStream.Write(NewByte, 8);
End
Else Begin //если это словарное слово
OutN:=ReadStream.Read(
If OutN>=Dic.Count Then //если нужного слова нет в словаре
Begin
ProcessNewByte(SrcWord, Byte(SrcWord[1]), TempN
OrdinaryWord:=False;
End
Else OrdinaryWord:=True;
SaveWord:=Dic.Words[OutN];
SaveSingleWord(SaveWord);
If OrdinaryWord Then //если обычное слово, то стандартный перебор
Begin
For i:=1 To GetWordLength(SaveWord) Do
Begin
NewByte:=Byte(SaveWord[i]);
ProcessNewByte(SrcWord, NewByte, OutN);
End;
End
Else Begin //иначе сокращенный перебор
For i:=2 To GetWordLength(SaveWord) Do
Begin
NewByte:=Byte(SaveWord[i]);
ProcessNewByte(SrcWord, NewByte, OutN);
End;
End;
End;
End;
End;
Function DeCompressFile(SrcFile, DestDir:String):Integer;
Var
FSize:Integer;
DestFile:String;
Begin
Result:=0;
Dic.Clear;
ReadStream.OpenStream(SrcFile)
DestFile:=DestDir+
WriteStream.OpenStream(
ProcessDeCompression(FSize);
ReadStream.CloseStream;
WriteStream.CloseStream;
End;
initialization
Dic.Init;
ReadStream:=TFileReadStream.
WriteStream:=TFileWriteStream.
finalization
Dic.Done;
ReadStream.Done;
WriteStream.Done;
end.
Вывод
Все представленные здесь различные методы словарного сжатия используют одни и те же общие принципы. Они читают файл символ за символом и добавляют фразы в словарь. Фразы являются отдельными символами и строками символов входного файла. Методы сжатия различаются только способом отбора фраз для сохранения в словаре. Когда строка входного файла совпадает с некоторой фразой в словаре, в сжатый файл записывается позиция этой фразы или метка. Если для хранения метки требуется меньше бит, чем для записи самой фразы, то наблюдается эффект сжатия.
В общем случае,
словарные методы сжатия, если их применять
грамотно, дают лучшие результаты, чем
статистические методы компрессии, поэтому
они активно используются во всевозможных
компрессионных приложениях, или они являются
одним из этапов многостадийного сжатия.
Список использованной литературы