Сайт о телевидении

Сайт о телевидении

» » Теория информации. Арифметическое сжатие

Теория информации. Арифметическое сжатие

Схема сжатия LZW

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

Групповое кодирование

Сжатие изображений

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

Один из самых простых методов сжатия - групповое кодирование или групповое сжатие. Другое название - "сжатие методом RLE" (run-length encoding). Идея состоит в том, что вместо повторяющихся пикселов хранится информация о цвете точки и количестве повторений. Представление данных имеет варианты: может сначала идти запись о цвете, потом о количестве, может - наоборот. Это порождает проблемы воспроизведения. Для большинства растровых файлов, особенно для фотореалистических сжатие RLE не эффективно, т.к. количество повторяющихся пикселов мало. Возникает даже лишняя трата ресурсов.

Кодирование методом Хаффмана (Huffman) - общая схема сжатия. Подход создан в 1952 г. для текстовых файлов. Имеется множество вариантов. Основная идея - присвоение двоичного кода каждому уникальному элементу, причем длина этих кодов различна. Для наиболее часто повторяющихся элементов используются более короткие коды. Присвоения хранятся в таблице перекодировки, которая загружается в декодирующую программу перед самими кодами. Существуют различные алгоритмы построения кодов. Степень сжатия оценивается как 8: 1 . Для файлов с длинными последовательностями схема Хаффмана работает не очень хорошо. Здесь лучше групповое сжатие. Т.к. для построения кодов нужна статистика, обычно используют 2 прохода. Сначала создается статистическая модель, затем выполняется собственно сжатие (кодирование). Т.к. работа с кодами переменной длины требует много времени, кодирование и декодирование длительны.

Метод назван по первым буквам фамилий разработчиков: Lempel, Ziv, Welch. Разработка 1984 г. Сначала метод предназначался для аппаратной реализации. Как и алгоритм Хаффмана, алгоритм LZW имеет несколько вариантов. Идея - поиск повторяющихся пиксельных узоров и их кодирование. Кодовая таблица создается не перед кодированием, а в процессе кодирования, что делает алгоритм адаптивным. Рассмотрим последовательность "ababaaacaaaad". Пусть каждая буква кодируется в изображении 2-битной величиной. Начальная кодовая таблица кодирует каждый атомарный объект: a - 00, b - 01, c - 10, d - 11 . Затем алгоритм переходит к поиску последовательностей. Он может распознать только 1-буквенные последовательности. Первая 2-буквенной последовательности не распознается и подлежит кодированию. Т.к. длина кода исчерпана, ее увеличивают на 1: a - 000, b - 001, c - 010, d - 011, ab - 100 . Следующее 2-буквенное сочетание распознается. Для каждой буквы было 2-битное описание. На последовательность требуется 2 * 2 = 4 бита. При замене последовательности 3-битным кодом экономим 1 бит на каждом появлении последовательности. Типичный коэффициент сжатия для метода 3: 1 . Изображения с повторяющимися цветными узорами сжимаются до 10: 1 . Отсканированные фотографии и изображения, не содержащие узоров, сжимаются плохо.

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

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

Иногда общество ограничивает выбор партнера в браке тем, что разрешает выбирать его только вне определœенной узкой группы. Эта форма брака принято называть экзогамией. В нашем обществе это ограничение применяется для избежания кровосмесительных связей. Так, правовые нормы запрещают нам жениться на сестрах, двоюродных сестрах и некоторых других близких родственниках. Во многих обществах запрещено выбирать супруга внутри своего клана, деревни, а иногда даже племени.

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

