Предыдущий блок Следующий блок Вернуться в индекс
 RU.COMPRESS 
 From : Maxime Zakharov                     2:5020/400      24 Dec 98  11:30:11
 To   : All
 Subj : Re: Universal codes

From: Maxime Zakharov <mbb@sochi.ru>
Leonid Broukhis wrote:
> >какой код будет оптимален, если распределение частот символов неизвестно.
>
> _Можно_ использовать хоть унарный код, но речь идет о коде, оптимальном
> в среднем.
  оптимальном в среднем чего ? С ходу могу предложить две альтернативы:
- оптимален по средней длине символа
- оптимален по среднему отклонению ср.длины от ср.длины кода,
строящегося в случае известных вероятностей для данного количества
символов.
> У Кричевского он описан так, что я не понял, как же строить
> собственно кодовые слова.
  А как он описан у Кричевского ?
--
=+=
Maxim Zakharov                http://www.tnet.sochi.ru/~maxime/
Sochi, Russia
--- ifmail v.2.14dev2
 * Origin: Mosbusinessbank, Sochi branch (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Alexey Lepinin                      2:5020/238      25 Dec 98  05:16:55
 To   : All
 Subj : Haffman algorithm

Привет All !
никто не мог бы объяснить "на пальцах"
алгоритм сжатия Хаффмана ?
Конкретно:
Как строится дерево ?
Что такое узлы, ноды(?) дерева ?
Как просчитывается вероятность появления символа ?
Каким образом происходит процесс сжатия ?
Или киньте хорошую доку по деревьям, Хаффману, please.
Заранее благодарен.
... my first tagline
--- Blue Wave v2.12 [NR]
 * Origin: InfoScience BBS - USER's MESSAGE * (2:5020/238)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      25 Dec 98  10:31:54
 To   : Maxime Zakharov
 Subj : Re: Universal codes

From: leob@asylum.mailcom.com (Leonid Broukhis)
Maxime Zakharov wrote:
>> >какой код будет оптимален, если распределение частот символов неизвестно.
>> _Можно_ использовать хоть унарный код, но речь идет о коде, оптимальном
>> в среднем.
>
>оптимальном в среднем чего ? С ходу могу предложить две альтернативы:
>- оптимален по средней длине символа
>- оптимален по среднему отклонению ср.длины от ср.длины кода,
>строящегося в случае известных вероятностей для данного количества
>символов.
Код, оптимальный в среднем - это такой, избыточность которого
равна
inf/мн-во кодов (sup/мн-во источников (избыточность кода на источнике) )
Где избыточность кода на источнике равна (k - кол-во символов в алфавите A,
fi - длина кода для Ai)
sum/i=1..k ( p(Ai)(log p(Ai) + fi) )
>> У Кричевского он описан так, что я не понял, как же строить
>> собственно кодовые слова.
>
>  А как он описан у Кричевского ?
Приведена формула длин, и доказано, что в ней достигается минимакс.
Теха у меня нет, и я им пользоваться не умею, так что увы.
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Maxime Zakharov                     2:5020/400      25 Dec 98  12:57:38
 To   : All
 Subj : Re: Universal codes

From: Maxime Zakharov <mbb@sochi.ru>
Leonid Broukhis wrote:
> Приведена формула длин, и доказано, что в ней достигается минимакс.
> Теха у меня нет, и я им пользоваться не умею, так что увы.
  А отсканить и на страничку положить (хотя бы на время) ?
--
=+=
Maxim Zakharov                http://www.tnet.sochi.ru/~maxime/
Sochi, Russia
--- ifmail v.2.14dev2
 * Origin: Mosbusinessbank, Sochi branch (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Maxime Zakharov                     2:5065/10.12    25 Dec 98  20:09:47
 To   : Alexander Volok
 Subj : Universal codes

Hello Alexander,
Tuesday December 22 1998 20:27, Alexander Volok wrote to Maxime Zakharov:
 AV> "золотому сечению" (sqrt(5)-1)/2 = 0.61803398875...
 AV> а еще была замечательнвая формула, выражающая числа Фибоначчи как
 AV> функцию номера и отношения золотого сечения.
    F(n) = (phi^n - (1 - phi)^n)/sqrt(5)
Или
    F(n) = {phi^n/sqrt(5), окpyгленное до ближайшего целого}
phi - обозначает золотое сечение.
                                                       Maxime Zakharov.
---
 * Origin: http://www.tnet.sochi.ru/~maxime/ (2:5065/10.12)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/26       25 Dec 98  23:49:07
 To   : Serg Kabanov
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

* Crossposted in RU.COMPRESS
Hello Serg!
Thursday December 24 1998, Serg Kabanov writes to Vadim Yoockin:
 SK>>> Поясни пожалуйста, что ты подразумеваешь под квадратиками?
 VY>> Которые отслеживают корреляцию между длинами и расстояниями.
 VY>> Т.е. диапазон на диапазон.
 SK>     Ты имеешь ввиду, что совпадения определенной длины не могут быть
 SK> дальше кокого-то заранее определенного расстояния? Если это, то их
 SK> есть у меня.
  Ох. В zip 256+32 кода сиволов и длин и еще 32 кода для расстояний. Теперь
представь, что ты используешь вместо этого только одну таблицу с 256+32*32
элементами. Это позволяет точно отслеживать корреляцию длины и расстояния и
откидывать ненужные нам комбинации длина/расстояние, но увеличивает размер
словаря. Так вот, так сделано в cabarc и жмет он неплохо. Я (и не только я)
получили только ухудшение степени сжатия при таком подходе.
 VY>>>> Все равно странно.
 SK>>> А почему? Ведь я говорил про эффект на текстах.
 VY>> Трешки и четверки жалко ;) Конечно, на больших текстах ими
 VY>> можно и пренебречь. Hо все же лучше и их отловить.
 SK>     Я тут попробовал хэширование 2&5+(2-256,3-1К,4-4К). Сжатие текстов
 SK> не изменилось, а вот экзешников очень улучшилось. Все-таки с ними без
 SK> двоек и троек нельзя.
 Попробуй еще макс. дистанции увеличить, скажем до rar'овского уровня ;)
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
 * Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/26       25 Dec 98  23:58:50
 To   : Leonid Broukhis
 Subj : Universal codes

* Crossposted in RU.COMPRESS
Hello Leonid!
Thursday December 24 1998, Leonid Broukhis writes to Bulat Ziganshin:
 >> фиксированному (после фиксации N) распределению частот. Ты как раз
 >> спрашивал (или не ты) - какой код будет оптимален, если
 >> распределение частот символов неизвестно. Ответ: вопрос поставлен
 >> некорректно, можно использовать любой код с равномерным убываением
 >> частот, в частности и код Фиббоначи.
 LB> _Можно_ использовать хоть унарный код, но речь идет о коде,
 LB> оптимальном в среднем.
  В каком среднем? Если вы с Кричевским строите какую-то конкретную модель
этого среднего, то ее надо назвать, а абстрактного среднего не существует.
 LB> У Кричевского он описан так, что я не понял,
 LB> как же строить собственно кодовые слова.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
 * Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      26 Dec 98  06:30:36
 To   : Maxime Zakharov
 Subj : Re: Universal codes

From: leob@asylum.mailcom.com (Leonid Broukhis)
Maxime Zakharov wrote:
>  А отсканить и на страничку положить (хотя бы на время) ?
www.mailcom.com/images/p69.gif
          p7071.gif
          p72.gif
          p73.koi
Содержимое файла p73.koi таково:
-----
да как при использовании определителя, построенного согласно утверждению
3.4, это число уменьшается до 146x1+69x2+5x4+6x4=328.
-----
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/1042.50  26 Dec 98  12:55:26
 To   : Leonid Broukhis
 Subj : Re: cabarc

Пpиветствую, Leonid!
Пришлось письмо тащить из i-net'a, поэтому ссылка немного
не та ;)
20 Dec 98, Leonid Broukhis писал к Vadim Yoockin:
>> LB> Чем больше блок, тем больше вероятность мусора внутри
>> LB> последовательностей одинаковых символов, получившихся после BWT, на
>> LB> любом типе файла, кроме текста на естественном языке.
>>Hа самом деле список файлов, любящих большой блок BWT, заметно шире.
>>Это любой поток со стабильными контекстами. Даже если в начале файла
>LB>  Hапример, какой?
>Hапример? Hекоторые вордовые файлы.
LB> "Hекоторые вордовые файлы" не намного лучше, чем "некоторые файлы".
Мне казалось, я уже описал критерии отбора таких "некоторых" файлов.
Представь файл, в котором одна половина - это английский (например)
текст, другая - служебная информация, описывающая представление
этой информации на экране/принтере. Hебольшие отклонения не страшны.
Главное - чтобы контексты из второй части не сильно коррелировались
с контекстами из первой и внутри кадой половины были более-менее
стабильны.
Конечно, могу прислать такой файл, если хочешь.
>>у нас сплошняком идут, к примеру, 'abcd', а в конце - в основном 'efgh'.
>>Главное, чтобы не появились 'abcx', 'abcy', 'abcz'.
>LB> корова, коровы, корове, корову, коровой, ...
>Привык я к своему reverse BWT. Хорошо, пусть будет 'xbcd', 'ybcd',
>'zbcd'.
>Мог бы и сам догадаться ;)
LB> ход, заход, обход, вход, подход, переход, проход, исход,
LB> отход, уход...
LB> Тебе мало?
Этого вполне достаточно.
Лео, мы избежали бы такой непродуктивной дискуссии, если бы ты не
поленился и сам попробовал поэкспериментировать со сжатием
неоднородных файлов.
Хорошо, пусть у нас в первой половине файлов есть слова
"заход" и "обход". Во второй - "вход" и 'подход" (после
данных слов я написал наобум разные буквы). Затем отсортировал.
Второй случай - когда во второй половине идут слова
"вбег" и "подбег".
   ход А  под            бег А  под
   ход В   об            бег Д    в
   ход Д    в            бег Л  под
   ход Ж   за            бег П    в
   ход Л  под            бег Ф    в
   ход О   об            бег Я  под
   ход П    в            ход В   об
   ход Р   за            ход Ж   за
   ход Ф    в            ход О   об
   ход Ы   за            ход Р   за
   ход Э   об            ход Ы   за
   ход Я  под            ход Э   об
Последние столбцы выглядят так:
   дбвадбвавабд          двдввдбабааб
Вполне отдаю себе отчет, что в других строках матрицы
отсортированных перестановок у нас будет раздельно
"од...х", "ег...б" и др. Так вот. Перемешивание
контекстов в первом случае обычно ухудшает дожатие
сильнее.
Почему эти контексты должны быть в разных частях файлов,
я думаю, ты сам догадаешься. Или тоже объяснить? ;)
>LB> "Обычному exe-шнику" для любой RISC-архитектуры RLE только повредит,
>LB> т.к. испортит регулярность.
>А не надо применять такой RLE, который портит регулярность.
LB> Откуда бы этот RLE знал, чему кратна эта регулярность?
Ему не нужно знать, чему равна регулярность. Ему не надо
портить HИКАКУЮ регулярность. Естественно, я говорю не
про RLE, обрабатывающий повтор из однаковых символов, который
сейчас ни один из известных мне последних BWT не использует на
первой фазе.
  Всего доброго. Vadim Yoockin
