Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб10.Сжатие данных.Ошибки при передаче информации.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
573.45 Кб
Скачать

Применение rle

Очевидно, что кодирование RLE эффективно для данных, содержащих большое количество серий, например, для простых графических изображений, таких как иконки и графические рисунки. Однако это кодирование плохо подходит для изображений с плавным переходом тонов, таких как фотографии.

Методом кодирования длин серий могут быть сжаты произвольные файлы с двоичными данными, поскольку спецификации на форматы файлов часто включают в себя повторяющиеся байты в области выравнивания данных.

Звуковые данные, которые имеют длинные последовательные серии байт (такие как низкокачественные звуковые семплы) могут быть сжаты с помощью RLE после того, как к ним будет применено Дельта-кодирование.

Алгоритм на Паскале (Delphi) для практического занятия

function encode(s:string):string;

var i,j:integer;

newS:string;

begin

i:=1;

while i <= length(s) do

begin

j:=i;

while (s[i] = s[j+1]) do inc(j);

if (j-i = 0) or (j-i = 1) or (j-i =2) then

begin

newS := newS + s[i];

if (s[i]='0') then newS:=newS+'0';

inc(i);

end else

begin

newS := newS + inttostr(j-i+1) + s[i];

inc(i,j-i+1);

end;

end;

result:= newS;

end;

function decode(s:string):string;

var i,j,c:integer;

newS:string;

dp : string;

begin

i:=1;

while i <= length(s) do

begin

j:=i;

while s[j] in ['0'..'9'] do inc(j);

if j-i > 0 then

begin

dp := copy(s,i,j-i);

for c:=1 to strtoint(dp) do newS := newS + s[j];

delete(s,i,j-i+1);

end else

begin

newS := newS + s[i];

inc(i);

end;

end;

result:= newS;

end;

- Статистическое кодирование основано на том, что не все элементы данных встречаются с одинаковой частотой (или вероятностью). Коды выбираются так, чтобы наиболее часто встречающемуся элементу соответствовал код с наименьшей длиной, а наименее частому - с наибольшей. Кроме этого, коды подбираются таким образом, чтобы при декодировании можно было однозначно определить элемент исходных данных. При таком подходе возможно только бит-ориентированное кодирование, при котором выделяются разрешённые и запрещённые коды. Если при декодировании битовой последовательности код оказался запрещённым, то к нему необходимо добавить ещё один бит исходной последовательности и повторить операцию декодирования. Примерами такого кодирования являются алгоритмы Шеннона и Хафмана.

Кодирование Хаффмана

Классический алгоритм Хаффмана на входе получает таблицу частот встречаемости символов в сообщении. Далее на основании этой таблицы строится дерево кодирования Хаффмана (Н-дерево).

Симаков Александр, xander@online.ru Сыктывкарский Государственный Университет

Кафедра Прикладной Математики

13 ноября 2002 год http://www.codenet.ru/progr/alg/huffcode.php

Ошибки при передаче информации Биты четности

Дано число i (целое без знака). Определить, сколько единиц в его двоичном представлении.

1 способ – очевидный: перевести в двоичную систему счисления (представить, например, строкой) и подсчитать количество единиц.

2 способ – в цикле пока число больше 0 смотреть последний бит числа и уменьшать число в два раза

3 способ – уменьшать число, убирая крайнюю справа единицу в двоичной записи числа

Алгоритм следующий:

cnt:=0; //cnt - счетчик единиц в i. while (i<>0) do //цикл повторяется число раз, равное числу единиц в i. begin i:=(i-1) and i; //"Убираем" крайнюю справа единицу в двоичной записи числа. cnt:=cnt+1; end; Пример: 110 = i 101 = i-1

100 = i and (i-1)

Уоррен, Генри, С. Алгоритмические трюки для программистов. – М.: Издательский дом «Вильямс», 2003. – 288 с.:ил.