По количеству партнеров в браке различают моногамию и полигамию. Моногамия, ᴛ.ᴇ. брак одного мужчины с одной женщиной (в одно время) наиболее привычный для современных европейских обществ. Но в развитии большинства обществ практиковалась полигамия ᴛ.ᴇ. формы брака, при которых существует более одного партнер в супружестве. Возможны три формы полигамии. В первую очередь, групповой брак, при котором несколько мужчин и несколько женщин находятся одновременно между собой в брачных отношениях. Очень редкой формой полигамного брака является полиандрия, когда женщина имеет несколько мужей. Наиболее распространенной формой полигамного брака является полигиния, или многоженство. Как отмечает С.С. Фролов, мнение представителœей современной Европы и Северной Америки о многоженстве в значительной степени этноцентрично. «Многие в нашем обществе, к примеру, считают, что культивирование такой формы брака ведет к деградации женщины, к превращению ее в рабыню. Это считается неслыханной жестокостью и вызывает возмущение (возможно, это чувство навеяно некоторыми фильмами о восточных владыках). При этом факты говорят об обратном. Трудно сказать, в каком обществе женщина имеет более высокий статус - в обществе с полигамной или моногамной формой брака. В первую очередь, даже в обществах, где широко распространена полигамная семья, браки обычно являются моногамными. Только наиболее преуспевающие люди с высоким статусом могут позволить себе иметь более одной жены. Во-вторых, обязанности между женами четко распределœены, а первая жена очень часто оказывает решающее влияние на поведение мужа. Жизнь всœех жен в достаточной степени обеспечена, и они, как правило, не желают для себя другой доли».

Кроме того по типу властных отношений различают патриархальный брак(власть у мужа), матриархальный брак (власть у жены) и эгалитарный брак (власть у обоих супругов). В современных европейских обществах преобладает эгалитарный брак.

К сожалению, брак не всœегда бывает успешным и для исправления ситуации в современных обществах предусмотрен развод. Но, в то же время, обществу невыгодна любая нестабильность института семьи. По этой причине практически в каждом обществе существуют определœенные правила и законы, затрудняющие развод или дающие привилегии одной из сторон. Большинство обществ стремится сделать развод весьма болезненной операцией. Особенно это касается тех обществ, где партнер по браку выбирается родителями. Очень часто в тех обществах, где большое значение имеет родственная семья, воспитание ребенка в случае развода частично берут на себя братья, сестры, дяди или тети. Как отмечает С.С. Фролов, «в нашем обществе с сильным акцентом на индивидуальную любовь при выборе партнера и при ярко выраженном приоритете нуклеарной семьи развод чаще всœего влечет за собой трагические последствия как для детей, так и для взрослых».

Как социальный институт семья выполняет следующие функции в обществе

Функция сексуального регулирования состоит в том, что общество упорядочивает, направляет и регулирует естественные сексуальные потребности людей. Вместе с тем практически каждое общество имеет альтернативные пути удовлетворения сексуальных потребностей. Несмотря на то, что существуют определœенные нормы супружеской верности, большинство обществ легко прощает нарушения этих норм.

Репродуктивная функция состоит в воспроизводстве новых поколений членов общества. При этом важно, чтобы дети были физически и психически здоровыми и впоследствии имели способности к обучению и социализации. Вместе с тем важным условием существования общества является регулирование рождаемости, избежание демографических спадов или, наоборот, взрывов. Семья - это основной институт, ответственный за воспроизводство новых членов общества. Другие пути неэффективны и, как правило, социально не одобряются. По этой причине появление ребенка вне института семьи обычно вызывает жалость, сострадание или осуждение.