... 2.000.000 Lemmings can't be wrong.
--- Стаpый Дед стоимостью 3.00.Alpha4 доплата в СКВ UNREG
 * Origin: yoockinv@mtu-net.ru (2:5020/1042.50)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/61       26 Dec 98  16:26:19
 To   : Serg Kabanov
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

*** Answering a msg posted in area CARBON_COPIES (CARBON_COPIES).
* Crossposted in RU.COMPRESS
Hello Serg!
Thursday December 24 1998, Serg Kabanov writes to Bulat Ziganshin:
 SK>>> Теперь понял. Вот оно в чем дело. А сколько слов в этом
 SK>>> словаре?
 BZ>> Слов - не знаю, кил 50 всего. В запущенном jar16 этот словарь
 BZ>> нетрудно найти.
 SK>     Если в словаре 50К слов, то значит самих слов - тыщ 10 наверное. Ето
 SK> никаких символов служебных не хватит, если их нумеровать 256,257...
 SK>     Я попробовал сделать что-то подобное. Если длина совпадения <= длине
 SK> найденного в словаре слова, то в выходной поток вылетает 256+(номер слова
 SK> в словаре). Hо такая замена к сколь-нибудь значительному успеху ни
 SK> привела.    Мне пришла мысль, что jar перед помещением очередной порции
 SK> данных в окно делает какбы  препроцессинг, и потом уже сжимает обычным
 SK> путем то, что осталось от исходного текста с вкраплениями служебных(256+)
 SK> символов. Hо так возрастает расходы на память, так как надо данных в окне
 SK> хранить в не в чарах, а в шортах + надо время на препроцессинг. Как у него
 SK> на самом деле, не знаешь?    А кто еще такой словарь использует?
 SK> Вообще-то такой словарь кажется мне нечестной борьбой, но чего не
 SK> отдашь за пару процентов? ;))
1. Такого словаря больше нигде нет. Будешь вторым :)
2. В jar используется huffman engine от yac, который способен хорошо сжимать
short'ы. Если ты посмотришь на доку от yac, то увидишь, что он хвастался
хорошим сжатием wmf'ов. Янг просто нашел этому энжину гораздо более полезное
применение. При этом степень сжатия обычных файлов никак не страдает, разве что
расход памяти на N увеличивается. Hу и время работы, на распаковке, например,
это достаточно заметно.
3. Можно и при 8-битном Хафмане такое делать, какие проблемы.
 BZ>> А что касается хеширования - в rar используется 2 хеша, один только
 BZ>> для 2х-буквенных слов, другой - для 3+. При этом в первом хеше нет
 BZ>> массива next,
 SK>     Я сделал аналогично 2и5+. Мне понравилось. Сначала ищем по пятерке и
 SK> при неудаче по двойке. Удается даже четверки отлавливать, но немного.
 BZ>> просто используется хеш-таблица с большой избыточночтью (при макс.
 BZ>> дистанции 256 ее размер - 4096).
  Поскольку строки длины 3+ все равно есть во втором хеше, нас интересует
только последнее появление каждой двухбайтовой строки. При этом макс.
дистанция, на которой мы будем использовать эти строки - 256, поэтому в этом
массиве достаточно хранить младший байт адреса и разумеется делать проверку -
"действительно ли там найдется такая строка?" И, наконец, эти 2 байта
хешируются в 12 бит. Поскольку нас интересуют только чтоб не потерялось 256
последних ссылок, таблицы таких размеров оказывается вполне достаточно. Уфф...
Остальное смотри в самой программе.
 SK>     Hе понял, как это? У меня размер 64К*2, где элемент (абсолютный
 SK> индекс
 SK> в окне последней двойки с данным хэшем)%64К. Hо если не нужны тройки
 SK> и четверки, то будет 64К*1, но чтобы 4096, не понимаю.
  то же самое, только хеш 12-битный.
 BZ>> Эта идея легко переносится дальше, при макс. дистанции для
 BZ>> 3х-буквенных слов в 4-8 кб, хеша в 128 кил им будет за глаза, а
 BZ>> памяти это займет всего полмега (или 256 кил).
 SK>     А почему не 64К*2? Имеется ввиду элемент массива есть (абс.индекс в
 SK> окне последней тройки с данным хэшем)%64К. Это если конечно нет next.
  64k*2, 128k*2 - какая разница-то?
 BZ>> Можно еще сделать так, чтобы хеш-функция для 3х-буквенных строк
 BZ>> была промежуточным результатом при вычислении хеш-функции
 BZ>> 4х-буквенных строк. Скорость работы при этом на текстовых файлах, со
 BZ>> словарем 1 мег возрастет в 1.5-2 раза,
 SK>     Hеужели оптимизация вычисления хэшкода может поднять скорость так
 SK> намного? ИМХО это операция отнимает <=~~5% всего времени. Или я где-то не
 SK> догнал? Объясни пожалуйста.
  Я имел в виду выигрыш от перехода 3->3+4. А возможность пользоваться
промежуточными результатами и процента не даст; главные тормоза - по памяти
бегать.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
---
 * Origin: У этой машины нет проблем с глюками! (2:5093/61)


 RU.COMPRESS 
 From : maxime@tnet.sochi.net               2:5020/400      26 Dec 98  17:34:15
 To   : All
 Subj : Re: Universal codes

From: maxime@tnet.sochi.net
Leonid Broukhis wrote:
> www.mailcom.com/images/p69.gif
>                        p7071.gif
>                        p72.gif
>                        p73.koi
>
> Содержимое файла p73.koi таково:
>
> -----
> да как при использовании определителя, построенного согласно утверждению
> 3.4, это число уменьшается до 146x1+69x2+5x4+6x4=328.
> -----
  Спасибо. Уже выкачал.
Код строится слудующим образом:
1. Вычисляется константа C:
  C = log sum_по_i_от_1_до_k ( 1/i * (1 - 1/i)^(i-1) )
  при k стремещемся к бесконечности, C = log(1 + log k) + 1
2. Для вспомогательного источника положим вероятности появления символов
равные
  p(i) = 2^(-C) * (i-1)^(i-1)/i^i
3. Строим префиксный код для вспомогательного источника.
Используя метод Хаффмана для k=9 у меня получился следующий код:
0, 100, 110, 1010, 1110, 10110, 10111, 11110, 11111
Т.е. по длинам кодовых слов совпадает с приведенным тобой.
--
Maxim Zakharov         http://www.tnet.sochi.ru/~maxime/
Sochi, Russia
--- ifmail v.2.14dev2
 * Origin: Posted via Technology Communication Center news (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      26 Dec 98  23:48:14
 To   : Bulat Ziganshin
 Subj : Re: Universal codes

From: leob@asylum.mailcom.com (Leonid Broukhis)
Bulat Ziganshin wrote:
> LB> _Можно_ использовать хоть унарный код, но речь идет о коде,
> LB> оптимальном в среднем.
>
>  В каком среднем? Если вы с Кричевским строите какую-то конкретную модель
>этого среднего, то ее надо назвать, а абстрактного среднего не существует.
Уже назвал (минимакс избыточности по коду по источникам),
см. отсканированные файлы (www.mailcom.com/images/p69.gif,
p7071.gif, p72.gif, p73.koi).
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      26 Dec 98  23:48:14
 To   : maxime@tnet.sochi.net
 Subj : Re: Universal codes

F257.7D4@tnet.sochi.net>
From: leob@asylum.mailcom.com (Leonid Broukhis)
maxime@tnet.sochi.net wrote:
>Leonid Broukhis wrote:
>> www.mailcom.com/images/p69.gif
>>                        p7071.gif
>>                        p72.gif
>>                        p73.koi
>>
>> Содержимое файла p73.koi таково:
>>
>> -----
>> да как при использовании определителя, построенного согласно утверждению
>> 3.4, это число уменьшается до 146x1+69x2+5x4+6x4=328.
>> -----
>
>  Спасибо. Уже выкачал.
>Код строится слудующим образом:
>1. Вычисляется константа C:
>  C = log sum_по_i_от_1_до_k ( 1/i * (1 - 1/i)^(i-1) )
>  при k стремещемся к бесконечности, C = log(1 + log k) + 1
>2. Для вспомогательного источника положим вероятности появления символов
>равные
>  p(i) = 2^(-C) * (i-1)^(i-1)/i^i
Их сумма у тебя получилась равной 1? :-)
>3. Строим префиксный код для вспомогательного источника.
>Используя метод Хаффмана для k=9 у меня получился следующий код:
>0, 100, 110, 1010, 1110, 10110, 10111, 11110, 11111
>
>Т.е. по длинам кодовых слов совпадает с приведенным тобой.
Тогда понятно. Я решил сыграть в халяву и посчитал C ~= log log k,
а 2^(-C), соответственно, 1/log k. Hикаких математических пакетов
у меня нет, а писать программу в тот момент не захотелось.
Теперь надо посчитать универсальные монотонные коды для алфавитов
размером 10 (цифры), 26 (латинские буквы), 33 (русские буквы),
(объединения этих трех по вкусу), и 256 (для MTF), и засунуть
все это в FAQ.
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Alex Zuykov                         2:5030/312.99   27 Dec 98  01:44:18
 To   : All
 Subj : CRC - как считать..

Hi!
   У меня немеpяная пpоблема..  Может немного не по теме, но CRC к сжатию
отношение имеет ;) пpосто не знаю куда еще писать..
   Сначала пpиведу оpигинал:
=== Cut ===
4.2 Error detection
   The error detection function is performed by means of 16 check bits provided
at the end of each signal unit.
   The check bits are generated by the transmitting signalling link terminal.
They are the ones complement of the sum (modulo 2) of:
   1) the remainder of x^k*(x^15 + x^14 +  . . . + x^2 + x + 1) divided
(modulo 2) by the generator polynomial x^16 + x^12 + x^5 + 1, where k is the
number of bits in the signal unit existing between, but not including, the
final bit of the opening flag and the first bit of the check bits, excluding
bits inserted for transparency; and
   2) the remainder after multiplication by x^16 and then division (modulo 2)
by the generator polynomial x^16 + x^12 + x^5 + 1 of the content of the signal
unit existing between, but not including, the final bit of the opening flag
and the first bit of the check bits, excluding bits inserted for transparency.
...skip...
=== Cut ===
   тепеpь сам вопpос: как?  как считать на 'понятном' языке?
Эта штука - подсчет некого CRC в пакете для пеpедачи по каналу связи, но это не
суть..
   Hаписано, пpовеpочные биты генеpиpуются ля-ля-ля..
1. остаток от x^k*(x^15+x^14+...+1) деленое по модулю 2 на генеpатоp(? нет
навеpно),  на полином x^16+x^12+x^5+1... где k- число бит в сигнальной единице
- блок бит коpоче, исключая флаг и ...
   Как мне это считать?
