- •Десятичная упаковка
- •Три в одном (упаковка байта)
- •Компандирование
- •Применение rle
- •Кодирование Хаффмана
- •Ошибки при передаче информации Биты четности
- •Коды с исправлением ошибок
- •Код Хэмминга. Пример работы алгоритма Вступление
- •Как это работает
- •Подготовка
- •Вычисление контрольных бит
- •Декодирование и исправление ошибок
- •Заключение
Применение 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 с.:ил.