Функция социализации состоит в том, что семья помогает ребенку усвоить нормы того общества, в котором он родился. Именно в семье закладываются основы формирования личности.С.С. Фролов отмечает, что «многие мыслители, начиная с Платона, говорили об обобществлении воспитания детей, однако всœе попытки социализации вне института семьи оказывались неудачными. К примеру, после революции в Советском Союзе были созданы специализированные программы общественного воспита-ния детей, с тем чтобы женщины могли участвовать в трудовом процессе. При этом данный эксперимент не получил широкого распространения. Сегодня в нашем обществе пытаются совместить усилия образовательных институтов и института семьи для успешной социализации детей, но семья по-прежнему удерживает первенство в социали-зации индивидов. В современном Израиле дети в кибуцах (кооперативных фермах) воспитываются в общих коттеджах и находятся под присмотром специальных воспитателœей, в то время как их матери выполняют различные работы в тех же кибуцах. Родители обычно проводят с детьми около двух часов в день и весь день в субботу. По мнению некоторых обозревателœей, такое воспитание проходит успешно, хотя у него существует много противников. Правда, так воспитывается лишь незначительное число детей Израиля. Эти редкие исключения, пожалуй, только подчеркивают первосте-пенное значение семьи для социализации детей. Семья для ребенка является первичной группой, именно с нее начинается развитие личности. Несмотря на появление позднее других первичных групп, у личности всœегда остаются привитые в раннем детстве основные образцы поведения. Главным способом семейной социализации является копирование детьми моделœей поведения взрослых членов семьи. Трудности социализации возникают в том случае, если ребенок ориентируется на неудачные образцы поведения родителœей, которые приходят в противоречие с тем, что ребенок видит в других семьях. При этом часто возникает неудовлетворенность действиями матери или отца, и ребенок начинает искать у других личностей, в других первичных группах приемлемые модели поведения».

Эмоциональная функция состоит в удовлетворении потребности человека в интимном общении. «Психиатры считают, что основной причиной эмоциональных и поведен-ческих трудностей в общении и даже физических болезней является отсутствие любви, тепла и полноценного интимного общения в первич-ной группе, и прежде всœего в семье. Огромное количество данных свидетельствует о том, что серьезные преступления и другие негативные отклонения намного чаще происходят у тех, кто в детстве был лишен заботы в семье, что дети, воспитанные в детских домах без любви матери и отца, гораздо в большей степени подвержены заболеваниям, психическим расстройствам, повышенной смертности, отклоня-ющемуся поведению. Доказано; что потребность людей в близком доверительном общении, интимности, эмоциональном выражении чувств близким людям является жизненно необходимым элементом существования. Благодаря своей структуре и качествам, семья служит самым важным источником эмоционального удовлетворения. Отношения родства и супружества предоставляют людям такую возможность».

Статусная функция состоит в том, что каждый человек, воспитанный в семье, получает в качестве наследия некоторые статусы, близкие к статусам членов его семьи. «Это прежде всœего относится к таким важным для личности статусам, как национальность, место в городской или сельской культуре и др. В классовых обществах принадлежность семьи к определœенному социальному слою предоставляет ребенку возможности и вознаграждения, характерные для этого слоя, и в подавляющем большинстве случаев определяют его дальнейшую жизнь. Конечно, классовый статус может изменяться благодаря усилиям человека и благоприятным обстоятельствам, но начало будущего нужно искать в семье этого человека. Семья обязательно должна осуществлять ролевую подготовку ребенка к статусам, близким к статусам его родителœей и родственников, прививая ему соответствующие интересы, ценности и образ жизни».

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

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

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

Весьма разнообразны формы семьи как малой группы.

По этапам жизненного цикла различают молодую (до 10 лет семейного стажа) и зрелую семью.

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

В современном урбанизированном обществе основным типом семьи стали нуклеарные семьи, состоящие из двух поколений- родители, дети. Нуклеарная семья принято называть репродуктивной (если в ней остались несовершеннолетние дети) или ориентационной (вышли взрослые дети и создали свои репродуктивные семьи). Репродуктивная семья классифицируется по наличию детей: детная, бездетная и семейный детский дом. В свою очередь детная семья бывает 1детной, 2хдетной и многодетной.Иногда нуклеарные семьи называют супружескими.Но нуклеарная семья может быть и без одного из супругов (неполная отцовская или неполная материнская семья). В неполной материнской семье различают семью одинокой матери (когда ребенок рожден вне брака), семью матери-одиночки (когда ребенок рожден в браке) и семью солдата срочной службы. Расширенная семья состоит из ряда супружеских пар (тесть-тёща, свёкор-свекровь, братья-сёстры, их супруги-дети). Это кровнородственные семьи. Полная расширенная семья - это когда никто из мужчин разных поколений не покидает пределы большой семьи. Такие семьи характерны для Китая.