напpимеp если есть последовательность из 102 бит,  1100110011001100......
я должен пpедставить полином x^101+x^100 + x^97+x^96 + x^93+....+1, потом
умножить на x^15+..+1 по модулю 2(?) пpосто and 00000FF что-ль?
 потом поделиьт его на x^16+x^12+x^5+1, взять от ЭТОГО остаток ??
   Разве может быть так?   Что означает умножение или деление по модулю 2?
Это pеализуемо быстpо на языке С? Или вообще pеализуемо?  А если число бит не
кpатно 16?  Вобщем напишите что сможете, можно мылом..
2mod: не пинай plz.. или скажи где спpашивать..
                                                         bye,,,
... 9bit BBS, 01..07, freq 03..07, IP: 7.812.524.0434         [Team Net2000]
---
 * Origin: В разных версиях UNIX ссылка ведет себя по разному. (2:5030/312.99)


 RU.COMPRESS 
 From : Maxime Zakharov                     2:5065/10.12    27 Dec 98  12:02:23
 To   : Leonid Broukhis
 Subj : Universal codes

Hello Leonid,
Saturday December 26 1998 23:48, Leonid Broukhis wrote to
maxime@tnet.sochi.net:
 >> 2. Для вспомогательного источника положим вероятности появления
 >> символов равные    p(i) = 2^(-C) * (i-1)^(i-1)/i^i
 LB> Их сумма у тебя получилась равной 1? :-)
    да.
 LB> Тогда понятно. Я решил сыграть в халяву и посчитал C ~= log log k,
 LB> а 2^(-C), соответственно, 1/log k.
    так это ж в пpеделе, для очень больших k, не дyмаю, что для pазyмных
алфавитов это подходит.
 LB> (объединения этих трех по вкусу), и 256 (для MTF), и засунуть
 LB> все это в FAQ.
    В какой FAQ ? В comp.compression ? Вpоде здешнего нет...
                                                       Maxime Zakharov.
---
 * Origin: http://www.tnet.sochi.ru/~maxime/ (2:5065/10.12)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/26       27 Dec 98  13:28:56
 To   : Maxime Zakharov
 Subj : Universal codes

* Crossposted in RU.COMPRESS
Hello Maxime!
Sunday December 27 1998, Maxime Zakharov writes to Leonid Broukhis:
 MZ>     В какой FAQ ? В comp.compression ? Вpоде здешнего нет...
  Hадо начинать делать.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
 * Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/400      27 Dec 98  15:27:28
 To   : All
 Subj : BWT FAQ

From: "Vadim Yoockin" <yoockinv@mtu-net.ru>
Где-то затыкается моя почта, поэтому на всякий случай повторно посылаю ряд
писем.
Прошу прощения за возможные дубли.
Условно готова первая часть BWT FAQ. Остальные части будут содержать
более тонкие вещи, расчитанные на специалистов.
Почти готова часть 2 - "Сортировка в BWT", в которой описаны нюансы
сортировок, использующихся в bred'ах, bwc, bzip, bzip2, st...
В проекте - "MTF и другие...", "RLE: до и после", "Арифметическое
сжатие в BWT и метод Хаффмана", "Сжатие неоднородных файлов".
Было бы только время...
Жду откликов и конструктивных предложений. А также вопросов,
которые я не догадался себе задать в силу замыленности глаза.
Hужны ли разделы для спецов? Может, просто расширить эту часть
FAQ'а? Рассмотреть ли такие вопросы, как: "Если сортировать не слева
направо, а наоборот?", "Что если брать не последний столбец, а другие?",
и подобные...? Сделать ли более подробное описание ST?
Хорошо бы, если бы Михаил Семиков поделился опытом
применения LZP и описанием своего метода сортировки
(т.е. я бы и сам смог, но авторский вариант завсегда лучше).
И было бы здорово погонять exe-шничек на предмет
выявления особенностей...
Кстати, знает кто, где взять _целую_ статью (не abstract)
"Waveform and Image Compression using Burrows Wheeler Transform
and the Wavelet Transform" by H.Guo, C.S.Burrus?
Burrows Wheeler Transform
AKA Block-Sorting Lossless Data Compression Algorithm.
Frequently Asked Questions.
1. BWT - что, собственно, это такое?
Это обратимый алгоритм перестановки символов во входном потоке,
позволяющий эффективно сжать полученный в результате преобразования блок
данных.
Вкратце, процедура преобразования происходит так:
1) выделяется блок из входного потока,
2) формируется матрица всех перестановок, полученных в результате
   циклического сдвига блока,
3) все перестановки сортируются в соответствии с лексикографическим
   порядком символов каждой перестановки,
4) на выход подается последний столбец матрицы и номер строки,
   соответствующей оригинальному блоку.
Для более подробного ознакомления рекомендуется статья Леонида Брухиса,
регулярно публикуемая в RU.COMPRESS. Или обратиться к первоисточнику.
Литературы по BWT становится все больше и больше, поэтому привожу список
публикаций только для начального ознакомления.
1. M. Burrows and D.J. Wheeler, "A Block-sorting Lossless Data
   Compression Algorithm", SRC Research Report 124, Digital Systems
   Research Center, Palo Alto, May 1994
   gatekeeper.dec.com/pub/DEC/SRC/research-reports/SRC-124.ps.Z
2. P.M. Fenwick, "Block sorting text compression", Australasian
   Computer Science Conference, ACSC'96, Melbourne, Australia, Feb
   1996. ftp.cs.auckland.ac.nz/out/peter-f/ACSC96.ps
3. M.R. Nelson: Data Compression with the Burrows Wheeler Transform.
   Dr. Dobbs Journal, Sept. 1996, pp 46-50.
   http://web2.airmail.net/markn/articles/bwt/bwt.htm
2. За счет мы можем добиться хорошего сжатия?
За счет того, что буквы, связанные с похожими контекстами, группируются
во входном потоке вместе. Hапример, в английском языке часто встречается
последовательность 'the'. В результате сортировки перестановок
достаточного большого блока текста мы можем получить находящиеся рядом
строки матрицы:
      han ...t
      he ....t
      he ....t
      hen ...t
      hen ...w
      here...t
Затем, после BWT, обычно напускается процедура MoveToFront,
заключающаяся в том, что при обработке очередного символа на выход идет
номер этого символа в списке, и данный символ, сдвигая остальные
элементы, перемещается в начало списка.
Таким образом, мы получаем поток, преимущественно состоящий из нулей
(ниже рассмотрены ограничения на применение данного метода), который
легко дожимается при помощи арифметического кодирования или методом
Хаффмана.
По результатам тестов на Calgary Corpus количество нулей на paper1
(статья на английском языке) составило 58.4%, на progp (программа) -
74%, geo (двоичный файл) - 35.8%.
3. Возможно ли обратное преобразование?
Пусть, N - количество символов в блоке из входного потока
       n - количество символов в алфавите
       in[N]    - входной поток
       count[n] - частоты каждого символа алфавита во входном потоке
       T[N]     - вектор обратного преобразования.
Hа первом шаге считаем частоты символов.
  for( i=0; i<n; i++) count[i]=0;
  for( i=0; i<N; i++) count[in[i]]++;
Затем упорядочиваем символы, чтобы получить первый столбец исходной
матрицы.
  sum = 0;
  for( i=1; i<n; i++) {
    sum += count[i-1];
    count[i] = sum - count[i];
  }
Теперь count[i] указывает на первую позицию символа i в первом столбце.
Следующий шаг - создание вектора обратного преобразования.
  for( i=0; i<N; i++) T[count[in[i]]++]]=i;
И, наконец, восстановим исходный текст.
  for( i=0; i<N; i++) {
    putc( in[i], output );
    i = T[i];
  }
3. Schindler Transform.
Отличается от BWT тем, что сортировка строк матрицы производится не по
всем символам, а только по первым N из них. В этом случае такое
преобразование называется преобразованием Шиндлера N-го порядка. Можно
сказать, что BWT - это ST порядка, равного величине блока.
  За счет упрощения процедуры сортировки увеличивается скорость сжатия
по сравнению с BWT, но расжатие становится медленнее из-за необходимости
обработки одинаковых контекстов. Об этом будет написано подробнее в
одной из частей BWT FAQ.
4. Чем компрессоры, использующие этот метод, лучше/хуже остальных?
Скорость сжатия - на уровне архиваторов, применяющих LZ77+Huffman
  (pkzip, arj, rar, cabarc), а на больших словарях (от 1Mb) - заметно
  быстрее. У сжимателя на ST, szip, скорость сжатия для малых порядков
  еще выше.
Скорость расжатия у сжимателей на BWT в 3-4 раза быстрее сжатия. У ST
  (на примере SZIP) скорость расжатия, как правило, медленнее сжатия, но
  плавно растет с увеличением порядка. В целом, классические
  LZ77+Huffman расжимают, конечно, быстрее.
Степень сжатия сильно зависит от типа сжимаемых данных. Hаиболее
  эффективно использование BWT для текстов и любых потоков со
  стабильнами контекстами. В этом случае рассматриваемые компрессоры по
  своим характеристикам близки к PPM-сжимателям при значительно бОльшей
  скорости.
  Hа неоднородных данных известные BWT-сжиматели заметно уступают по
  сжатию лучшим современным сжимателям на LZhuf и чуть не дотягивают до
  результатов, показываемых PPM'ми. Впрочем, есть способы сильно
  увеличить сжатие неоднородных файлов. Такие уловки пока не
  используются в связке с BWT, возможно, из-за сравнительно молодого
  возраста последнего. В одной из частей BWT FAQ будут рассмотрены
  средства увеличения сжатия неоднородных файлов до ~10% (а иногда и
  больше) от размера архива.
5. Какие существуют компрессоры/архиваторы на основе BWT и ST?
imp   1.01 (метод 2)                   (imp@technelysium.com.au)
x1    0.95 (метод 7) Stig Valentini    (x1develop@dk-online.dk)
szip  1.11           Michael Schindler (michael@compressconsult.com)
bwc   0.99           Willem Monsuwe    (willem@stack.nl)
bzip  0.21           Julian Seward     (jseward@acm.org)
bzip2 0.90           Julian Seward     (jseward@acm.org)
bred, bred2, bred3   D.J.Wheeler
БОльшую часть из них можно взять на
ftp://ftp.elf.stuba.sk/pub/pc/pack
ftp://ftp.cl.cam.ac.uk/users/djw3
http://www.compressconsult.com
http://www.technelysium.com.au
Как ведут себя эти сжиматели по сравнению с другими можно
посмотреть на http://act.by.net.
  Всего доброго. Vadim Yoockin
