Re: для Vadima


Сайт о сжатии >> Форум #Компрессор# >> [Ответить] [Ответы]

Автор: Vadim,
16 мая 2003 года в 12:09:12

В ответ на : для Vadima от alex в 16 мая 2003 года в 04:20:11:


> В примере вроде 16 разрядов, а не 15.
> hi = 28671- 0110111111111111 – здесь 16 нулей и единиц.
> low = 24576 – 0110000000000000 – и здесь16 нулей и единиц.
> Во первых. Объясните, пожалуйста, где искать совпавшую цифру,

Внесем ясность.

На самом деле, искать совпавшую цифру тоже не всегда помогает. Например, представьте такой интервал:
low = 0111111111111111
hi = 1000000000000000
У этих hi и low туго с совпадающими цифрами. А интервал такой, что мы можем закодировать только единичную вероятность ;-) Т.е. совершенно непригодный для нормального использования. Что делать?

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

Для выявления вот этого самого переноса зачастую и резервируют самый старший бит. Как только в старшем разряде hi появилась '1', совершаем перенос. А на выход всегда подаем второй разряд из low.

> Как я понимаю процесс кодирования можно разделить на подварианта.
> 1-й. Это когда интервал достаточно широкий, то нужно

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

>просто совпавшие цифры в
> старших разрядах подать в код сообщения, сдвинуть регистр влево и дописать
> в границы один и ноль.

Процесс, который вы описали в этом абзаце, и называется нормализацией. Он применяется тогда, когда интервал оказался недостаточно широким.

> 2-вариант. Интервал узкий. 1-й вариант не проходит. Нужно применять
> так называемую нормализацию.

Совершенно точно.

>Она заключается в том, что нужно не трогая старшие
> разряды, удалить вторые по старшинству разряды, записать в специальный счетчик 1.

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

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

Т.е. процесс записи на выход будет выглядеть так:
- когда хотим записать 1, вместо этого инкрементируем счетчик единиц,
- когда хотим записать 0, пишем на выход предыдущий отложенный нолик и то число единиц, который помнит счетчик, затем сбрасываем счетчик в ноль,
- если надо выполнить перенос, пишем на выход 1 вместо отложенного нуля и нули в количестве, указанном в счетчике. Содержимое счетчика, соответственно, чикаем.

Однако, у меня появилось ощущение дежа-вю :). Сдается, я уже описывал это в книге, про которую сайт.

> Пока все. Спасибо. Буду лучше по частям спрашивать. А то
> нагромождение вопросов действительно непонятно.

Лучше сразу спрашивайте. Все-таки я сюда заглядываю часто, но нерегулярно :).
А еще лучше, почитайте книгу - там все это детально расписано.

Ответы:



Ответить на это сообщение

Тема:

Имя (желательно полное):

E-Mail:

URL:

Город:

Страна:

Вежливый и подробный комментарий:
(Форматируйте его, пожалуйста, как почту - короткими строками
Еnter в конце строки, пустая строка между параграфами).

Пожалуйста, заполните все поля.
И не нажимайте по два раза на кнопку! Дождитесь ответа сервера.