Расширенная или родственная семья основывается не только на супружеских отношениях двух людей, но и на кровном родстве большого числа родственников. Значение нуклеарной и родственной семей для общества неодинаково. Так, хотя в нашем обществе существует родственная семья для семейных сборов, торжеств и других церемониальных целœей, важнейшие социальные функции выполняются нуклеарной семьей. Это выражается во многих элементах культуры, к примеру когда законы и нравственные нормы требуют, чтобы родители поддерживали своих детей, но ничего не говорят об обязанностях по отношению к братьям или сестрам, дядям или тетям.

В случае если нуклеарная семья имеет в основе супружескую пару, то основой родственной семьи являются братья и сестры в окружении их мужей, жен и детей. В большинстве родственных семей женатый мужчина (или замужняя женщина) в первую очередь остается привязанным к родительской семье и наполовину входит в семью жены (или мужа). Это имеет важные последствия. Человек в основном связан обязательствами и ответственностью с той семьей, в которой он родился, но не с той, с которой он связан узами брака. Так, женщина может не зависеть от своего мужа, но полностью быть в зависимости от своих братьев и сестер в делœе защиты и воспитания детей.

В расширенных семьях ответственность и забота распределяются среди достаточно большого числа членов семьи. Создается ситуация, когда ребенок тесно связан не только с родителями, но и со своими дядями и тетями. Он окружен взрослыми, которые в некоторых случаях готовы взять на себя обязанности родителœей. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, у ребенка в родственной семье появляется большая возможность для общения и социализации к большему числу ролей. Такая семья хорошо защищает ребенка от любых жизненных невзгод. В случае смерти матери или ухода ее из семьи ее роль в известной степени могут играть родственники.

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

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

Метод Хаффмана является простым, но эффективным только в том случае, когда вероятности появления символов равны числам , где - любое целое положительное число. Это связано с тем, что код Хаффмана присваивает каждому символу алфавита код с целым числом бит. Вместе с тем в теории информации известно, что, к примеру, при вероятности появления символа равной 0,4, ему в идеале следует поставить код длиной бит. Понятно, что при построении кодов Хаффмана нельзя задать длину кода в 1,32 бита͵ а только лишь в 1 или 2 бита͵ что приведет в результате к ухудшению сжатия данных. Арифметическое кодирование решает эту проблему путем присвоения кода всœему, обычно, большому передаваемому файлу вместо кодирования отдельных символов.

Идею арифметического кодирования лучше всœего рассмотреть на простом примере. Предположим, что крайне важно закодировать три символа входного потока, для определœенности - ϶ᴛᴏ строка SWISS_MISS с заданными частотами появления символов: S – 0,5, W – 0,1, I – 0,2, M – 0,1 и _ - 0,1. В арифметическом кодере каждый символ представляется интервалом в диапазоне чисел ), а интервал для /-го кодируемого символа потока как ; Ь[с]), включающий 0.341. Перебором всех возможных символов по приведенной выше таблице находим, что только интервал -(fti-j - li-i); hi = li.! + b ■ {hi.! - li.i); if {{l t <= value) && (value < hi)) break; }; DataFile.WriteSymbol(c^) ;