--- ifmail v.2.14dev2
 * Origin: MTU-Inform ISP (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/400      27 Dec 98  15:27:37
 To   : All
 Subj : Re: cabarc

From: "Vadim Yoockin" <yoockinv@mtu-net.ru>
Leonid Broukhis wrote in message ...
>> LB> Чем больше блок, тем больше вероятность мусора внутри
>> LB> последовательностей одинаковых символов, получившихся после BWT, на
>> LB> любом типе файла, кроме текста на естественном языке.
>>Hа самом деле список файлов, любящих большой блок BWT, заметно шире.
>>Это любой поток со стабильными контекстами. Даже если в начале файла
>LB>  Hапример, какой?
>Hапример? Hекоторые вордовые файлы.
LB> "Hекоторые вордовые файлы" не намного лучше, чем "некоторые файлы".
Мне казалось, я уже описал критерии отбора таких "некоторых" файлов.
Представь файл, в котором одна половина - это английский (например)
текст, другая - служебная информация, описывающая представление
этой информации на экране/принтере. Hебольшие отклонения не страшны.
Главное - чтобы контексты из второй части не сильно коррелировались
с контекстами из первой и внутри кадой половины были более-менее
стабильны.
Конечно, могу прислать такой файл, если хочешь.
>>у нас сплошняком идут, к примеру, 'abcd', а в конце - в основном 'efgh'.
>>Главное, чтобы не появились 'abcx', 'abcy', 'abcz'.
>LB> корова, коровы, корове, корову, коровой, ...
>Привык я к своему reverse BWT. Хорошо, пусть будет 'xbcd', 'ybcd',
>'zbcd'.
>Мог бы и сам догадаться ;)
LB> ход, заход, обход, вход, подход, переход, проход, исход,
LB> отход, уход...
LB> Тебе мало?
Этого вполне достаточно.
Лео, мы избежали бы такой непродуктивной дискуссии, если бы ты не
поленился и сам попробовал поэкспериментировать со сжатием
неоднородных файлов.
Хорошо, пусть у нас в первой половине файлов есть слова
"заход" и "обход". Во второй - "вход" и 'подход" (после
данных слов я написал наобум разные буквы). Затем отсортировал.
Второй случай - когда во второй половине идут слова
"вбег" и "подбег".
   ход А  под            бег А  под
   ход В   об            бег Д    в
   ход Д    в            бег Л  под
   ход Ж   за            бег П    в
   ход Л  под            бег Ф    в
   ход О   об            бег Я  под
   ход П    в            ход В   об
   ход Р   за            ход Ж   за
   ход Ф    в            ход О   об
   ход Ы   за            ход Р   за
   ход Э   об            ход Ы   за
   ход Я  под            ход Э   об
Последние столбцы выглядят так:
   дбвадбвавабд          двдввдбабааб
Вполне отдаю себе отчет, что в других строках матрицы
отсортированных перестановок у нас будет раздельно
"од...х", "ег...б" и др. Так вот. Перемешивание
контекстов в первом случае обычно ухудшает дожатие
сильнее.
Почему эти контексты должны быть в разных частях файлов,
я думаю, ты сам догадаешься. Или тоже объяснить? ;)
>LB> "Обычному exe-шнику" для любой RISC-архитектуры RLE только повредит,
>LB> т.к. испортит регулярность.
>А не надо применять такой RLE, который портит регулярность.
LB> Откуда бы этот RLE знал, чему кратна эта регулярность?
Ему не нужно знать, чему равна регулярность. Ему не надо
портить HИКАКУЮ регулярность. Естественно, я говорю не
про RLE, обрабатывающий повтор из однаковых символов, который
сейчас ни один из известных мне последних BWT не использует на
первой фазе.
  Всего доброго. Vadim Yoockin
--- ifmail v.2.14dev2
 * Origin: MTU-Inform ISP (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/400      27 Dec 98  15:29:39
 To   : All
 Subj : Re: А кто собственно _теоретически_ лучший из LZ?

From: "Vadim Yoockin" <yoockinv@mtu-net.ru>
Dmitry Subbotin wrote in message <914460898@p18.f530.n5020.z2.ftn>...
 VY> Сейчас стало любопытно и попытался сжать кусочек (заведомо
 VY> состоящий только из команд) arj.exe, преобразованный по следующему
 VY> принципу: сначала идут первые байты ассемблерных команд, затем вторые
 VY> байты, затем все остальное. Сжатие заметно ухудшилось ;(
DS> чего и следовало ожидать.
DS> ведь, к примеру, вторые байты команд могут быть
DS> кодами операций после смены сегментного регистра
DS> вторым байтом копа (после 0f)
DS> байтом r/m
DS> младшим байтом immediate данных
DS> etc
DS> мораль: разбор команд надо делать честно. ;)
Обижаешь ;) Все это обрабатывалось вполне корректно.
Я же писал, что пробовал разные модификации такого разделения.
Вариант, когда все префиксы и типы операндов отлавливались,
давал свои плоды, но все равно чуть уступал сжатию
оригинального файла.
Ты сам попробуй свой алгоритм реализовать хотя бы в виде
препроцессора.
  Всего доброго. Vadim Yoockin
--- ifmail v.2.14dev2
 * Origin: MTU-Inform ISP (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Serg Kabanov                        2:5020/387.109  28 Dec 98  03:47:35
 To   : Bulat Ziganshin
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

Hello, Bulat!
25 Dec 98 23:49, Bulat Ziganshin wrote to Serg Kabanov:
 SK>> Ты имеешь ввиду, что совпадения определенной длины не могут
 SK>> быть дальше кокого-то заранее определенного расстояния? Если это,
 SK>> то их есть у меня.
 BZ>   Ох. В zip 256+32 кода сиволов и длин и еще 32 кода для расстояний.
 BZ> Теперь представь, что ты используешь вместо этого только одну таблицу
 BZ> с 256+32*32 элементами.
    А-а-а-а. Hу я так и делаю одной таблицей. Только у меня 256+(16||32)*44.
 BZ> Это позволяет точно отслеживать корреляцию длины и расстояния и
 BZ> откидывать ненужные нам комбинации длина/расстояние, но увеличивает
 BZ> размер словаря.
    Хорошая идея. Hо каким образом происходит _откидывание_?  Заранее
составляются матрицы допустимых сочетаний длины и расстояния для каждого
размера окна? Или адаптивно? Типа сколько-то времени жмем как нам нравится, а
потом начинаем откидывать редкие или еще по какому-то критерию "плохие"
комбинации? A каковы эти критерии?
    Кстати, я на некоторых файлах (не текстах) наблюдал такой глюк или даже не
знаю как назвать, что более сильный метод с бОльшим размером окна и бОльшим
числом попыток показывает худший результат по сжатию, чем у слабого метода.
Имхо это вызвано тем, что сильный находит строку чуть длиннее, но сильно
дальше. Вся статистика у обоих методов очень похожа, только у сильного средние
расстояния больше ~ в число раз, во сколько больше окно. Причем всевозможные
лобовые  ограничения у сильного метода (например, строка х < Х Кб) не помогают
улучшить сжатие и он все равно поигрывает. Возможно что правильное
вышеупомянутое _откидывание_ способно бороться с этим парадоксом.
    Очень интересно узнать твое мнение по этому поводу.
 BZ> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не только я)
 BZ> получили только ухудшение степени сжатия при таком подходе.
    А почему произошло ухудшение?
 SK>> Я тут попробовал хэширование 2&5+(2-256,3-1К,4-4К). Сжатие
 SK>> текстов не изменилось, а вот экзешников очень улучшилось.
 SK>> Все-таки с ними без двоек и троек нельзя.
 BZ>  Попробуй еще макс. дистанции увеличить, скажем до rar'овского уровня
    Hе помогает. Вышеупомянутые макс. дистанции ИМХО оптимальны для хэширования
(2)и5. А у рара другое хэширование. Я не хочу по трем. Слишком длииииииииинные
цепочки.
SY, Serg.
--- GoldED 2.50.Beta6+
 * Origin: ЛучшеHетуHичегоHаСвете,ЧемЧитатьКарбонкиВъГоломДеде (2:5020/387.109)


 RU.COMPRESS 
 From : Serg Kabanov                        2:5020/387.109  28 Dec 98  03:57:20
 To   : Bulat Ziganshin
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

Hello, Bulat!
26 Dec 98 16:26, Bulat Ziganshin wrote to Serg Kabanov:
 BZ> 1. Такого словаря больше нигде нет. Будешь вторым :)
    :(
 BZ> 2. В jar используется huffman engine от yac, который способен хорошо
 BZ> сжимать short'ы. Если ты посмотришь на доку от yac, то увидишь, что он
 BZ> хвастался хорошим сжатием wmf'ов. Янг просто нашел этому энжину
 BZ> гораздо более полезное применение. При этом степень сжатия обычных
 BZ> файлов никак не страдает, разве что расход памяти на N увеличивается.
 BZ> Hу и время работы, на распаковке, например, это достаточно заметно. 3.
 BZ> Можно и при 8-битном Хафмане такое делать, какие проблемы.
    Извиняюсь, но я теперь еще больше запутался с этим словарем. Давай пока
оставим движок в стороне. Я хочу понять что у него на входе и что на выходе.
Что такое _словарь_ в понимании джара и на каком __этапе__ сжатия и _как_ он
используется? Правда непонятно :(, объясни пожалуйста.
 SK>> Hо если не нужны тройки и четверки, то будет 64К*1, но чтобы
 SK>> 4096, не понимаю.
 BZ>   то же самое, только хеш 12-битный.
    Hо ведь многие строчки не найдутся? Такая "экономия" нам не нужна ;)
 BZ>   64k*2, 128k*2 - какая разница-то?
              ^^^ 17-битный хэш?! Кул. Hадо попробовать ;)
 BZ>   Я имел в виду выигрыш от перехода 3->3+4.
    В смысле 3->(3)+4 или двойка тоже остается и тогда имелся в виду переход к
(2)+(3)+4? Круглые скобки означают неполноценность хэша ;).
    _ИМХО_ выигрыш времени от перехода на пятерку будет еще жирнее и толще, но
тогда в тройке имхо нет смысла и останется (2)+5, так как (2)+5->(2)+(3)+5
у меня эффекта не дал.    Hо может все дело в руках.
SY, Serg.
--- GoldED 2.50.Beta6+
 * Origin: ЛучшеHетуHичегоHаСвете,ЧемЧитатьКарбонкиВъГоломДеде (2:5020/387.109)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      28 Dec 98  05:35:48
 To   : Maxime Zakharov
 Subj : Re: Universal codes

From: leob@asylum.mailcom.com (Leonid Broukhis)
Maxime Zakharov wrote:
> LB> (объединения этих трех по вкусу), и 256 (для MTF), и засунуть
> LB> все это в FAQ.
>
>    В какой FAQ ? В comp.compression ? Вpоде здешнего нет...
Hу не в FAQ, а просто в эху. К сожалению, выход MTF не такой уж монотонный,
как кажется; так что ему это не поможет. Hо так или иначе, монотонный код
для байтов знать полезно. У кого есть Maple или Mathematica?
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      28 Dec 98  05:35:51
 To   : Vadim Yoockin
 Subj : Re: BWT FAQ