где value - прочитанное из потока число (дробь), а с - записываемые в вы­ходной поток распаковываемые символы. При использовании алфавита из 256 символов Cj внутренний цикл выполняется достаточно долго, однако его можно ускорить. Заметим, что поскольку Ь[с^ {\=a; II delitel=10

First_qtr - (h 0 +l)/4; // - 16384

Half = First_qtr*2; // - 32768

Third_qtr - First_qtr*3;// = 49152

bits_to_follow =0; // Сколько битов сбрасывать

while (not DataFile.EOFO) {

с = DataFile.ReadSymbol(); // Читаем символ
j = IndexForSymbol(с); i++; // Находим его индекс
li = li.j + b*{h i . 1 - li-x + l)/delitel;
hi = li.! + b ;
First_qtr = (h 0 +l)/4; // = 16384

Half = First_qtr*2; // = 32768

Third_qtr = First_qtr*3; // = 49152

value=CompressedFile.Readl6Bit();

for(i=l; i< CompressedFile.DataLengthO; i++){

freq=((value-2 i . 1 +l)*delitel-l)/(h i . I - 1 ± . х + 1) ;

for(j=l; b<=freq; j++); // Поиск символа

li = 1ы + blj-l]*{bi.! - li- u + l)/delitel;

hi = Im + b*{h i . 1 - li.! + l)/delitel - 1;

for(;;) { // Обрабатываем варианты

if (hi < Half) // переполнения

; // Ничего else ifdi >= Half) {

2i-= Half; hi-= Half; value-= Half; }

else if (di >= First_qtr)&& (hi < Third_qtr)) { 2i-= First_qtr; hi-= First_qtr; value-= First_qtr,-} else break; 2i+=2 i; hi+= hi+1;

value+=value+CompressedFile.ReadBit(); } DataFile.WriteSymbol(c););

Упражнение. Предложите примеры последовательностей, сжимаемых алго­ритмом с максимальным и минимальным коэффициентом.

Как видно, с неточностями арифметики мы боремся, выполняя отдель­ные операции над /, и А, синхронно в компрессоре и декомпрессоре.

Незначительные потери точности (доли процента при достаточно боль­шом файле) и, соответственно, уменьшение степени сжатия по сравнению с идеальным алгоритмом происходят во время операции деления, при округ­лении относительных частот до целого, при записи последних битов в файл. Алгоритм можно ускорить, если представлять относительные частоты так, чтобы делитель был степенью двойки (т. е. заменить деление операцией по­битового сдвига).

Для того чтобы оценить степень сжатия арифметическим алгоритмом конкретной строки, нужно найти минимальное число N, такое, чтобы длина рабочего интервала при сжатии последнего символа цепочки была бы меньше 1/2^.. Этот критерий означает, что внутри нашего интервала заведо­мо найдется хотя бы одно число, в двоичном представлении которого после N-ro знака будут только 0. Длину же интервала, дорчитать просто, поскольку она равна произведению вероятностей всех символов.

Рассмотрим приводившийся ранее пример строки из двух символов л и Ъ с вероятностями 253/256 и 3/256. Длина последнего рабочего интервала для цепочки из 256 символов а и Ь с указанными вероятностями равн. Легко подсчитать, что искомое N=24 (1/2 24 = 5.96-10" 8), поскольку 23 дает слишком большой интервал (в 2 раза шире), а 25 не является минимальным числом, удовлетворяющим критерию. Выше было показано, что алгоритм Хаффмана кодирует данную цепочку в 256 бит. То есть для рассмотренного примера арифметический алгоритм дает десятикратное преимущество, пе­ред алгоритмом Хаффмана и требует менее 0.1 бита на символ.

Упражнение. Подсчитайте оценку степени сжатия для строки "КОВ.КОРОБА".

Следует сказать пару слов об адаптивном алгоритме арифметического сжатия. Его идея заключается в том, чтобы перестраивать таблицу вероят­ностей b[f] по ходу упаковки и распаковки непосредственно при получении очередного символа. Такой алгоритм не требует сохранения значений веро­ятностей символов в выходной файл и, как правило, дает большую степень сжатия. Так, например, файл вида а 1000 £ 1000 с 1000 б/ 1000 (где степень означает число повторов данного символа) адаптивный алгоритм сможет сжать, эф­фективнее, чем потратив 2 бита на символ. Приведенный выше алгоритм достаточно просто превращается в адаптивный. Ранее мы сохраняли табли­цу диапазонов в файл, а теперь мы считаем прямо по ходу работы компрес­сора и декомпрессора, пересчитываем относительные частоты, корректируя в соответствии с ними таблицу диапазонов. Важно, чтобы изменения в таб­лице происходили в компрессоре и декомпрессоре синхронно, т. е., напри­мер, после кодирования цепочки длины 100 таблица диапазонов должна быть точно такой же, как и после декодирования цепочки длины 100. Это условие легко выполнить, если изменять таблицу после кодирования и де­кодирования очередного символа. Подробнее об адаптивных алгоритмах смотрите в гл. 4.

Характеристики арифметического алгоритма:

Лучшая и худшая степень сжатия: лучшая > 8 (возможно кодирование менее бита на символ), худшая - 1.

Плюсы алгоритма: обеспечивает лучшую степень сжатия, чем алго-I ритм Хаффмана (на типичных данных на 1-10%).

Характерные особенности: так же как кодирование по Хаффману, не увеличивает размера исходных данных в худшем случае.

Интервальное кодирование

В отличие от классического алгоритма, интервальное кодирование пред­полагает, что мы имеем дело с целыми дискретными величинами, которые могут принимать ограниченное число значений. Как уже было отмечено, начальный интервал в целочисленной арифметике записывается в виде [ОД) или , где N- число возможных значений переменной, используемой для хранения границ интервала.

Чтобы наиболее эффективно сжать данные, мы должны закодировать каждый символ s посредством -log 2 (Ј) бит, где f, - частота символа s. Ко­нечно, на практике такая точность недостижима, но мы можем для каждого символа s отвести в интервале диапазон значений , Prev_freq[c], 10) ;