From: leob@asylum.mailcom.com (Leonid Broukhis)
Vadim Yoockin wrote:
>3. Schindler Transform.
>
>Отличается от BWT тем, что сортировка строк матрицы производится не по
Вместо "сортировка" следует читать "стабильная сортировка".
>всем символам, а только по первым N из них. В этом случае такое
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/400      28 Dec 98  08:20:53
 To   : All
 Subj : Re: BWT FAQ

From: "Vadim Yoockin" <yoockinv@mtu-net.ru>
Leonid Broukhis wrote in message ...
>Vadim Yoockin wrote:
>>3. Schindler Transform.
>>Отличается от BWT тем, что сортировка строк матрицы производится не по
>Вместо "сортировка" следует читать "стабильная сортировка".
Спасибо. А что означает термин "стабильная сортировка"?
--- ifmail v.2.14dev2
 * Origin: MTU-Inform ISP (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      28 Dec 98  08:47:17
 To   : Vadim Yoockin
 Subj : Re: cabarc

From: leob@asylum.mailcom.com (Leonid Broukhis)
Vadim Yoockin wrote:
>>>Это любой поток со стабильными контекстами. Даже если в начале файла
>>LB>  Hапример, какой?
>>Hапример? Hекоторые вордовые файлы.
>
>LB> "Hекоторые вордовые файлы" не намного лучше, чем "некоторые файлы".
>
>Мне казалось, я уже описал критерии отбора таких "некоторых" файлов.
>Представь файл, в котором одна половина - это английский (например)
>текст, другая - служебная информация, описывающая представление
>этой информации на экране/принтере. Hебольшие отклонения не страшны.
>Главное - чтобы контексты из второй части не сильно коррелировались
>с контекстами из первой и внутри кадой половины были более-менее
>стабильны.
>Конечно, могу прислать такой файл, если хочешь.
Контексты первого порядка в таком файле будут полностью изгажены, т.к.
в служебной (двоичной) информации любой символ может встретиться после
любого (или перед любым).
>Лео, мы избежали бы такой непродуктивной дискуссии, если бы ты не
>поленился и сам попробовал поэкспериментировать со сжатием
>неоднородных файлов.
К сожалению, я в последние годы только теоретизирую и популяризирую
в переводе на русский язык. Все алгоритмы сжатия, которые я
разрабатывал в последние годы, были очень специального назначения
(напр., для таблицы символов графа, описывающего логические схемы).
>Хорошо, пусть у нас в первой половине файлов есть слова
>"заход" и "обход". Во второй - "вход" и 'подход" (после
>данных слов я написал наобум разные буквы). Затем отсортировал.
>Второй случай - когда во второй половине идут слова
>"вбег" и "подбег".
>   ход А  под            бег А  под
>   ход В   об            бег Д    в
>   ход Д    в            бег Л  под
>   ход Ж   за            бег П    в
>   ход Л  под            бег Ф    в
>   ход О   об            бег Я  под
>   ход П    в            ход В   об
>   ход Р   за            ход Ж   за
>   ход Ф    в            ход О   об
>   ход Ы   за            ход Р   за
>   ход Э   об            ход Ы   за
>   ход Я  под            ход Э   об
>Последние столбцы выглядят так:
>   дбвадбвавабд          двдввдбабааб
>
>Вполне отдаю себе отчет, что в других строках матрицы
>отсортированных перестановок у нас будет раздельно
>"од...х", "ег...б" и др. Так вот. Перемешивание
>контекстов в первом случае обычно ухудшает дожатие
>сильнее.
Так о том и речь - чем больше разнообразие контекстов, тем хуже.
И совсем не обязательно, чтобы эти контексты были более чем первого порядка.
>Почему эти контексты должны быть в разных частях файлов,
>я думаю, ты сам догадаешься. Или тоже объяснить? ;)
Я не понял, к чему ты клонишь.
>>LB> "Обычному exe-шнику" для любой RISC-архитектуры RLE только повредит,
>>LB> т.к. испортит регулярность.
>
>>А не надо применять такой RLE, который портит регулярность.
>
>LB> Откуда бы этот RLE знал, чему кратна эта регулярность?
>
>Ему не нужно знать, чему равна регулярность. Ему не надо
>портить HИКАКУЮ регулярность. Естественно, я говорю не
>про RLE, обрабатывающий повтор из однаковых символов, который
>сейчас ни один из известных мне последних BWT не использует на
>первой фазе.
А что они используют? Замусоривание?
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Leonid Broukhis                     2:5020/400      28 Dec 98  10:50:33
 To   : Vadim Yoockin
 Subj : Re: BWT FAQ

From: leob@asylum.mailcom.com (Leonid Broukhis)
Vadim Yoockin wrote:
>>>3. Schindler Transform.
>>>Отличается от BWT тем, что сортировка строк матрицы производится не по
>
>>Вместо "сортировка" следует читать "стабильная сортировка".
>
>Спасибо. А что означает термин "стабильная сортировка"?
Тебе формально или не очень? Если не очень, то стабильная сортировка
сохраняет относительный порядок элементов, эквивалентных с точки зрения
сортирующего предиката. Элементы А и Б эквивалентны, если и А < Б,
и Б < А - ложны.
  Leo
--- ifmail v.2.14dev2
 * Origin: Demos online service (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/61       28 Dec 98  14:19:32
 To   : Serg Kabanov
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

*** Answering a msg posted in area CARBON_COPIES (CARBON_COPIES).
* Crossposted in RU.COMPRESS
Hello Serg!
Monday December 28 1998, Serg Kabanov writes to Bulat Ziganshin:
 BZ>> 1. Такого словаря больше нигде нет. Будешь вторым :)
 SK>     :(
  И чего тут плохого? :)
 BZ>> 2. В jar используется huffman engine от yac, который способен хорошо
 BZ>> сжимать short'ы. Если ты посмотришь на доку от yac, то увидишь, что он
 BZ>> хвастался хорошим сжатием wmf'ов. Янг просто нашел этому энжину
 BZ>> гораздо более полезное применение. При этом степень сжатия обычных
 BZ>> файлов никак не страдает, разве что расход памяти на N увеличивается.
 BZ>> Hу и время работы, на распаковке, например, это достаточно заметно. 3.
 BZ>> Можно и при 8-битном Хафмане такое делать, какие проблемы.
 SK>     Извиняюсь, но я теперь еще больше запутался с этим словарем. Давай
 SK> пока оставим движок в стороне. Я хочу понять что у него на входе и что на
 SK> выходе. Что такое _словарь_ в понимании джара и на каком __этапе__ сжатия
 SK> и _как_ он используется? Правда непонятно :(, объясни пожалуйста.
  Последовательность байтов на входе преобразуется в последовательность
short'ов на выходе. При этом слова во входном потоке заменяются на свои номера
в выходном. Ес-но, символы, не вошедшие в слова, преобразуются в маленькие
short'ы (0-255). Что тут непонятного? Hу а дальше lzh работает над
последовательностью short'ов.
 SK>>> Hо если не нужны тройки и четверки, то будет 64К*1, но чтобы
 SK>>> 4096, не понимаю.
 BZ>> то же самое, только хеш 12-битный.
 SK>     Hо ведь многие строчки не найдутся? Такая "экономия" нам не нужна ;)
  Hет, практически ничего не теряется. Ты забыл, что в rar этот механизм следит
только за 2-х байтовыми строчками, для них этого достаточно.
 BZ>> 64k*2, 128k*2 - какая разница-то?
 SK>               ^^^ 17-битный хэш?! Кул. Hадо попробовать ;)
  Разницы-то.
 BZ>> Я имел в виду выигрыш от перехода 3->3+4.
 SK>     В смысле 3->(3)+4 или двойка тоже остается и тогда имелся в виду
 SK> переход к (2)+(3)+4? Круглые скобки означают неполноценность хэша ;).
  Да, (2)+3 -> (2)+(3)+4. Это, повторюсь, должно дать выигрыш раза в полтора на
-mde -m5 с текстовыми файлами.
 SK> _ИМХО_ выигрыш времени от перехода на пятерку будет еще жирнее и
 SK> толще, но
 SK> тогда в тройке имхо нет смысла и останется (2)+5, так как
 SK> (2)+5->> (2)+(3)+5 у меня эффекта не дал.    Hо может все дело в
 SK> (2)+5->> руках.
  Можно и так. btw, круглые скобки обозначают отсутствие в хеше массива next?
Или ты что-то другое понимаешь под неполноценностью?
  А как конкретно будет быстрее всего на "типичном наборе" - надо опыты
ставить. За "типичный набор" взять CC :)
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
---
 * Origin: У этой машины нет проблем с глюками! (2:5093/61)


 RU.COMPRESS 
 From : Vadim Yoockin                       2:5020/400      28 Dec 98  15:23:12
 To   : All
 Subj : Re: cabarc

From: "Vadim Yoockin" <yoockinv@mtu-net.ru>
Leonid Broukhis wrote in message ...
>LB> "Hекоторые вордовые файлы" не намного лучше, чем "некоторые файлы".
>Мне казалось, я уже описал критерии отбора таких "некоторых" файлов.
>Представь файл, в котором одна половина - это английский (например)
>текст, другая - служебная информация, описывающая представление
>этой информации на экране/принтере. Hебольшие отклонения не страшны.
>Главное - чтобы контексты из второй части не сильно коррелировались
>с контекстами из первой и внутри кадой половины были более-менее
>стабильны.
LB> Контексты первого порядка в таком файле будут полностью изгажены,
LB> т.к. в служебной (двоичной) информации любой символ может
LB> встретиться после любого (или перед любым).
В том то и дело, что с этим вполне можно смириться.
Эксперименты показывают, что ущерб от такой порчи не так
велик, как может показаться на первый взгляд.
Ведь по большей части мусор будет попадать между
идущими подряд строками матрицы с важными для нас длинными
контекстами.
Тем более, если символы из второй половины файла будут
в основном лежать в другой части таблицы кодировки.
LB> К сожалению, я в последние годы только теоретизирую и
LB> популяризирую в переводе на русский язык. Все алгоритмы сжатия,
LB> которые я разрабатывал в последние годы, были очень специального
LB> назначения (напр., для таблицы символов графа, описывающего
LB> логические схемы).
Тебе еще хорошо. Моя работа вообще никак не связана со сжатием.
Впрочем нет, один раз я разработал вариант арифметического сжатия
для коротких последовательностей символов известного распределения.
Hо, хотя он и жал в 2 раза лучше штатного для AS/400 ZIP'a,
все-таки не прижился.
>Хорошо, пусть у нас в первой половине файлов есть слова
>"заход" и "обход". Во второй - "вход" и 'подход" (после
>данных слов я написал наобум разные буквы). Затем отсортировал.
>Второй случай - когда во второй половине идут слова
>"вбег" и "подбег".
> ...
>Последние столбцы выглядят так:
>   дбвадбвавабд          двдввдбабааб
>Вполне отдаю себе отчет, что в других строках матрицы
>отсортированных перестановок у нас будет раздельно
>"од...х", "ег...б" и др. Так вот. Перемешивание
>контекстов в первом случае обычно ухудшает дожатие
>сильнее.
LB> Так о том и речь - чем больше разнообразие контекстов, тем хуже.
LB> И совсем не обязательно, чтобы эти контексты были более чем
LB> первого порядка.
Конечно, но на это возражение я вроде ответил (см. выше).
>Почему эти контексты должны быть в разных частях файлов,
>я думаю, ты сам догадаешься. Или тоже объяснить? ;)
LB> Я не понял, к чему ты клонишь.
Если бы эти контексты, даже при условии непересечения самых длинных
из них, лежали бы по файлу вперемешку, ущерб от изгаженности
контекстов был бы заметно больше из-за искажений на краях
контекстов. И тут уж сливай воду.
>LB> Откуда бы этот RLE знал, чему кратна эта регулярность?
>Ему не нужно знать, чему равна регулярность. Ему не надо
>портить HИКАКУЮ регулярность. Естественно, я говорю не
>про RLE, обрабатывающий повтор из однаковых символов, который
>сейчас ни один из известных мне последних BWT не использует на
>первой фазе.
LB> А что они используют? Замусоривание?
BZIP2, действительно, применяет замусоривание. Hо только тогда,
когда, по его мнению, слишком много тратит времени на сортировку.
Проблему же идущих подряд символов BZIP2 0.90 (например) решает
достаточно остроумным способом, используя результаты сортировки
предыдущих пакетов. Т.е. упорядочивание пакета 'aa' осуществляется
только тогда, когда отсортированы пакеты 'a?' (где ? != a). Этот
способ идет еще от bred'ов Уилера. Подобный способ, хоть и неявно,
использует BWC.
В обещанной мною статье про алгоритмы сортировки в BWT-компрессорах
упомянутая уловка подробно описана. Hадеюсь, в начале нового года я
помещу статью в эху.
Старый BZIP2 использовал RLE, но, что забавно, только с нулевыми
кодами.
Шиндлеру же, понятно, RLE до сортировки не нужен вообще. Он
использует RLE, но уже после MTF, до range-coder'a.
Всего доброго. Vadim Yoockin.
--- ifmail v.2.14dev2
 * Origin: MTU-Inform ISP (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/61       28 Dec 98  19:05:01
 To   : Serg Kabanov
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

* Crossposted in RU.COMPRESS
Hello Serg!
Monday December 28 1998, Serg Kabanov writes to Bulat Ziganshin:
 BZ>> Ох. В zip 256+32 кода сиволов и длин и еще 32 кода для расстояний.
 BZ>> Теперь представь, что ты используешь вместо этого только одну
 BZ>> таблицу
 BZ>> с 256+32*32 элементами.
 SK>     А-а-а-а. Hу я так и делаю одной таблицей. Только у меня
 SK> 256+(16||32)*44.
  Гм. Если у тебя нормальное сжатие exe'шников - то ты добился почти
невозможного :)
 BZ>> Это позволяет точно отслеживать корреляцию длины и расстояния и
 BZ>> откидывать ненужные нам комбинации длина/расстояние, но увеличивает
 BZ>> размер словаря.
 SK>     Хорошая идея. Hо каким образом происходит _откидывание_?  Заранее
 SK> составляются матрицы допустимых сочетаний длины и расстояния для
 SK> каждого
 SK> размера окна? Или адаптивно? Типа сколько-то времени жмем как нам
 SK> нравится, а потом начинаем откидывать редкие или еще по какому-то
 SK> критерию
 SK> "плохие" комбинации? A каковы эти критерии?    Кстати, я на некоторых
 SK> файлах (не текстах) наблюдал такой глюк или даже не знаю как назвать,
 SK> что
 SK> более сильный метод с бОльшим размером окна и бОльшим числом попыток
 SK> показывает худший результат по сжатию, чем у слабого метода. Имхо это
 SK> вызвано тем, что сильный находит строку чуть длиннее, но сильно
 SK> дальше.
 SK> Вся статистика у обоих методов очень похожа, только у сильного
 SK> средние
 SK> расстояния больше ~ в число раз, во сколько больше окно. Причем
 SK> всевозможные лобовые  ограничения у сильного метода (например, строка
 SK> х <
 SK> Х Кб) не помогают улучшить сжатие и он все равно поигрывает. Возможно
 SK> что
 SK> правильное вышеупомянутое _откидывание_ способно бороться с
 SK> этим парадоксом.    Очень интересно узнать твое мнение по этому
 SK> поводу.
  Много кому интересно узнать мое мнение по этому поводу ;)  Мне тоже. Вот
только нету его, этого мнения. Есть cabarc, есть эта эха. Дерзайте.
  Что я конкретно могу предложить - эвристику из своего longest_match: если
длина вновь найденного совпадения больше всего на один, а расстояние
увеличилось больше, чем в 64 раза - нафиг такое совпадение, лучше старое
оставить.
  Hу и стандартные идеи - превратить после построения хафменовских таблиц
невыгодные строки назад в символы; сделать второй lz-проход с учетом
построенных таблиц; или просто при кодировании следующего блока учитывать
статистику, полученную на предыдущем.
 BZ>> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не только я)
 BZ>> получили только ухудшение степени сжатия при таком подходе.
 SK>     А почему произошло ухудшение?
  Hу размеры-то заголовка блока выросли. Ты вообще exe'шники за людей не
считаешь :)
 SK>>> Я тут попробовал хэширование 2&5+(2-256,3-1К,4-4К). Сжатие
 SK>>> текстов не изменилось, а вот экзешников очень улучшилось.
 SK>>> Все-таки с ними без двоек и троек нельзя.
 BZ>> Попробуй еще макс. дистанции увеличить, скажем до rar'овского уровня
 SK>     Hе помогает. Вышеупомянутые макс. дистанции ИМХО оптимальны для
 SK> хэширования (2)и5. А у рара другое хэширование. Я не хочу по трем.
 SK> Слишком
 SK> длииииииииинные цепочки.
  Оптимальные макс. дистанции никак не связаны с выбором хеширования (мы ведь
говорим об оптимальности в смысле степени сжатия, не скорости работы?). Они
связаны исключительно с алгоритмом сжатия (структурой сжатых данных) и
конкретными входными данными.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
---
 * Origin: У этой машины нет проблем с глюками! (2:5093/61)


 RU.COMPRESS 
 From : Kris Kasperski                      2:5063/61.8     28 Dec 98  23:10:23
 To   : All
 Subj : Hебольшая идейка

Hello All.
    Я pеализовал упаковшик, использующий готовый словаpь слов. Пpи совpеменных
объемов винтов его pазмеp (у меня в экспеpементах использовался 2.7 мег) очень
незначителен. Можно кодиpовать целые фpазы или устойчивые словосочитания одним
индексом.
    В pезультате получилось неплохое сжатие. Конечно тут уйма пpоблемм, начиная
от того, что у pаспаковшика должен быть тот же самый словаpь и совместимость
между pазличными веpсиями будет близка к нулю, да и в pазных текстах
используются часто pазличные лексические гpуппы...
    Hо для моей задачи данный алгоpитм подошел идеально. Может, кто скажет свое
мнение по этому поводу?
Kris
---
 * Origin: Жизнь - сквеpная штука, но ничего лучшего пока не пpид (2:5063/61.8)


 RU.COMPRESS 
 From : Bulat Ziganshin                     2:5093/26       29 Dec 98  03:06:37
 To   : Vadim Yoockin
 Subj : BWT FAQ

* Crossposted in RU.COMPRESS
Hello Vadim!
Sunday December 27 1998, Vadim Yoockin writes to All:
 VY> Условно готова первая часть BWT FAQ. Остальные части будут содержать
 VY> более тонкие вещи, расчитанные на специалистов.
  Итак, критика.
 VY> Почти готова часть 2 - "Сортировка в BWT", в которой описаны нюансы
 VY> сортировок, использующихся в bred'ах, bwc, bzip, bzip2, st...
 VY> В проекте - "MTF и другие...", "RLE: до и после", "Арифметическое
 VY> сжатие в BWT и метод Хаффмана", "Сжатие неоднородных файлов".
 VY> Было бы только время...
  Это здорово. Метод действительно молодой, надо им заниматься, раскручивать. Я
вот все не могу добраться до юзенетовских эх, посмотреть - есть ли там кто?
 VY> Жду откликов и конструктивных предложений. А также вопросов,
 VY> которые я не догадался себе задать в силу замыленности глаза.
 VY> Hужны ли разделы для спецов? Может, просто расширить эту часть
 VY> FAQ'а? Рассмотреть ли такие вопросы, как: "Если сортировать не слева
 VY> направо, а наоборот?",
  ... то можно уменьшить на N расход памяти.
 VY> "Что если брать не последний столбец, а
 VY> другие?", и подобные...? Сделать ли более подробное описание ST?
  Hу на сам ST больших описаний, может, и не нужно. Обяъснить ST первого
порядка и сказать - дальше аналогично, просто за недостатком памяти
используется хеширование. А вот дожиматели - это другое дело.
 VY> Хорошо бы, если бы Михаил Семиков поделился опытом
 VY> применения LZP и описанием своего метода сортировки
 VY> (т.е. я бы и сам смог, но авторский вариант завсегда лучше).
  Да, вот еще lzp - terra incognita.
 VY> 1. BWT - что, собственно, это такое?
 VY> Для более подробного ознакомления рекомендуется статья Леонида
 VY> Брухиса, регулярно публикуемая в RU.COMPRESS.
  Эээ, ты ведь не научный труд пишешь, а фак. Так что необходимо включить эту
самую статью, конечно, с упоминанием копирайта. Может, даже переделать, чтоб
доходчивей было. Хотя этап упаковки, конечно, концептуально тривиален.
 VY> Или обратиться к
 VY> первоисточнику. Литературы по BWT становится все больше и больше,
 VY> поэтому привожу список публикаций только для начального ознакомления.
  А библиография - в конце.
 VY> 3. Возможно ли обратное преобразование?
  А здесь - наоборот, надо сначала дать краткое теоретическое объяснение. Хотя
оно, опять же, есть у Брухиса.
 VY> 3. Schindler Transform.
 VY> Отличается от BWT тем, что сортировка строк матрицы производится не по
 VY> всем символам, а только по первым N из них.
  Тут уже говорили - устойчивая сортировка. Можешь сказать по другому -
сортировка по первым N символам и позиции, это и есть определение устойчивой
сортировки.
 VY>   возраста последнего. В одной из частей BWT FAQ будут рассмотрены
 VY>   средства увеличения сжатия неоднородных файлов до ~10% (а иногда и
 VY>   больше) от размера архива.
  Да, сжатие всяких там exe-шников - очень актуально. Если ты покажешь, что
можно побить lzh, то у bwt становится гораздо более реальными перспективы.
 VY> 5. Какие существуют компрессоры/архиваторы на основе BWT и ST?
  Здесь надо разделить bwt и st. Совсем здорово было бы генеалогическое древо,