Результат

Нормализация

Нормализация

Нормализация

Как уже было отмечено, чаще всего при нормализации не происходит переноса. Исходя из этого, Дмитрий Субботин 1 предложил отказаться от переноса вовсе. Оказалось, что потери в сжатии совсем незначительны, по­рядка нескольких байтов. Впрочем, выигрыш по скорости тоже оказался не очень заметен. Главное достоинство такого подхода - в простоте и ком­пактности кода. Вот как выглядит функция нормализации для 32-разрядной арифметики:

♦define CODEBITS 24

♦define TOP (l«CODEBITS)

♦define BOTTOM (TOP»8)

♦define BIGBYTE (0xFF«(CODEBITS-8))

void encode_normalize(void) { while(range < BOTTOM) {

if(low & BIGBYTE == BIGBYTE &&

range + (low & BOTTOM-1) >= BOTTOM) range = BOTTOM - (low & BOTTOM-1); output_byte (low»24) ; range<<=8; low«=8; })

Можно заметить, что избежать переноса нам позволяет своевременное принудительное уменьшение значения размера интервала. Оно происходит

тогда, когда второй по старшинству байт low принимает значение OxFF, а при добавлении к low значения размера интервала range возникает пере­нос. Так выглядит оптимизированная процедура нормализации:

void encode_normalize(void) { while((low " low+range)} }

void decode_normalize(void) { while((low л low+range) }

Упражнение. Применить интервальное кодирование без переноса для строки "ков.корова".

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

Алгоритм кодирования Хаффмена, в лучшем случае, не может передавать на каждый символ сообщения менее одного бита информации. Предположим, известно, что в сообщении, состоящем из нулей и единиц, единицы встречаются в 10 раз чаще нулей. При кодировании методом Хаффмена и на 0 и на 1 придется тратить не менее одного бита. Но энтропия д.с.в., генерирующей такие сообщения 0.469 бит /сим. Неблочный метод Хаффмена дает для минимального среднего количества бит на один символ сообщения значение 1 бит . Хотелось бы иметь такую схему кодирования, которая позволяла бы кодировать некоторые символы менее чем одним битом. Одной из лучших среди таких схем является арифметическое кодирование , разработанное в 70-х годах XX века.

По исходному распределению вероятностей для выбранной для кодирования д.с.в. строится таблица , состоящая из пересекающихся только в граничных точках отрезков для каждого из значений этой д.с.в.; объединение этих отрезков должно образовывать отрезок , а их длины должны быть пропорциональны вероятностям соответствующих значений д.с.в. Алгоритм кодирования заключается в построении отрезка, однозначно определяющего данную последовательность значений д.с.в. Затем для построенного отрезка находится число, принадлежащее его внутренней части и равное целому числу, деленному на минимально возможную положительную целую степень двойки. Это число и будет кодом для рассматриваемой последовательности. Все возможные конкретные коды - это числа строго большие нуля и строго меньшие одного, поэтому можно отбрасывать лидирующий ноль и десятичную точку, но нужен еще один специальный код-маркер, сигнализирующий о конце сообщения. Отрезки строятся так. Если имеется отрезок для сообщения длины , то для построения отрезка для сообщения длины , разбиваем его на столько же частей, сколько значений имеет рассматриваемая д.с.в. Это разбиение делается совершенно также как и самое первое (с сохранением порядка). Затем выбирается из полученных отрезков тот, который соответствует заданной конкретной последовательности длины .

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

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

Пример арифметического кодирования. Пусть д.с.в. может принимать только два значения 0 и 1 с вероятностями 2/3 и 1/3 соответственно. Сопоставим значению 0 отрезок , а 1 - . Тогда для д.с.в. ,

таблица построения кодов -

Среднее количество бит на единицу сообщения для арифметического кодирования получилось меньше, чем энтропия . Это связано с тем, что в рассмотренной простейшей схеме кодирования, не описан код-маркер конца сообщения, введение которого неминуемо сделает это среднее количество бит большим энтропии.

Получение исходного сообщения из его арифметического кода происходит по следующему алгоритму.

Шаг 1 . В таблице для кодирования значений д.с.в. определяется интервал , содержащий текущий код, - по этому интервалу однозначно определяется один символ исходного сообщения. Если этот символ - это маркер конца сообщения, то конец.

Шаг 2 . Из текущего кода вычитается нижняя граница содержащего его интервала, полученная разность делится на длину этого же интервала. Полученное число считается новым текущим значением кода. Переход к шагу 1.

Рассмотрим, например, распаковку сообщения 111. Этому сообщению соответствует число , что означает, что первый знак декодируемого сообщения - это 1. Далее от 7/8 вычитается 2/3 и результат делится на 1/3, что дает , что означает, что следующий знак - 0. Теперь, вычислив , получим следующий знак - 1, т.е. все исходное сообщение 101 декодировано. Однако, из-за того, что условие остановки не определенно, алгоритм декодирования здесь не остановится и получит "следующий символ" 1 и т.д.

Упражнение 20 Вычислить среднее количество бит на единицу сжатого сообщения о значении каждой из д.с.в., из заданных следующими распределениями вероятностей, при сжатии методами Шеннона-Фэно, Хаффмена и арифметическим. Арифметический код здесь и в следующих упражнениях составлять, располагая значения д.с.в. в заданном порядке слева-направо вдоль отрезка от 0 до 1.

Упражнение 21 Вычислить длины кодов Хаффмена и арифметического для сообщения AAB, полученного от д.с.в. со следующим распределением вероятностей , .

Упражнение 22 Декодировать арифметический код 011 для последовательности значений д.с.в. из предыдущего упражнения. Остановиться, после декодирования третьего символа.

Упражнение 23 Составить арифметический код для сообщения BAABC , полученного от д.с.в. со следующим распределением вероятностей , , . Каков будет арифметический код для этого же сообщения, если распределена по закону , ,

Упражнение 25 Составить коды Хаффмена, блочный Хаффмена (для блоков длины 2 и 3) и арифметический для сообщения ABAAAB , вычислить их длины. Приблизительный закон распределения вероятностей д.с.в., сгенерировавшей сообщение, определить анализом сообщения.

Арифметическое кодирование

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

Текст, сжатый арифметическим кодером, рассматривается как некоторая двоичная дробь из интервала }