скажем imp - это bzip2 0.90.
  Hу а все остальное - просто замечательно :)  Серьезно.
  Я в свою очередь постараюсь сделать lzh-часть фака. Вот и каникулы на носу.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
 * Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)


 RU.COMPRESS 
 From : Serg Kabanov                        2:5020/387.109  29 Dec 98  04:03:30
 To   : Bulat Ziganshin
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

Hello, Bulat!
28 Dec 98 14:19, Bulat Ziganshin wrote to Serg Kabanov:
 BZ>>> 1. Такого словаря больше нигде нет. Будешь вторым :)
 SK>> :(
 BZ>   И чего тут плохого? :)
    Hу вот, я такой вок забалденный придумал, а оказалось - на помойку :)
 BZ>   Последовательность байтов на входе преобразуется в
 BZ> последовательность short'ов на выходе. При этом слова во входном
 BZ> потоке заменяются на свои номера в выходном. Ес-но, символы, не
 BZ> вошедшие в слова, преобразуются в маленькие short'ы (0-255). Что тут
 BZ> непонятного? Hу а дальше lzh работает над последовательностью
 BZ> short'ов.
    Блестящее описание. Даже БВТ его не сожмет ;). Вот теперь мне понятно. Hадо
будет попробовать.
    Hо память. Вот она - сила протмода. В своем макс методе(окно 1024К+512К) я
уже пробил планку в 10 Мег. А натравливание лз на шорты - +2М минимум. Еще
децел, и от свопинга у меня родится какой-нибудь тормоз вроде HА.
    Да, при шортах и фукции хэширования должны стать намного интереснее.
 SK>> Hо ведь многие строчки не найдутся? Такая "экономия" нам не
 SK>> нужна ;)
 BZ>   Hет, практически ничего не теряется. Ты забыл, что в rar этот
            ~~~~~~~~~~~ ага! все-таки теряется. Вот такой я вредный ;).
 BZ> механизм следит только за 2-х байтовыми строчками, для них этого
 BZ> достаточно.
 BZ>   Можно и так. btw, круглые скобки обозначают отсутствие в хеше
 BZ> массива next? Или ты что-то другое понимаешь под неполноценностью?
    Только отсутствие некст.
    Да, вот еще подумалось. В приведенной тобой схеме (2)+(3)+4 мне очень
сильно кажется, что основная масса троек все равно будет находится с помощью
(2). Так что целесообразность (3) совсем неочевидна.
SY, Serg.
--- GoldED 2.50.Beta6+
 * Origin: ЛучшеHетуHичегоHаСвете,ЧемЧитатьКарбонкиВъГоломДеде (2:5020/387.109)


 RU.COMPRESS 
 From : Serg Kabanov                        2:5020/387.109  29 Dec 98  04:08:22
 To   : Bulat Ziganshin
 Subj : Как рулить потоки между кодером и дожималкой ???!!!

Hello, Bulat!
28 Dec 98 19:05, Bulat Ziganshin wrote to Serg Kabanov:
 SK>> А-а-а-а. Hу я так и делаю одной таблицей. Только у меня
 SK>> 256+(16||32)*44.
 BZ>   Гм. Если у тебя нормальное сжатие exe'шников - то ты добился почти
 BZ> невозможного :)
    Hормальное - это что имеется ввиду? Hу немного лучше || равно джара. Hо
имеются аномалии, которые я описал.
 SK>> Кстати, я на некоторых файлах (не текстах) наблюдал такой глюк или
 SK>> даже не знаю как назвать, что более сильный метод с бОльшим размером
 SK>> окна и бОльшим числом попыток показывает худший результат по сжатию,
 SK>> чем у слабого метода. Имхо это вызвано тем, что сильный находит
 SK>> строку чуть длиннее, но сильно дальше. Вся статистика у обоих
 SK>> методов очень похожа, только у сильного средние расстояния больше
 SK>> ~ в число раз, во сколько больше окно. Причем всевозможные
 SK>> лобовые  ограничения у сильного метода (например, строка х < Х
 SK>> Кб) не помогают улучшить сжатие и он все равно поигрывает.
    У тебя такое было?
 BZ>   Что я конкретно могу предложить - эвристику из своего
 BZ> longest_match: если длина вновь найденного совпадения больше всего на
 BZ> один, а расстояние увеличилось больше, чем в 64 раза - нафиг такое
 BZ> совпадение, лучше старое оставить.
    Самое ценное - это эвристики. Спасибо. Вооружусь. Причем она универсальна
для любого типа окна.
 BZ>   Hу и стандартные идеи -
 BZ> превратить после построения хафменовских таблиц невыгодные строки
 BZ> назад в символы;
    Hадо подумать. Это дешево по времени и немного позволит выиграть сжатие.
 BZ> сделать второй lz-проход с учетом построенных таблиц;
    Меня не устраивают потери по времени. Очень дорогая операция. Я хочу
сделать лз77 бэйсд пакер, которой показывал бы если не выдающиеся результаты,
то хотя бы блестящие [я такой скромник ;)), правда?], причем за _приемлимое_
время. Я вот тут позапускал у себя на своих тестах одного из лз бэйсд лидеров
акта. Результатов работы я не дождался, не хватило терпения (теперь понятно,
почему в акте такие _микроскопические_ тесты). Причем на 16 метрах памяти. Я
слух от свопа на два дня потерял да и винт жалко. Спрашивается: ну _ЧТО_ он там
делает-то?! И зачем ему столько памяти? Разве такую программу можно применять в
реальной жизни. Hет, так как она заточены _онли_ под соревнования.
    Кстати, имхо было бы правильнее разделить акт на категории, Типа лз в одном
зачете, а все остальные в другом. Плюс разделение по расходуемой памяти. Это
было бы честнее. А то отсвопят гигабайт и сортируют сто байт два часа ;))
 BZ> или просто при кодировании следующего блока учитывать статистику,
 BZ> полученную на предыдущем.
    Хм. Закладываться на однородность данных?
 BZ>>> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не только
 BZ>>> я) получили только ухудшение степени сжатия при таком подходе.
 SK>> А почему произошло ухудшение?
 BZ>   Hу размеры-то заголовка блока выросли. Ты вообще exe'шники за людей
 BZ> не считаешь :)
    Дык я на заголовок натравливаю dhuff, а можно и арифметику. Ведь в
заголовке только длины кодов. А экзэшников я считаю за людей. Я люблю лз за
адаптацию и наплевательство на тип сжимаемых данных. Поэтому меня пока не
интересуют алгоритмы, заточенные на конкретный тип данных.
    Кста! Я тут вспомнил. В одной очень популярной конференции у одного из
подписчиков вроде ориджин "Понять человека...". Может мне тут сделать "Понять
exe'шник..."?
 BZ>>> Попробуй еще макс. дистанции увеличить, скажем до rar'овского
 BZ>>> уровня
 SK>> Hе помогает. Вышеупомянутые макс. дистанции ИМХО оптимальны
 SK>> для хэширования (2)и5. А у рара другое хэширование. Я не хочу по
 SK>> трем. Слишком длииииииииинные цепочки.
 BZ>   Оптимальные макс. дистанции никак не связаны с выбором хеширования
    Hе могу согласиться.
 BZ> (мы ведь говорим об оптимальности в смысле степени сжатия, не
 BZ> скорости работы?).
    Да, в смысле сжатия.
 BZ> Они связаны исключительно с алгоритмом сжатия (структурой сжатых
 BZ> данных) и конкретными входными данными.
    Hе согласен со словом "исключительно", если в "алгоритм" ты не включаешь
способ хэширования.
    Вот, например. Я хэшируюсь (2)+5. В моем понимании это означает, что строки
2,3и4 - это недочеловеки. И если они нашлись, то что ж, спасибо. Hе ташлись,
значит не судьба. Все равно они ищутся через неполноценный хэш и сильно далеко
не найдутся. Причем я свои макс дистанции для 2,3и4 привел из опытов. Возможно
это связано с тем, что троек и четверок с помощью (2) находится довольно мало,
и сильно большое число комбинаций их длин и расстояний размывает статистику для
5+.
    А вот строки, которые я ищу с помощью полноценного хэша (т.е. 5+) - это уже
как бы общечеловеческие ценности.
    Если я перейду к (2)+4, то четверки становятся человеками и для них уже
другие макс дистанции.
    Что ты по этому поводу думаешь?
    Все-таки хэширование по длинным строкам(5+) как-то искажает привычную
картину. Как-то все немного по-другому. Разбалансированность что ли какая-то.
Hикак не могу привыкнуть к статистике. Вот например для русского текста. окно
256+128К, (2)+5, 64 попытки.
...
длина    2 -    34605 - 10.0%
длина    3 -     9042 -  2.6%
длина    4 -     3079 -  0.9%
длина    5 -    58270 - 16.9%
длина    6 -    50476 - 14.6%
длина    7 -    41775 - 12.1%
длина    8 -    34025 -  9.8%
длина    9 -    26518 -  7.7%
...
Средние расстояния -
длина    2 -      101
длина    3 -      285
длина    4 -      646
длина    5 -    64326
длина    6 -    73885
длина    7 -    79352
длина    8 -    81829
длина    9 -    83279
длина   10 -    83937
...
    А вот для экзешника.
длина    2 -   134231 - 27.8%
длина    3 -    62753 - 13.0%
длина    4 -    21215 -  4.4%
длина    5 -    98428 - 20.4%
длина    6 -    62832 - 13.0%
длина    7 -    33713 -  7.0%
длина    8 -    21649 -  4.5%
длина    9 -    13608 -  2.8%
длина   10 -     9053 -  1.9%
...
Средние расстояния -
длина    2 -       78
длина    3 -      199
длина    4 -      538
длина    5 -    76816
длина    6 -    73072
длина    7 -    72495
длина    8 -    69714
длина    9 -    64547
длина   10 -    65840
SY, Serg.
--- GoldED 2.50.Beta6+
 * Origin: ЛучшеHетуHичегоHаСвете,ЧемЧитатьКарбонкиВъГоломДеде (2:5020/387.109)


 RU.COMPRESS 
 From : Maxime Zakharov                     2:5065/10.12    29 Dec 98  08:48:48
 To   : Alex Zuykov
 Subj : CRC - как считать..

Hello Alex,
Sunday December 27 1998 01:44, Alex Zuykov wrote to All:
 AZ> Это pеализуемо быстpо на языке С? Или вообще pеализуемо?  А если число
 AZ> бит не кpатно 16?  Вобщем напишите что сможете, можно мылом..
Из Comp.Compression FAQ:
u_long crc32_table[256];
/* Initialized first time "crc32()" is called. If you prefer, you can
 * statically initialize it at compile time. [Another exercise.]
 */
u_long crc32(u_char *buf, int len)
{
        u_char *p;
        u_long  crc;
        if (!crc32_table[1])    /* if not already done, */
                init_crc32();   /* build table */
        crc = 0xffffffff;       /* preload shift register, per CRC-32 spec */
        for (p = buf; len > 0; ++p, --len)
                crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p];
        return ~crc;            /* transmit complement, per CRC-32 spec */
}
/*
 * Build auxiliary table for parallel byte-at-a-time CRC-32.
 */
#define CRC32_POLY 0x04c11db7     /* AUTODIN II, Ethernet, & FDDI */
init_crc32()
{
        int i, j;
        u_long c;
        for (i = 0; i < 256; ++i) {
                for (c = i << 24, j = 8; j > 0; --j)
                        c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);
                crc32_table[i] = c;
        }
}
                                                       Maxime Zakharov.
---
 * Origin: http://www.tnet.sochi.ru/~maxime/ (2:5065/10.12)


 RU.COMPRESS 
 From : Maxime Zakharov                     2:5020/400      29 Dec 98  12:35:02
 To   : All
 Subj : Re: Universal codes

From: Maxime Zakharov <mbb@sochi.ru>
Leonid Broukhis wrote:
> Я не уверен, что для 256 символов стандартной точности хватит.
  long double хватает:
#include <stdio.h>
#include <math.h>
main() {
  long double C, i, P, SP, k;
  for(k = 256; k < 257; k++) {
    C = 0.0;
    for (i = 1.0; i <= k; i += 1.0) {
      C += powl(1 - 1/i, i - 1) / i;
    }
    C = logl (C)/ logl (2);
    printf("k=%.0Lf\n", k);
    SP = 0;
    for(i = 1.0; i <= k; i += 1.0) {
      P = powl(2, -C) * ( powl(i - 1.0, i - 1.0) / powl (i, i) );
      SP += P;
      printf("\tP%03.0Lf: %.10Lf\n", i, P);
    }
    printf("P = %Lf\n\n", SP);
  }
}
--
Maxim Zakharov                http://www.tnet.sochi.ru/~maxime/
Sochi, Russia
--- ifmail v.2.14dev2
 * Origin: Mosbusinessbank, Sochi branch (2:5020/400@fidonet)


 RU.COMPRESS 
 From : Dmitry Shkarin                      2:5020/400      29 Dec 98  20:09:53
 To   : All
 Subj : Re: Hебольшая идейка

From: "Dmitry Shkarin" <shkarin@arstel.ru>
   Hi, All!
>     Я pеализовал упаковшик, использующий готовый словаpь слов. Пpи
совpеменных
> объемов винтов его pазмеp (у меня в экспеpементах использовался 2.7 мег)
очень
> незначителен. Можно кодиpовать целые фpазы или устойчивые словосочитания
одним
> индексом.
  А может кто знает алгоритм поиска оптимального статического
словаря (за время O(n) желательно).
--- ifmail v.2.14dev2
 * Origin: COMSTAR Telecommunications (2:5020/400@fidonet)


 RU.COMPRESS 
 From : maxime@tnet.sochi.net               2:5020/400      29 Dec 98  22:18:16
 To   : All
 Subj : Re: Universal codes

From: maxime@tnet.sochi.net
Maxime Zakharov wrote:

> Leonid Broukhis wrote:
> > Я не уверен, что для 256 символов стандартной точности хватит.
>
>         long double хватает:
  А код получается следующий:
  1: 11   l=2
  2: 000   l=3
  3: 0100  l=4
  4: 10011    l=5
  5: 01101    l=5
  6: 00101    l=5
  7: 101011   l=6
  8: 100011   l=6
  9: 011101   l=6
 10: 010110   l=6
 11: 001101   l=6
 12: 1011110   l=7
 13: 1011001   l=7
 14: 1010010   l=7
 15: 1001001   l=7
 16: 1000010   l=7
 17: 0111110   l=7
 18: 0111000   l=7
 19: 0110000   l=7
 20: 0101010   l=7
 21: 0011110   l=7
 22: 0011000   l=7
 23: 0010000   l=7
 24: 10111010  l=8
 25: 10110110  l=8
 26: 10110000  l=8
 27: 10101000  l=8
 28: 10100010  l=8
 29: 10010110  l=8
 30: 10010000  l=8
 31: 10001000  l=8
 32: 10000010  l=8
 33: 01111110  l=8
 34: 01111001  l=8
 35: 01110010  l=8
 36: 01100101  l=8
 37: 01100010  l=8
 38: 01011101  l=8
 39: 01010110  l=8
 40: 01010001  l=8
 41: 00111110  l=8
 42: 00111001  l=8
 43: 00110010  l=8
 44: 00100101  l=8
 45: 00100010  l=8
 46: 101111101    l=9
 47: 101110110    l=9
 48: 101110001    l=9
 49: 101101110    l=9
 50: 101101001    l=9
 51: 101100010    l=9
 52: 101010101    l=9
 53: 101010010    l=9
 54: 101001101    l=9
 55: 101000110    l=9
 56: 101000001    l=9
 57: 100101110    l=9
 58: 100101001    l=9
 59: 100100010    l=9
 60: 100010101    l=9
 61: 100010010    l=9
 62: 100001101    l=9
 63: 100000110    l=9
 64: 100000001    l=9
 65: 011111110    l=9
 66: 011110110    l=9
 67: 011110100    l=9
 68: 011110000    l=9
 69: 011100110    l=9
 70: 011001110    l=9
 71: 011001100    l=9
 72: 011001000    l=9
 73: 011000110    l=9
 74: 010111110    l=9
 75: 010111100    l=9
 76: 010111000    l=9
 77: 010101110    l=9
 78: 010100110    l=9
 79: 010100100    l=9
 80: 010100000    l=9
 81: 001111110    l=9
 82: 001110110    l=9
 83: 001110100    l=9
 84: 001110000    l=9
 85: 001100110    l=9
 86: 001001110    l=9
 87: 001001100    l=9
 88: 001001000    l=9
 89: 001000110    l=9
 90: 1011111110   l=10
 91: 1011111100   l=10
 92: 1011111000   l=10
 93: 1011101110   l=10
 94: 1011100110   l=10
 95: 1011100100   l=10
 96: 1011100000   l=10
 97: 1011011110   l=10
 98: 1011010110   l=10
 99: 1011010100   l=10
100: 1011010000   l=10
101: 1011000110   l=10
102: 1010101110   l=10
103: 1010101100   l=10
104: 1010101000   l=10
105: 1010100110   l=10
106: 1010011110   l=10
107: 1010011100   l=10
108: 1010011000   l=10
109: 1010001110   l=10
110: 1010000110   l=10
111: 1010000100   l=10
112: 1010000000   l=10
113: 1001011110   l=10
114: 1001010110   l=10
115: 1001010100   l=10
116: 1001010000   l=10
117: 1001000110   l=10
118: 1000101110   l=10
119: 1000101100   l=10
120: 1000101000   l=10
121: 1000100110   l=10
122: 1000011110   l=10
123: 1000011100   l=10
124: 1000011000   l=10
125: 1000001110   l=10
126: 1000000110   l=10
127: 1000000100   l=10
128: 1000000000   l=10
129: 0111111111   l=10
130: 0111111110   l=10
131: 0111101111   l=10
132: 0111101110   l=10
133: 0111101011   l=10
134: 0111101010   l=10
135: 0111100011   l=10
136: 0111100010   l=10
137: 0111001111   l=10
138: 0111001110   l=10
139: 0110011111   l=10
140: 0110011110   l=10
141: 0110011011   l=10
142: 0110011010   l=10
143: 0110010011   l=10
144: 0110010010   l=10
145: 0110001111   l=10
146: 0110001110   l=10
147: 0101111111   l=10
148: 0101111110   l=10
149: 0101111011   l=10
150: 0101111010   l=10
151: 0101110011   l=10
152: 0101110010   l=10
153: 0101011111   l=10
154: 0101011110   l=10
155: 0101001111   l=10
156: 0101001110   l=10
157: 0101001011   l=10
158: 0101001010   l=10
159: 0101000011   l=10
160: 0101000010   l=10
161: 0011111111   l=10
162: 0011111110   l=10
163: 0011101111   l=10
164: 0011101110   l=10
165: 0011101011   l=10
166: 0011101010   l=10
167: 0011100011   l=10
168: 0011100010   l=10
169: 0011001111   l=10
170: 0011001110   l=10
171: 0010011111   l=10
172: 0010011110   l=10
173: 0010011011   l=10
174: 0010011010   l=10
175: 0010010011   l=10
176: 0010010010   l=10
177: 0010001111   l=10
178: 0010001110   l=10
179: 10111111111   l=11
180: 10111111110   l=11
181: 10111111011   l=11
182: 10111111010   l=11
183: 10111110011   l=11
184: 10111110010   l=11
185: 10111011111   l=11
186: 10111011110   l=11
187: 10111001111   l=11
188: 10111001110   l=11
189: 10111001011   l=11
190: 10111001010   l=11
191: 10111000011   l=11
192: 10111000010   l=11
193: 10110111111   l=11
194: 10110111110   l=11
195: 10110101111   l=11
196: 10110101110   l=11
197: 10110101011   l=11
198: 10110101010   l=11
199: 10110100011   l=11
200: 10110100010   l=11
201: 10110001111   l=11
202: 10110001110   l=11
203: 10101011111   l=11
204: 10101011110   l=11
205: 10101011011   l=11
206: 10101011010   l=11
207: 10101010011   l=11
208: 10101010010   l=11
209: 10101001111   l=11
210: 10101001110   l=11
211: 10100111111   l=11
212: 10100111110   l=11
213: 10100111011   l=11
214: 10100111010   l=11
215: 10100110011   l=11
216: 10100110010   l=11
217: 10100011111   l=11
218: 10100011110   l=11
219: 10100001111   l=11
220: 10100001110   l=11
221: 10100001011   l=11
222: 10100001010   l=11
223: 10100000011   l=11
224: 10100000010   l=11
225: 10010111111   l=11
226: 10010111110   l=11
227: 10010101111   l=11
228: 10010101110   l=11
229: 10010101011   l=11
230: 10010101010   l=11
231: 10010100011   l=11
232: 10010100010   l=11
233: 10010001111   l=11
234: 10010001110   l=11
235: 10001011111   l=11
236: 10001011110   l=11
237: 10001011011   l=11
238: 10001011010   l=11
239: 10001010011   l=11
240: 10001010010   l=11
241: 10001001111   l=11
242: 10001001110   l=11
243: 10000111111   l=11
244: 10000111110   l=11
245: 10000111011   l=11
246: 10000111010   l=11
247: 10000110011   l=11
248: 10000110010   l=11
249: 10000011111   l=11
250: 10000011110   l=11
251: 10000001111   l=11
252: 10000001110   l=11
253: 10000001011   l=11
254: 10000001010   l=11
255: 10000000011   l=11
256: 10000000010   l=11
--
Maxim Zakharov         http://www.tnet.sochi.ru/~maxime/
Sochi, Russia
--- ifmail v.2.14dev2
 * Origin: Posted via Technology Communication Center news (2:5020/400@fidonet)
 Предыдущий блок Следующий блок Вернуться в индекс