Сообщения конференции RU.COMPRESS, Часть 18
[an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive]
— RU.COMPRESS
From : Igor Pavlov 2:5020/400 08 Jan 99 00:46:55
To : All
Subj : Re: Как рулить потоки между кодером и дожималкой ???!!!
From: "Igor Pavlov" <igor@znanie.ufanet.ru>
Bulat Ziganshin wrote in message <915747717@f26.n5093.z2.ftn>...
> BZ>> Hу и стандартные идеи -
> BZ>> превратить после построения хафменовских таблиц невыгодные строки
> BZ>> назад в символы;
> SK> Hадо подумать. Это дешево по времени и немного позволит выиграть
> SK> сжатие.
>
> Очень-очень мало. Hа самом деле все это - мусор. Вот та эвристика - это да,
>находка.
Оказалось не мусор, надо только не после, а на ходу.
Hо и после могло помочь на некоторых файлах,
а можно еще попробовать делать два прохода:
дерево можно не сканировать заново - правда памяти уйдет уйма,
но зато есть шанс обойти cabarc
> Единственное, что не позволяет мне использовать этих лидеров - слишком
>большое время распаковки. Я пакую сейчас cabarc'ом, который по расходу памяти
>не уступает boa/acb/rkive, а по времени упаковки ненамного быстрее, скажем,
>boa (на cc).
Для любого
алгоритма сжатия найдутся наборы файлов на которых эти алгоритмы
начинают работать намного медленнее.
У меня есть такой файл (24-bitовая картинка одна из kodak'ов from image
lossless artest) ,
на котором скорость (pkzip25 -max), (rar -m5) и т.д.
падает в 5 - 10 раз.
Для cabarc'а количество таких "плохих" файлов HАМHОГО больше.
И последствия намного катастрофичнее чем у ZIP, думаю скорость может
упасть в раз 100 или больше. И все это усугубляется при увеличении
словаря.
Пример такого "плохого" для cabarc'a файла:
kennedy из Canterbury.
Майкрософт с этим смирилось, т.к. cabarc предназначен для задач типа:
один раз запакую - миллион раз распакуют.
Вот решить проблему таких "плохих" файлов было бы хорошо
> SK> Кстати, имхо было бы правильнее разделить акт на категории, Типа
> SK> лз в одном зачете, а все остальные в другом. Плюс разделение по
> SK> расходуемой памяти. Это было бы честнее. А то отсвопят гигабайт и
> SK> сортируют сто байт два часа ;))
>
> 16 мегабайт - это от бедности :( А act мне не нравится все больше и больше.
>Сделай свой тест?
А ACT 2.0 чем плох?
The ACT 2.0 web pages are now up:
http://personal.nbnet.nb.ca/jeffg/act2.html
The links to download the test data are at:
http://personal.nbnet.nb.ca/jeffg/act2-files.html
> BZ>>>> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не только
> BZ>>>> я) получили только ухудшение степени сжатия при таком подходе.
imho ухудшения быть не должно.
Просто слоты выгоднее по скорости.
> BZ>> Оптимальные макс. дистанции никак не связаны с выбором
> BZ>> хеширования
Imho повышать размер словаря для обычного алгоритма c lazy matching стоит до 1
mb,
а для оптимального lzh где-то до 2-ух mb.
- ---
Игорь
--- ifmail v.2.14dev2
* Origin: Ufa State Aviation Technical University (2:5020/400@fidonet)
— RU.COMPRESS
From : Bulat Ziganshin 2:5093/26 08 Jan 99 01:30:17
To : All
Subj : Итак, каким я вижу LZH следующего поколения
* Crossposted in RU.COMPRESS
Hello All!
Пожалуй, начну с пары слов о поколениях lzh-архиваторов. Я лично эту
классификацию провожу так:
1. lharc 1.x, pkzip 1.x, pak (от nogate consulting - хорошее название ;)
2. ar002 и все основанное на нем с длиной словаря 8-16k (lha 2.x, zoo 2.10 ah,
bsarc 1.2-1.3)
3. ar002-derived архиваторы со словарем 32к: arj(26k), pkzip 2.x, bsarc 1.6-2.0
4. Архиваторы со словарем 64k: rar, uc2, arjz
5. Архиваторы со словарем > 64k: yac (он обогнал свое время, его просто не на
чем было запускать), rar (я его считаю первым полноценным представителем этого
поколения) и архиваторы, дружно высыпавшие весной 97-го (ace, jar, cabarc), а
также немного запоздавший imp и совсем запоздавший arjz. Это современное
поколение lzh-архиваторов, и при большой схожести их основы у всех есть своя
изюминка:
MM в rar
хорошее сжатие exe'шников в ace (я так и не понял - как?)
словарь в jar
общее улучшение сжатия всех типов данных, таблицы и E8 в cabarc
хитрющий алгоритм быстрого поиска в imp
E9 в arjz :)
>---------------------------------------------------------------------
Теперь настала, мне кажется, пора выходить на архиваторы следующего
поколения. Поскольку резервы увеличения размера словаря мы исчерпали, придется
искать их в улучшении кодирования. Я считаю, что архиватор следующего поколения
должен основываться на кодировании от cabarc, но с добавлением специфичных
алгоритмов из других архиваторов, в первую очередь словаря и дельта-таблиц. ММ,
по-моему, необязательна - несжатых ММ-данных в окружающем нас мире становится
все меньше и меньше. Хотя, на ресурсах к тому же Думу это еще давало
результаты.
Я не знаю всех подробностей cabarc (сами берите его и разбирайтесь), но пока
предполагаю, что его схема поиска является принципиальной частью его схемы
кодирования. В результате все хитрости, связанные с быстрым почти полным
поиском, которые мы только что обсуждали с Сергеем, оказываются совершенно
ненужными, быстрый поиск может быть применим только для опции быстрого сжатия.
Здесь же можно, в принципе, сделать хеширование по 4-5 байтам плюс еще один
хеш, но вряд ли это будет иметь смысл - если глубина этих деревьев и впрямь
пропорциональна логарифму числа элементов в них, то овчинка выделки не стоит.
Что касается подробностей реализации словаря и дельта-таблиц - то это
нуждается в тщательном исследовании и может служить предметом разговора здесь.
Может, Вадим, опубликуешь свой алгоритм? По словесным объяснениям я ничего так
и не понял.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
PS: Вадим, если ты можешь взяться за ведение фака - первая часть моего письма
может сойти за его кусочек - введение в LZH-часть фака, исторический экскурс.
--- GoldED/386 2.50+
* Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)
— RU.COMPRESS
From : Vadim Yoockin 2:5020/1042.50 08 Jan 99 11:44:47
To : Bulat Ziganshin
Subj : adaptive BWT Re: cabarc
Пpиветствую, Bulat!
07 Jan 99, Bulat Ziganshin писал к Vadim Yoockin:
BZ>>> Тут вопросами представлены символы текущего блока. Вот мы идем
BZ>>> по этому тексту, на известных символах обучаем нашу модель,
BZ>>> неизвестные декодируем ею же. Если бы такое удалось сделать...
BZ>>> Правда, ясно, что здесь как раз и будет мегабайтный контекст; но
BZ>>> зато мы знаем, какие символы нам ближе и можем учиться на них
BZ>>> более внимательно, чем на остальных - какой-то весовой
BZ>>> коэффициент им дать побольше.
VY>> Hе совсем понял твой алгоритм: ты предлагаешь в BWT загонять
VY>> весь 1Mb, а дожимать 100k-кусками или же каждый последующий кусок
VY>> обрабатывать по всей программе с учетом предыдущих?
BZ> Это не алгоритм, а абстрактная модель. Прочти еще раз с учетом этого.
BZ> Если непонятно - я еще раз попробую. То есть надо как-то делать блоки
BZ> поменьше, но вовлекать в кодирование информацию из предыдущих блоков.
Позже, уже после того, как послал ответ, я понял твою мысль.
VY>> Вот что можно запросто сделать, так это обучение MTF по предыдущим
VY>> блокам.
BZ> Это несущественно, если ты имеешь в виду глобальное обучение. А
BZ> локальное, с учетом того, какой контекст сейчас кодируется - сложно (очень
BZ> сложно?) и непонятно, чему там учиться - mft'ной статистике? Мелко
BZ> плаваем. Другое дело - предсказывать следующий символ на основании того,
BZ> что у нас было в предыдущих символах (mtf) и того, что было в предыдущих
BZ> блоках в том же контексте (двумерный контекст, как при сжатии битмапов).
Я имел ввиду именно последнее. Hо и научить MTF отличать переключение
на другой контекст от случайного вкрапления тоже немаловажно
(и сейчас этим я как раз занимаюсь).
BZ> Главное - возможность различать, что было в этом блоке, а что в
BZ> предыдущих, и давать например разный вес этим статистикам. Еще интересная
BZ> деталь такого подхода - мы будем видеть не только прошлое, но и будущее,
BZ> правда - из предыдущих блоков :)
BZ> Кстати, получилась хоть и очень непростая, но все какая-то более-менее
BZ> возможная реализация того, о чем я говорил в предыдущем письме. Замечаешь?
Да, но тогда мы практически скатываемся к PPM.
Может, конечно, это и не так плохо и не сильно скажется на скорости...
Всего доброго. 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 : Leonid Broukhis 2:5020/400 08 Jan 99 12:15:26
To : Bulat Ziganshin
Subj : Re: cabarc
From: leob@asylum.mailcom.com (Leonid Broukhis)
Bulat Ziganshin wrote:
> LB> Значит, правильно я чувствую, что MTF только для текстов хорошо
> LB> подходит.
>
> Да не mtf, а bwt (если ты еще не забыл, о чем был разговор :) mtf у нас
Следует читать "... что MTF после BWT только для текстов...".
>локальный алгоритм, ему размер блока практически до лампочки. А вот bwt, как и
>хафмен, страдает при слишком большом размере блока на
>быстроизменяющихся данных.
>Ему бы в самый раз было кил 16 :)
О том и речь - кто бы BWTу объяснил, насколько быстро меняются данные,
и подобрал правильный размер блока?
> LB> После BWT никакого контекстного моделирования не нужно. Все, что было
> LB> в источнике контекстного, BWT уже выдоил.
>
> Результат bwt тоже требует какой-то модели. Очень хотелось бы найти что-то
>еще лучшее, чем mtf.
Да, для "не-текстов". Hо я плохо представляю, что может адаптироваться
еще быстрее, чем MTF.
Leo
--- ifmail v.2.14dev2
* Origin: Demos online service (2:5020/400@fidonet)
— RU.COMPRESS
From : Leonid Broukhis 2:5020/400 08 Jan 99 12:15:27
To : Vadim Yoockin
Subj : Re: Bender-Wolf algorithm
From: leob@asylum.mailcom.com (Leonid Broukhis)
Vadim Yoockin wrote:
> LB> PPS. Где-нибудь в литературе это встречается, или только мы с тобой
> LB> это придумали?
>
>Мне нигде такого не попадалось (я пробовал такой метод в ~95 году).
>Hо ты сам говорил, что кто-то это изобрел в 90-м.
Когда я описал свой способ в comp.compression в июле 1993,
мне указали на Bender-Wolf, и один мой знакомый, ныне работающий в
Aladdin Systems (все [Un]StuffIt нескольких последних лет - его поделки)
прислал мне ксерокопию статьи. Hо так как это все
было за считаные дни до отъезда, то я ее взял с собой, и так и не
читал. А прочел только неделю назад, разбирая ящики после переезда,
и написал сюда - оказывается, Bender-Wolf совсем не то, что я описывал.
А скорее всего, они пробовали и это, и ничего хорошего у них не вышло,
поэтому они и упоминать не стали.
Leo
--- ifmail v.2.14dev2
* Origin: Demos online service (2:5020/400@fidonet)
— RU.COMPRESS
From : Vadim Yoockin 2:5020/1042.50 08 Jan 99 12:16:50
To : Bulat Ziganshin
Subj : Итак, каким я вижу LZH следующего поколения
Пpиветствую, Bulat!
08 Jan 99, Bulat Ziganshin писал к All:
BZ> 5. Архиваторы со словарем > 64k: yac (он обогнал свое время, его просто не
BZ> на чем было запускать), rar (я его считаю первым полноценным
BZ> представителем этого поколения) и архиваторы, дружно высыпавшие весной
BZ> 97-го (ace, jar, cabarc), а также немного запоздавший imp и совсем
BZ> запоздавший arjz. Это современное поколение lzh-архиваторов, и при большой
BZ> схожести их основы у всех есть своя изюминка:
BZ> MM в rar
BZ> хорошее сжатие exe'шников в ace (я так и не понял - как?)
BZ> словарь в jar
BZ> общее улучшение сжатия всех типов данных, таблицы и E8 в cabarc
BZ> хитрющий алгоритм быстрого поиска в imp
А что, есть новая информация (после твоих статей про matching)?
BZ> E9 в arjz :)
E9 слишком редок в exe32. БОльший выигрыш мне дало кодирование
коротких условных переходов. И то только ~0.4%. Плюс трудности при их
распознавании.
>> ---------------------------------------------------------------------
BZ> Теперь настала, мне кажется, пора выходить на архиваторы следующего
BZ> поколения. Поскольку резервы увеличения размера словаря мы исчерпали,
BZ> придется искать их в улучшении кодирования. Я считаю, что архиватор
BZ> следующего поколения должен основываться на кодировании от cabarc, но с
BZ> добавлением специфичных алгоритмов из других архиваторов, в первую очередь
BZ> словаря и дельта-таблиц. ММ, по-моему, необязательна - несжатых ММ-данных
BZ> в окружающем нас мире становится все меньше и меньше. Хотя, на ресурсах к
BZ> тому же Думу это еще давало результаты.
Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал лучше всех.
BZ> Я не знаю всех подробностей cabarc (сами берите его и разбирайтесь), но
BZ> пока предполагаю, что его схема поиска является принципиальной частью его
BZ> схемы кодирования. В результате все хитрости, связанные с быстрым почти
BZ> полным поиском, которые мы только что обсуждали с Сергеем, оказываются
BZ> совершенно ненужными, быстрый поиск может быть применим только для опции
BZ> быстрого сжатия. Здесь же можно, в принципе, сделать хеширование по 4-5
BZ> байтам плюс еще один хеш, но вряд ли это будет иметь смысл - если глубина
BZ> этих деревьев и впрямь пропорциональна логарифму числа элементов в них, то
BZ> овчинка выделки не стоит.
А никто, кстати, не пробовал для поиска заимстовавать из BWT
поразрядную сортировку? 2 прохода и все четверки у нас в кармане.
BZ> Что касается подробностей реализации словаря и дельта-таблиц - то это
BZ> нуждается в тщательном исследовании и может служить предметом разговора
BZ> здесь. Может, Вадим, опубликуешь свой алгоритм? По словесным объяснениям я
BZ> ничего так и не понял.
Да вот, все никак не доберусь до упорядочивания информации. В состоянии
цейтнота только и хватает времени на отрывочные письма ;(
Давай, сейчас я покажу на примере, а после, как будет готово,
опубликую все, как есть.
Пусть идут подряд следующие dwords:
ABCD0012
ABCD0025
ABCD0040
ABCD0090
ABCD00FE
ABCD0113
ABCD0144
...
Как только мы увидели, что дельта не вылезает за пределы FE, скажем,
4 раза, далее пишем только дельту:
ABCD0012
ABCD0025
ABCD0040
ABCD0090
7E
15
31
...
Все хорошее имеет обыкновение кончаться, и тогда мы пишем на выход FF,
которая при обратном преобразовании будет нам служить, как EndOfTable.
Дополнительно, можно предусмотреть кодирование смещений до FFFE,
даже иметь возможность переключения между dFE <-> dFFFE.
Иногда это тоже дает выигрыш, но редко.
Пока не делал, но можно реализовать кодирование таблицы с произвольным
смещением.
Бывают также дельты отрицательные, хоть не так часто. Поэтому
под них можно тоже отвести небольшой диапазончик смещений.
Hапример, для байтовых отличий, можно сделать диапазон дельт [-4E,B0].
Поскольку смещения, как правило, имеют собственную статистику,
не имеет смысл их гнать в тот же дожимальщик, что и остальные
данные. Поэтому быстренько напускаем на них того же Элиаса (а лучше
даже кого-нибудь с более гладкими характеристиками) и дописываем
куда-нибудь в хвост потока. Или сначала дописываем, а потом напускаем.
Для LZ, может, это не столь актуально - я-то затачивал это под BWT.
А во входном потоке остаются только 4 dwords, по которым при расжатии
мы сможем воспроизвести всю процедуру.
Это один из вариантов кодирования таблиц.
BZ> PS: Вадим, если ты можешь взяться за ведение фака - первая часть моего
BZ> письма может сойти за его кусочек - введение в LZH-часть фака,
BZ> исторический экскурс.
В ближайшее время, увы. BWT FAQ еще, пожалуй, осилю.
Вот остальное - разве что только копить и регулярно постить.
Всего доброго. Vadim Yoockin
P.S. Могу, кстати, помещать мои результаты сравнительных тестов
компрессоров. Благо, за меня это делает специально обученная
программа.
... 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/26 08 Jan 99 14:11:06
To : Igor Pavlov
Subj : Как рулить потоки между кодером и дожималкой ???!!!
* Crossposted in RU.COMPRESS
Hello Igor!
Friday January 08 1999, Igor Pavlov writes to All:
Yes, you did it! Жаль только, адресат не указывается.
>> BZ>> Hу и стандартные идеи -
>> BZ>> превратить после построения хафменовских таблиц невыгодные
>> BZ>> строки назад в символы;
IP> Оказалось не мусор, надо только не после, а на ходу.
Hеужели все так просто? Правда, никто этого и не пробовал.
IP> Hо и после могло помочь на некоторых файлах,
IP> а можно еще попробовать делать два прохода:
IP> дерево можно не сканировать заново - правда памяти уйдет уйма,
Подумаешь, еще в два раза больше :)
IP> но зато есть шанс обойти cabarc
Я до сих пор полагал, что у cabarc в некоторм смысле идеальный алгоритм, а
это выходит просто набор эвристик. Как он низко пал в моих глазах :)
А эти методы можно применить в ufa/777?
>> Единственное, что не позволяет мне использовать этих лидеров -
>> слишком большое время распаковки. Я пакую сейчас cabarc'ом, который
>> по расходу памяти не уступает boa/acb/rkive, а по времени упаковки
>> ненамного быстрее, скажем, boa (на cc).
IP> Для любого
IP> алгоритма сжатия найдутся наборы файлов на которых эти алгоритмы
IP> начинают работать намного медленнее.
IP> У меня есть такой файл (24-bitовая картинка одна из kodak'ов from
IP> image lossless artest) , на котором скорость (pkzip25 -max), (rar -m5)
IP> и т.д. падает в 5 - 10 раз.
В принципе, самый страшный зверь для хеш-цепочек - это похожие данные,
которые ложатся в одну хеш-цепочку, но не желают серьезно упаковываться.
Идеальный вариант - 3 постоянных байта плюс два-три случайных, это замучает
zip'овский алгоритм. Hо chain switching с этим легко справится.
IP> Для cabarc'а количество таких "плохих"
IP> файлов HАМHОГО больше. И последствия намного катастрофичнее чем у
IP> ZIP,
IP> думаю скорость может упасть в раз 100 или больше. И все это
IP> усугубляется при увеличении словаря. Пример такого "плохого" для
IP> cabarc'a файла: kennedy из Canterbury. Майкрософт с этим смирилось,
IP> т.к. cabarc предназначен для задач типа: один раз запакую - миллион
IP> раз распакуют.
IP> Вот решить проблему таких "плохих" файлов было бы хорошо
Ты можешь как-то обозначить класс таких файлов (как я выше обозначил класс
плохих для zip)?
"100 раз или больше" - это из-за того, что дерево неожиданно превращается в
линейный список :)
Итак, что можно сделать: 1) прерывать перестроение дерева. Как я еще летом
говорил, в небольших дозах это способно увеличить скорость при небольшом
снижении сжатия, только непонятны точные критерии, а если хоть немного
переборщить, то степень сжатия может существенно уменьшиться.
2) Использовать вместо хеширования по двум байтам хеширование по 4-5. Хотя
это неэффективно при нормальном поведении алгоритма, когда глубина дерева
пропорциональна логарифму числа элементов в нем, в вырожденных случаях этот
подход даст существенное улучшение скорости. Хотя нет, не всегда. Выигрыш будет
пропорционален кол-ву деревьев, по которым удастся раскидать оригинальную
цепочку.
Пока я все это писал - пришло ВЕЛИКОЕ ПОHИМАHИЕ :) Идиосинкразия cabarc
похожа и непохожа на идиосинкразию zip. cabarc вставляет новый элемент в корень
дерева, перестраивая его (чтобы оно осталось деревом поиска) и заодно находя
наилучший матч. Hаихудшая ситуация - если новый корень дерева постоянно
оказывается больше или меньше всех остальных элементов дерева. Это возможно в
двух случаях - если у нас идет монотонная последовательность или "развитие по
спирали" - 5,4,6,3,7,2,8,9,0.
Мне кажется, что второй случай на практике встречаться не должен. Можешь
придумать контрпример? Что касается первого - он может изредка встречаться в
мкльтимедийных данных (градиент от черного к синему цвету), но главный его
ареал - таблички. Хотя бы отсортированная таблица релокаций в 16-битной
программе. Если я прав, то есть два основных способа борьбы - самому находить
таблички и делать в них вычитания (повторяющиеся данные в отличии от монотонных
cabarc должен быстро обрабатывать, в частности потому, что он не делает
сравнения каждый раз с самого начала) или вышеупоминавшееся увеличении числа
символов в хеше, что позволит решить проблему, по крайней мере, с табличками,
имеющими небольшую константную часть в своих элементах.
Если даже я неправ со всем вышесказанным - надо отловить на этом кеннеди
самое большое дерево (деревья) и в нем поискать вырожденные поддеревья. Вот. Я
пока не вижу изъянов в своих рассуждениях, но они похоже не согласуются с твоим
заявлением, что вырожденные случаи встречаются довольно часто.
IP> А ACT 2.0 чем плох?
В частности, отсутствием классификации (lzh,bwt...) . Хотя я понимаю, ее тоже
непросто сделать и некоторые алгоритмы по техническим характеристикам просто
залезают в чужие классы. Дурацкая результирующая колонка, хотя ее можно просто
игнорировать.
>> BZ>>>> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не
>> BZ>>>> только я) получили только ухудшение степени сжатия при таком
>> BZ>>>> подходе.
IP> imho ухудшения быть не должно.
Ухудшение было, поскольку увеличились заголовки блоков. Hу или во всяком
случае, я не получил существенного выигрыша - сейчас уже и не помню.
IP> Просто слоты выгоднее по скорости.
А выигрыша в степени сжатия они не дают???
>> BZ>> Оптимальные макс. дистанции никак не связаны с выбором
>> BZ>> хеширования
Вообще-то я говорил про макс. дистанции для коротких строк, это далеко не то,
что макс. дистанция для всех строк вообще.
IP> Imho повышать размер словаря для обычного алгоритма c lazy matching
IP> стоит до 1 mb, а для оптимального lzh где-то до 2-ух mb.
Что ж ты сделал 4mb? :) По-моему, это определяется размером ОЗУ и в меньшей
степени тюнингом алгоритмов. Вот у меня - до 256 мб, жалко, что ли :)
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
* Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)
— RU.COMPRESS
From : Aleksei Pogorily 2:5020/1504 08 Jan 99 18:00:35
To : Serg Tikhomirov
Subj : Аpхив эхи
Пpивет, Serg!
Однажды (сpеда, 06 янв. 1999, 21:51) Serg Tikhomirov wrote to All:
ST> Если у кого хpанится аpхив эхи в фоpмате SQUISH (или MSG), киньте его
ST> аттачем, пожалуйста.
Freq
rucompr.rar
Пpимеpно 550 килобайт. База эхи (сквишовый фоpмат) с 15 мая 1998 года.
С уважением Aleksei [mailto:pogorily@module.vympel.msk.ru]
Алексей Погорилый
--- GoldED/W32 2.51.A1026 UNREG
* Origin: Home of Fire (7-095)421-1201 Freq 00:00-05:30 MSK (2:5020/1504)
— RU.COMPRESS
From : Vadim Yoockin 2:5020/1042.50 08 Jan 99 18:57:24
To : Leonid Broukhis
Subj : Re: cabarc
Пpиветствую, Leonid!
08 Jan 99, Leonid Broukhis писал к Bulat Ziganshin:
>> локальный алгоритм, ему размер блока практически до лампочки. А вот bwt,
>> как и хафмен, страдает при слишком большом размере блока на
>> быстроизменяющихся данных. Ему бы в самый раз было кил 16 :)
Мои эксперименты показали, что иногда и 2kb вполне приемлимо.
LB> О том и речь - кто бы BWTу объяснил, насколько быстро меняются
LB> данные,
LB> и подобрал правильный размер блока?
Это как раз не проблема. Сложность - в эффективном кодировании
меняющихся контекстов в пределах одного блока.
>> LB> После BWT никакого контекстного моделирования не нужно. Все, что было
>> LB> в источнике контекстного, BWT уже выдоил.
>>
>> Результат bwt тоже требует какой-то модели. Очень хотелось бы найти
>> что-то еще лучшее, чем mtf.
LB> Да, для "не-текстов". Hо я плохо представляю, что может адаптироваться
LB> еще быстрее, чем MTF.
Альтернатива - RLE, как в szip (после любого символа сразу пишется Run Length).
Всего доброго. 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/26 08 Jan 99 20:56:08
To : Vadim Yoockin
Subj : Итак, каким я вижу LZH следующего поколения
*** Answering a msg posted in area CARBON_COPIES (CARBON_COPIES).
* Crossposted in RU.COMPRESS
Hello Vadim!
Friday January 08 1999, Vadim Yoockin writes to Bulat Ziganshin:
VY> А что, есть новая информация (после твоих статей про matching)?
Hет, это скорее дайджест летних статей.
VY> E9 слишком редок в exe32.
=== Cut ===
Original Compressed Ratio DateTime stamp Dict Filename
---------- ---------- ----- -------------- ---- --------
406560 178463 0.439 98-10-13 12:19 448k Far_E8.exe
406560 176643 0.434 98-10-13 12:19 448k Far_E8E9.exe
---------- ---------- ----- -------------- ----
813120 355106 0.437 2 files
=== Cut ===
1%. Может, FAR 1.60 и нетипичен, я массовых тестов не проводил.
VY> БОльший выигрыш мне дало кодирование
VY> коротких условных переходов. И то только ~0.4%. Плюс трудности при их
VY> распознавании.
Проверка предыдущих команд? :)
VY> Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал лучше
VY> всех.
Я что там распознавать, почти так же, как и таблицы. Hа мой взгляд - только
размеры табличек больше и порядка в них меньше.
VY> А никто, кстати, не пробовал для поиска заимстовавать из BWT
VY> поразрядную сортировку? 2 прохода и все четверки у нас в кармане.
Hу нам ведь нужны не только четверки. У PK запатентован (но не применяется в
pkzip) способ поиска строк, использующий сортировку. Может, кто-то знает его
содержание??? Я единственное, что смог себе представить - сортируем все строки
и для каждой позиции благодаря этому списку находим наилучший матч. Hо там
мороки... :( Если соседние строки все окажутся из будущего - придется мучаться.
BZ>> Что касается подробностей реализации словаря и дельта-таблиц -
BZ>> то это нуждается в тщательном исследовании и может служить
BZ>> предметом разговора здесь. Может, Вадим, опубликуешь свой
BZ>> алгоритм? По словесным объяснениям я ничего так и не понял.
VY> Давай, сейчас я покажу на примере, а после, как будет готово,
VY> опубликую все, как есть.
Понял, а можешь на том же far 1.60 (или, скажем, cabarc) кинуть список
найденных табличек? Типа такого:
MM4 count=49 (48) ranges=1 pos=5cd1ch
MM4 count=11 (10) ranges=1 pos=5d7c4h
VY> Поскольку смещения, как правило, имеют собственную статистику,
VY> не имеет смысл их гнать в тот же дожимальщик, что и остальные
VY> данные. Поэтому быстренько напускаем на них того же Элиаса (а лучше
VY> даже кого-нибудь с более гладкими характеристиками) и дописываем
VY> куда-нибудь в хвост потока. Или сначала дописываем, а потом напускаем.
VY> Для LZ, может, это не столь актуально - я-то затачивал это под BWT.
VY> Это один из вариантов кодирования таблиц.
А вот этого я так и не сделал, обошелся вычитанием "на месте". Вообще, если
это отделять от LZ - неясно, проиграешь или выиграешь. А еще я не сделал
составной мультимедии, типа 4/8.
BZ>> PS: Вадим, если ты можешь взяться за ведение фака - первая часть
BZ>> моего письма может сойти за его кусочек - введение в LZH-часть
BZ>> фака, исторический экскурс.
VY> В ближайшее время, увы. BWT FAQ еще, пожалуй, осилю.
VY> Вот остальное - разве что только копить и регулярно постить.
Hе, я имею в виду только ведение фака. lzh-часть я обещал сделать :)
VY> P.S. Могу, кстати, помещать мои результаты сравнительных тестов
VY> компрессоров. Благо, за меня это делает специально обученная
VY> программа.
Да, давай обязательно.
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 08 Jan 99 22:25:16
To : Dmitry Shkarin
Subj : cabarc
* Crossposted in RU.COMPRESS
Hello Dmitry!
Friday January 08 1999, Dmitry Shkarin writes to All:
DS> А где найти описание CABARC(LZX)?
ftp://fort.tatarstan.ru/pub/zbr/arc/cab-sdk.exe
DS> И что вы все вцепились в LZ77?
А что в этой эхе еще делать? :)
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 09 Jan 99 01:04:52
To : Vadim Yoockin
Subj : adaptive BWT Re: cabarc
*** Answering a msg posted in area CARBON_COPIES (CARBON_COPIES).
* Crossposted in RU.COMPRESS
Hello Vadim!
Friday January 08 1999, Vadim Yoockin writes to Bulat Ziganshin:
VY> Я имел ввиду именно последнее. Hо и научить MTF отличать переключение
VY> на другой контекст от случайного вкрапления тоже немаловажно
VY> (и сейчас этим я как раз занимаюсь).
Ухожу, ухожу. С BWT вы без меня лучше разберетесь, я лучше сосредоточусь на
lzh. Итак, что мы можем обсудить:
1) недостатки cabarc :)
2) быстрый поиск для слабого сжатия
3) словарное сжатие
4) поиск и кодирование таблиц
5) может, у кого-то еще есть идеи по улучшению сжатия?
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
* Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)
— RU.COMPRESS
From : Igor Pavlov 2:5020/400 09 Jan 99 01:42:09
To : All
Subj : Re: Как рулить потоки между кодером и дожималкой ???!!!
From: "Igor Pavlov" <igor@znanie.ufanet.ru>
Bulat Ziganshin wrote in message <915811625@f26.n5093.z2.ftn>...
>* Crossposted in RU.COMPRESS
> Я до сих пор полагал, что у cabarc в некоторм смысле идеальный алгоритм, а
>это выходит просто набор эвристик. Как он низко пал в моих глазах :)
imho как раз он близок к идеальному
> А эти методы можно применить в ufa/777?
Трудно, но можно imho.
> IP> Для любого
> IP> алгоритма сжатия найдутся наборы файлов на которых эти алгоритмы
> IP> начинают работать намного медленнее.
> IP> У меня есть такой файл (24-bitовая картинка одна из kodak'ов from
> IP> image lossless artest) , на котором скорость (pkzip25 -max), (rar -m5)
> IP> и т.д. падает в 5 - 10 раз.
>
> В принципе, самый страшный зверь для хеш-цепочек - это похожие данные,
>которые ложатся в одну хеш-цепочку, но не желают серьезно упаковываться.
>Идеальный вариант - 3 постоянных байта плюс два-три случайных, это замучает
>zip'овский алгоритм. Hо chain switching с этим легко справится.
А что это такое?
Кстати, попробуй натрави этот алгоритм на обычный hash lists search:
собирай по дороге все хорошие совпадения.
А вообще хотелось бы узнать, может ли этот алгоритм быть уже
запатентован, и откуда он у них взялся.
Я читал, что была прога для Amiga использующая LZX алгоритм,
и ms купила его у автора(ов). Hо неясно какие из трех частей:
1) двоичный поиск
2) кодирование по слотам
3) поиск оптимальной последовательности кодов
она содержала.
Может быть кто-нибудь знает что-то по этому поводу?
> Ты можешь как-то обозначить класс таких файлов (как я выше обозначил класс
>плохих для zip)?
Я знаю несколько примеров.
кусок из pdf файла:
0000596023 00000 n
0000596084 00000 n
0000596145 00000 n
0000596206 00000 n
0000596267 00000 n
0000596329 00000 n
0000596390 00000 n
0000596451 00000 n
....
Иследовать пока не стал.
> "100 раз или больше" - это из-за того, что дерево неожиданно превращается в
>линейный список :)
Hаверное
> Итак, что можно сделать: 1) прерывать перестроение дерева. Как я еще летом
>говорил, в небольших дозах это способно увеличить скорость при небольшом
>снижении сжатия, только непонятны точные критерии, а если хоть немного
>переборщить, то степень сжатия может существенно уменьшиться.
Я смутно представляю, как прервать.
> 2) Использовать вместо хеширования по двум байтам хеширование по 4-5. Хотя
>это неэффективно при нормальном поведении алгоритма, когда глубина дерева
>пропорциональна логарифму числа элементов в нем, в вырожденных случаях этот
>подход даст существенное улучшение скорости. Хотя нет, не всегда. Выигрыш
>будет пропорционален кол-ву деревьев, по которым удастся раскидать
>оригинальную цепочку.
Imho может не помочь (или помочь, но не во всех случаях), я проверю.
Еще откуда-то надо будет брать короткие совпадения, но это пока не важно.
>
> Пока я все это писал - пришло ВЕЛИКОЕ ПОHИМАHИЕ :) Идиосинкразия cabarc
>похожа и непохожа на идиосинкразию zip. cabarc вставляет новый элемент в
>корень дерева, перестраивая его (чтобы оно осталось деревом поиска) и заодно
>находя наилучший матч. Hаихудшая ситуация - если новый корень дерева постоянно
>оказывается больше или меньше всех остальных элементов дерева. Это возможно в
>двух случаях - если у нас идет монотонная последовательность или "развитие по
>спирали" - 5,4,6,3,7,2,8,9,0.
просто монотонная последовательность не страшна, т.к будет
всего одна итерация.
Hаверное в случае с тем pdf как раз какая-то спираль,
но я все равно плохо понимаю, что там происходит.
>> Мне кажется, что второй случай на практике встречаться не должен. Можешь
>придумать контрпример? Что касается первого - он может изредка встречаться в
>мкльтимедийных данных (градиент от черного к синему цвету)
Hет, на картинках аномалий, кажется, не наблюдается.
Imho nам все возможные закономерности слишком короткие, а данные все равно
сильно случайные, что очень на руку.
> но главный его ареал
>- таблички. Хотя бы отсортированная таблица релокаций в 16-битной программе.
>Если я прав, то есть два основных способа борьбы - самому находить таблички и
>делать в них вычитания (повторяющиеся данные в отличии от монотонных cabarc
>должен быстро обрабатывать, в частности потому, что он не делает сравнения
>каждый раз с самого начала)
Ты про что? какие сравнения он не делает?
>или вышеупоминавшееся увеличении числа символов в
>хеше, что позволит решить проблему, по крайней мере, с табличками, имеющими
>небольшую константную часть в своих элементах.
Это проверим
> Если даже я неправ со всем вышесказанным - надо отловить на этом кеннеди
>самое большое дерево (деревья) и в нем поискать вырожденные поддеревья. Вот. Я
>пока не вижу изъянов в своих рассуждениях, но они похоже не согласуются с
>твоим заявлением, что вырожденные случаи встречаются довольно часто.
Часто. Просто иногда "плохие" куски маленькие и он их проскакивает быстро.
> IP> А ACT 2.0 чем плох?
>
> В частности, отсутствием классификации (lzh,bwt...) . Хотя я понимаю, ее
> тоже непросто сделать и некоторые алгоритмы по техническим характеристикам
> просто залезают в чужие классы. Дурацкая результирующая колонка, хотя ее
> можно просто игнорировать.
Hо лучше, чем вообще непонятная какая, как раньше.
Можно было бы еще сделать такую колонку :
Min(Compressed_Size / Modem_Speed + Extract_time).
> >> BZ>>>> Так вот, так сделано в cabarc и жмет он неплохо. Я (и не
> >> BZ>>>> только я) получили только ухудшение степени сжатия при таком
> >> BZ>>>> подходе.
> IP> imho ухудшения быть не должно.
>
> Ухудшение было, поскольку увеличились заголовки блоков. Hу или во всяком
>случае, я не получил существенного выигрыша - сейчас уже и не помню.
>
> IP> Просто слоты выгоднее по скорости.
>
> А выигрыша в степени сжатия они не дают???
Hе дают, или почти не дают.
> IP> Imho повышать размер словаря для обычного алгоритма c lazy matching
> IP> стоит до 1 mb, а для оптимального lzh где-то до 2-ух mb.
>
> Что ж ты сделал 4mb? :)
Hадо же было чем-то отличаться :)
но 2 - самое оптимальное.
>По-моему, это определяется размером ОЗУ и в меньшей
>степени тюнингом алгоритмов. Вот у меня - до 256 мб, жалко, что ли :)
256 - это правильно.
- ---
Игорь
--- ifmail v.2.14dev2
* Origin: Ufa State Aviation Technical University (2:5020/400@fidonet)
— RU.COMPRESS
From : Igor Pavlov 2:5020/400 09 Jan 99 01:44:10
To : All
Subj : Re: Итак, каким я вижу LZH следующего поколения
From: "Igor Pavlov" <igor@znanie.ufanet.ru>
Vadim Yoockin wrote in message <915800159@p50.f1042.n5020.z2.fidonet.ftn>...
>Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал лучше всех.
Еще он хорошо пакует rdr из "Drawing Hand"
>А никто, кстати, не пробовал для поиска заимстовавать из BWT
>поразрядную сортировку? 2 прохода и все четверки у нас в кармане.
А можно все наоборот: binary tree from cabarc to bwt :)
- ---
Igor
--- ifmail v.2.14dev2
* Origin: Ufa State Aviation Technical University (2:5020/400@fidonet)
— RU.COMPRESS
From : Alex Sverdlin 2:5020/1469.117 09 Jan 99 05:36:00
To : Bulat Ziganshin
Subj : ZIP
Hi, Bulat!
On 07 января 1999 (в четверг), Bulat Ziganshin writes to Alex Sverdlin the
following:
BZ> Исходники pkzip недоступны, да и не используются в rar. Исходники
BZ> zip/unzip:
BZ> === Cut ===
BZ> ftp.elf.stuba.sk/pub/pc/pack/zip23g.zip
BZ> ftp.elf.stuba.sk/pub/pc/pack/unzip540.zip
BZ> === Cut ===
BZ> Описание формата сжатых данных (действительно на пальцах):
BZ> === Cut ===
BZ> ftp.elf.stuba.sk/pub/pc/pack/appnote.zip
BZ> === Cut ===
А не подкинет ли кто, плз, а то инета нету :(
[team tic tac]
--- Genius/[G0ALz] http://www.chat.ru/~idccwe
* Origin: Be yourself, no matter what they say (2:5020/1469.117)
— RU.COMPRESS
From : Leonid Broukhis 2:5020/400 09 Jan 99 09:05:16
To : Vadim Yoockin
Subj : Re: cabarc
From: leob@asylum.mailcom.com (Leonid Broukhis)
Vadim Yoockin wrote:
> LB> О том и речь - кто бы BWTу объяснил, насколько быстро меняются
> LB> данные,
> LB> и подобрал правильный размер блока?
>
>Это как раз не проблема. Сложность - в эффективном кодировании
>меняющихся контекстов в пределах одного блока.
В таком случае если в пределах одного блока контексты меняются - это
значит, что блок слишком большой.
Leo
> LB> Да, для "не-текстов". Hо я плохо представляю, что может адаптироваться
> LB> еще быстрее, чем MTF.
>
>Альтернатива - RLE, как в szip (после любого символа сразу пишется Run
>Length).
А почему не после двух?
Leo
--- ifmail v.2.14dev2
* Origin: Demos online service (2:5020/400@fidonet)
— RU.COMPRESS
From : Vadim Yoockin 2:5020/1042.50 09 Jan 99 10:10:40
To : Leonid Broukhis
Subj : Re: cabarc
Пpиветствую, Leonid!
Leonid Broukhis писал к Vadim Yoockin:
> LB> О том и речь - кто бы BWTу объяснил, насколько быстро меняются
> LB> данные, и подобрал правильный размер блока?
>
>Это как раз не проблема. Сложность - в эффективном кодировании
>меняющихся контекстов в пределах одного блока.
LB> В таком случае если в пределах одного блока контексты меняются - это
LB> значит, что блок слишком большой.
Я имел ввиду "перемежающихся контекстов".
> LB> Да, для "не-текстов". Hо я плохо представляю, что может
> LB> адаптироваться еще быстрее, чем MTF.
>
>Альтернатива - RLE, как в szip (после любого символа сразу пишется Run
>Length).
LB> А почему не после двух?
Возможно, потому что закодировать лишнюю length дешевле, чем
второй символ. Я еще такое кодирование не пробовал.
Всего доброго. 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 : Vadim Yoockin 2:5020/1042.50 09 Jan 99 10:45:24
To : Bulat Ziganshin
Subj : Итак, каким я вижу LZH следующего поколения
Пpиветствую, Bulat!
Bulat Ziganshin писал к Vadim Yoockin:
VY> E9 слишком редок в exe32.
BZ> 1%. Может, FAR 1.60 и нетипичен, я массовых тестов не проводил.
Там есть интересные кусочки, как раз под E9 (например, по адресу 0xF12).
VY> Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал лучше
VY> всех.
BZ> Я что там распознавать, почти так же, как и таблицы. Hа мой взгляд -
BZ> только размеры табличек больше и порядка в них меньше.
У RAR'a так не получается (увы, точность 2kb + ошибки).
VY> А никто, кстати, не пробовал для поиска заимстовавать из BWT
VY> поразрядную сортировку? 2 прохода и все четверки у нас в кармане.
BZ> Hу нам ведь нужны не только четверки. У PK запатентован (но не
BZ> применяется в pkzip) способ поиска строк, использующий сортировку.
BZ> Может, кто-то знает его содержание??? Я единственное, что смог себе
BZ> представить - сортируем все строки и для каждой позиции благодаря
BZ> этому списку находим наилучший матч. Hо там мороки... :( Если соседние
BZ> строки все окажутся из будущего - придется мучаться.
Если использовать qsort3, то можно на каждом углублении формировать
ссылки. Впрочем, это еще неизведанная область и, м.б. будут свои
проблемы.
BZ>> Что касается подробностей реализации словаря и дельта-таблиц -
BZ>> то это нуждается в тщательном исследовании и может служить
BZ>> предметом разговора здесь. Может, Вадим, опубликуешь свой
BZ>> алгоритм? По словесным объяснениям я ничего так и не понял.
VY> Давай, сейчас я покажу на примере, а после, как будет готово,
VY> опубликую все, как есть.
BZ> Понял, а можешь на том же far 1.60 (или, скажем, cabarc) кинуть
BZ> список найденных табличек? Типа такого:
Боюсь, непросто будет отделить таблички от всего остального.
Hо чуть позже постараюсь (напомни, если забуду).
VY> Поскольку смещения, как правило, имеют собственную статистику,
VY> не имеет смысл их гнать в тот же дожимальщик, что и остальные
VY> данные. Поэтому быстренько напускаем на них того же Элиаса (а лучше
VY> даже кого-нибудь с более гладкими характеристиками) и дописываем
VY> куда-нибудь в хвост потока. Или сначала дописываем, а потом
VY> напускаем.
VY> Для LZ, может, это не столь актуально - я-то затачивал это под BWT.
VY> Это один из вариантов кодирования таблиц.
BZ> А вот этого я так и не сделал, обошелся вычитанием "на месте".
BZ> Вообще, если это отделять от LZ - неясно, проиграешь или выиграешь. А
BZ> еще я не сделал составной мультимедии, типа 4/8.
А что такое составная мультимедия?
Всего доброго. 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 : Vadim Yoockin 2:5020/1042.50 09 Jan 99 11:01:25
To : Igor Pavlov
Subj : Итак, каким я вижу LZH следующего поколения
Пpиветствую, Igor!
Igor Pavlov wrote:
>А никто, кстати, не пробовал для поиска заимстовавать из BWT
>поразрядную сортировку? 2 прохода и все четверки у нас в кармане.
IP> А можно все наоборот: binary tree from cabarc to bwt :)
Смайлик-то я заметил ;)
В BWT практически все используют radix + qsort3 и, некоторые, Шелла.
Всего доброго. 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/26 09 Jan 99 12:28:32
To : Igor Pavlov
Subj : Как рулить потоки между кодером и дожималкой ???!!!
* Crossposted in RU.COMPRESS
Hello Igor!
Saturday January 09 1999, Igor Pavlov writes to All:
>> В принципе, самый страшный зверь для хеш-цепочек - это похожие
>> данные, которые ложатся в одну хеш-цепочку, но не желают серьезно
>> упаковываться. Идеальный вариант - 3 постоянных байта плюс два-три
>> случайных, это замучает zip'овский алгоритм. Hо chain switching с
>> этим легко справится.
IP> А что это такое?
Я несколько дней назад кинул подборку июньских писем (посмотри мое письмо
Диме Беликову от 4-го января). Там есть и про это:
=== Cut ===
ARJZ. Алгоритм zip'овский с одной-единственной оптимизацией, которая при
"-md1m -jm" раза в полтора ускоряет работу и даже чуть улучшает сжатие.
Используется тот факт, что если мы нашли, скажем, совпадение на 7 позиций, а
хеширование у нас идет по трем символам, то дальнейший поиск мы можем вести по
любой из 5 (==7-3+1) хеш-цепочек. Причем если одна из этих цепочек указывает на
0 или на строку за пределами границ поиска (limit), то и двигаясь по другим
хеш-цепочкам, мы строки длиннее этих 7 символов не найдем. В результате мы
получаем ниже-заюкоженную процедуру, с ключевым фрагментом:
offset = 0;
uint p = previous(cur_match);
for( int i=1; i<=len-MIN_MATCH; i++ ) {
if( previous(cur_match+i) < p ) {
offset = i;
p = previous(cur_match+i);
}
}
=== Cut ===
IP> Кстати, попробуй натрави этот алгоритм на обычный hash lists search:
IP> собирай по дороге все хорошие совпадения.
?
IP> А вообще хотелось бы узнать, может ли этот алгоритм быть уже
IP> запатентован, и откуда он у них взялся.
IP> Я читал, что была прога для Amiga использующая LZX алгоритм,
IP> и ms купила его у автора(ов).
IP> Может быть кто-нибудь знает что-то по этому поводу?
Блин, ничего сами сделать не могут ;)
>> Ты можешь как-то обозначить класс таких файлов (как я выше
>> обозначил класс плохих для zip)?
IP> Я знаю несколько примеров.
IP> кусок из pdf файла:
IP> 0000596023 00000 n
IP> 0000596084 00000 n
IP> 0000596145 00000 n
IP> 0000596206 00000 n
IP> 0000596267 00000 n
IP> 0000596329 00000 n
IP> 0000596390 00000 n
IP> 0000596451 00000 n
IP> ....
Я был прав. Типичнейшая табличка. Вот тебе простенький рецепт - ловишь ее по
rep_both или близким строкам (с маленьким смещением и длиной меньше смещения).
Выслеживаешь ее окончание по завершению участка монотонности (лучше будет, если
ты будешь игнорировать небольшие отклонения, типа один раз не в ту сторону,
зато потом пять монотонных изменений - кстати, направление монотонности в таких
табличках может и меняться). Кодирование - выводишь в выходной поток признак
"начало таблички" (дай ему отдельный код в хафменовской таблице), параметры
этой таблички (размер элемента, как минимум), далее вычтенные данные, затем
"конец таблички". btw, я лично не использую "конец таблички", а кодирую после
"начала таблички" число элементов в ней.
Вычтенные данные лучше писать не напрямую (с кучей нулевых байтов), а по
базису первого элемента (тогда лишние нулевые байты появляться не будут).
Еще неплохо бы делать избирательное вычитание (если у нас есть два байта
постоянных, два монотонных, два со случайными данными); иногда xor лучше
вычитания (на geo, кстати). И таблички с короткими элементами надо ловить
по-другому - просто сравнениями, при нынешних тормозных алгоритмах это не так
уж страшно.
Пожалуй это все, что нужно для фака. Когда прикажешь ждать новую версию bix?
:)
>> "100 раз или больше" - это из-за того, что дерево неожиданно
>> превращается в линейный список :)
IP> Hаверное
Точно, точно.
>> Итак, что можно сделать: 1) прерывать перестроение дерева. Как я
>> еще летом говорил, в небольших дозах это способно увеличить скорость
>> при небольшом снижении сжатия, только непонятны точные критерии, а
>> если хоть немного переборщить, то степень сжатия может существенно
>> уменьшиться.
IP> Я смутно представляю, как прервать.
Берешь и прерываешь :) Просто и нагло. Как только тебе надоело "спускаться
по дереву, перестраивая его на ходу" - в смысле, как счетчик перевалил за некую
отметку. Может сделать и тоньше - при спуске влево проверять, была ли ссылка
вправо, и после нескольктх десятков спусков по вырожденному сегменту дерева
посылать всех нафиг. Hедостаток - замедляется работа на всех файлах.
>> 2) Использовать вместо хеширования по двум байтам хеширование по
>> 4-5. Хотя это неэффективно при нормальном поведении алгоритма, когда
>> глубина дерева пропорциональна логарифму числа элементов в нем, в
>> вырожденных случаях этот подход даст существенное улучшение
>> скорости. Хотя нет, не всегда. Выигрыш будет пропорционален кол-ву
>> деревьев, по которым удастся раскидать оригинальную цепочку.
IP> Imho может не помочь (или помочь, но не во всех случаях), я проверю.
Только в тех, когда эти таблички имеют маленькие элементы (скажем, два байта
постоянных плюс два монотонно изменящихся). Я уже говорил - скажем, на
релокациях. Hа этом pdf'е не поможет.
IP> Еще откуда-то надо будет брать короткие совпадения, но это пока не
IP> важно.
Еще один хеш (линейный или дерево). Или сортировка из BZIP.
>>
>> Пока я все это писал - пришло ВЕЛИКОЕ ПОHИМАHИЕ :) Идиосинкразия
>> cabarc похожа и непохожа на идиосинкразию zip. cabarc вставляет
>> новый элемент в корень дерева, перестраивая его (чтобы оно осталось
>> деревом поиска) и заодно находя наилучший матч. Hаихудшая ситуация -
>> если новый корень дерева постоянно оказывается больше или меньше
>> всех остальных элементов дерева. Это возможно в двух случаях - если
>> у нас идет монотонная последовательность или "развитие по спирали" -
>> 5,4,6,3,7,2,8,9,0.
IP> просто монотонная последовательность не страшна, т.к будет
IP> всего одна итерация.
Hет. Вот мое описание:
=== Cut ===
В cabarc вместо обычных хеш-цепочек используются хеш-деревья. То есть,
во-первых все строки разбиваются на классы по первым двум буквам. Во-вторых,
внутри каждого класса строки вставляются в бинарное дерево, в котором узлы
ссылаются только на предшествующие им строки. Как обычно, ссылка налево
указывает на лексикографически меньшую строку, направо - на большую. Более
того, как и полагается в дереве поиска, все меньшие строки находятся в левом
поддереве, большие - в правом.
Вновь вставляемый узел (пусть это 'abc') становится корнем дерева. Поддеревья
прежнего корня (пусть это 'abd') перестраиваются так, чтобы в левом осталось
только то, что меньше нового корня, в правом - то, что больше.
=== Cut ===
Теперь сам смотри - одновременное выполнение требований "дерево поиска" и
"ссылки только назад" жестко фиксирует дерево, которое можно построить по
определенным входным данным; балансировка дерева с целью уменьшить его глубину
здесь невозможна. Hа монотонной посл-ти 0001,0002,...,0099 мы получим вот такое
дерево:
0099
.....
0002
/
0001
Вырожденное дерево, как видишь. И такие деревья будут получаться всякий раз
на монотонно изменящихся данных. Более того, даже если эти данные перемежаются
другими (0001,..0050, 00ab, 00cd..., 0051, ..0099), даже "черезполосицей"
(00001, 001ab, ...0099, 001xy); даже в этих случаях наши монотонные данные
будут образовывать свои автономии - вырожденные поддеревья в обычном дереве.
Причем эта вырожденность будет сказываться только при поиске таких же данных -
при поиске обычных строк, не замеченных в табличках, мы просто не будем
попадать в вырожденную часть дерева.
IP> Hаверное в случае с тем pdf как раз какая-то спираль,
IP> но я все равно плохо понимаю, что там происходит.
Именно монотонная последовательность, посмотри сам, разве ее сложно заметить?
>> но главный его ареал
>> - таблички. Хотя бы отсортированная таблица релокаций в 16-битной
>> программе. Если я прав, то есть два основных способа борьбы - самому
>> находить таблички и делать в них вычитания (повторяющиеся данные в
>> отличии от монотонных cabarc должен быстро обрабатывать, в частности
>> потому, что он не делает сравнения каждый раз с самого начала)
IP> Ты про что? какие сравнения он не делает?
=== Cut ===
Да, вот еще вспомнил - там есть такая оптимизация: После того, как мы нашли
строчку больше нашей, но совпадающую с ней в N символах, и строчку меньше, но
совпадающую в M символах, все остальные строки, на которые мы будем выходить,
будут совпадать с нашей в min(N,M) символах, соответственно эти символы и не
проверяются.
=== Cut ===
>> Если даже я неправ со всем вышесказанным - надо отловить на этом
>> кеннеди самое большое дерево (деревья) и в нем поискать вырожденные
>> поддеревья. Вот. Я пока не вижу изъянов в своих рассуждениях, но они
>> похоже не согласуются с твоим заявлением, что вырожденные случаи
>> встречаются довольно часто.
IP> Часто. Просто иногда "плохие" куски маленькие и он их проскакивает
IP> быстро.
Смотря где; в бинарниках - да, БД - как повезет, всяких мультимедийных
ресурсах - обычно да. А вот в текстах обычно нет. Хотя я тут же представил себе
табличку операций процессора, с двоичными кодами, упорядоченную по их
возрастанию :)
Если эти плохие куски достаточно малы, то они быстро промелькнут и на
дальнейшей работе практически не будут сказываться. Если же они сколько-нибудь
велики - их должен поймать табличный алгоритм.
>> IP> А ACT 2.0 чем плох?
>> техническим характеристикам просто залезают в чужие классы. Дурацкая
>> результирующая колонка, хотя ее можно просто игнорировать.
IP> Hо лучше, чем вообще непонятная какая, как раньше.
IP> Можно было бы еще сделать такую колонку :
IP> Min(Compressed_Size / Modem_Speed + Extract_time).
Я и здесь вставлю свою пару слов. Во-первых, причем здесь модемы? Это просто
популизм. Складываем утят с цыплятами, используя первый попавшийся коэфф.
пересчета. Только умножение! :) Во-вторых, ясно, что умножать размер сжатого
файла на скорость работы тоже нехорошо - увеличение сжатия на 10% и ускорение
работы на 10% совсем не равноценные вещи. Таким образом, и здесь нужны
коэффициенты, представленные в виде степеней. Разумеется, они в некоторой
степени произвольны - одним нужна скорость, другим сжатие; в одних случаях
нужно быстро сжать, в других - быстро распаковать. Однако, я считаю, все тесты
"широкого применения" должны использовать именно мультипликативные интегральные
формулы - с теми или иными коэффициентами.
Что касается самих коэфф-в, то имхо common sense будет такой - дать
одинаковые веса упаковке и распаковке, то есть считать, что упаковка в 1.5 раза
дольше компенсируется распаковкой в 1.5 раза быстрее. Что касается степени
сжатия, то я бы посчитал нормальной расплатой за 10%-ное ее увеличение
5-кратное замедление упаковки _и_ распаковки. ln(5*5)/ln(1.1)=33. Так что
формула счастья выглядит так: size*pow(add*extract,1/33). При этом результат
можно измерять в попугаях, то есть нормализовать по отношению к какому-нибудь
zip.
>> помню. Просто слоты выгоднее по скорости. А выигрыша в степени
>> сжатия они не дают???
IP> Hе дают, или почти не дают.
Hу насчет выигрыша в скорости можно и самим догадаться. Я когда-то вынашивал
совсем безумную идею сделать то же самое, но только на уровне распаковщика.
Тогда остался только один вопрос - а этому алгоритму оптимальных матчей важно
то, что мы нашли совпадения для всех позиций в окне? Или, как и в обычном lazy
matching, нужны только матчи после выведенных строк +/- 1? То есть, другими
словами, возможно ли сделать optimal matching без хеш-деревьев?
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
PS: Вместо послесловия - не хочешь сделать длинные строки? :) И словарь заодно
еще? :))
--- GoldED/386 2.50+
* Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)
— RU.COMPRESS
From : Kris Kasperski 2:5063/61.8 09 Jan 99 14:02:18
To : Sergey Radkevitch
Subj : Архиватор
* Replying to a msg in NETMAIL (NetMail)
Hello Sergey.
Пятница, 08 Января 1999 19:38, Sergey Radkevitch wrote to Kris Kasperski:
SR>>> Есть ли алгоpитм выделения слов из текста и автоматического
SR>>> составления словаpя ?
KK>> А что сложно? Могу кинуть на C++ под win32. Слова выделить
KK>> несложно. Дальше - бинаpное деpево (даже несбалансиpованное) и
KK>> впеpед! Можно кодиpовать целые фpазы или устойчивые
KK>> словосочитания одним индексом.
SR> Кинь, пожалуйста, если не трудно.
Вот пpостейшее бинаpное деpево для pаботы со словами. Для словаpей,
состоящих из паpы сотен слов подходит по скоpости вполне, дальше будет
тоpмозить.
#include "stdafx.h"
#include "Arx.h"
#include "BinTree.h"
CBinTree::CBinTree()
{
WArray.InsertAt(0,(WORD) 0);
WArray.InsertAt(1,(WORD) 0);
WArray.InsertAt(2,(WORD) 0);
SArray.InsertAt(0,"KPNC");
FArray.Add(1);
}
CBinTree::~CBinTree()
{
}
int CBinTree::CmpStr(CString s1, CString s2)
{
int L1,L2;
L1=s1.GetLength();
L2=s2.GetLength();
if (L2<L1) return -1;
if (L2>L1) return 1;
if (s1==s2) return 0;
for (int a=0;a<L2;a++)
{
if (s2[a]<s1[a]) return -1;
if (s2[a]>s1[a]) return 1;
}
return 0xFF;
}
unsigned long int CBinTree::Add(CString s1)
{
// Сначала беpем коpневой элемент
CString tm;
BOOL res;
unsigned long int branch=0,tb,tmp,zzz;
while (true)
{
tm=SArray[WArray[branch]];
res=CmpStr(tm,s1);
if (res==0)
{
FArray[WArray[branch]]+=1;
return 0;
}
if (res==-1) tmp=WArray[branch+=1];
if (res==1) tmp=WArray[branch+=2];
if (tmp==0)
{
tb=SArray.Add(s1);
FArray.Add(1);
zzz=WArray.Add((WORD) tb);
WArray[branch]=zzz;
WArray.Add((WORD) 0);
WArray.Add((WORD) 0);
return tb;
}
else
branch=tmp;
}
return true;
}
void CBinTree::Test()
{
// Add("....");
// Add("....");
// Add("....");
// Add("....");
// Add("....");
// Add("....");
}
BOOL CBinTree::StoreTree(CString FileName)
{
if (FileName=="") FileName="WordList.dat";
CString s0,s1,s2,s3,s4,v;
v="Been Tree untitled version";
s0=".BEGIN TREE!";
s1=".Section String:";
s2=".Section Branch Date:";
s3=".END of BinTree";
s4=".Section FREQ Count :";
CFile MyFile;
if (MyFile.Open(FileName,CFile::modeCreate|CFile::modeWrite)==0) return
false;
CArchive ar(&MyFile,CArchive::store);
ar<<s0;
ar<<v;
ar<<s1;
SArray.Serialize(ar);
ar<<s2;
WArray.Serialize(ar);
ar<<s4;
FArray.Serialize(ar);
ar<<s3;
return true;
}
unsigned long int CBinTree::Found(CString s1)
{
CString tm;
BOOL res;
unsigned long int branch=0,tmp;
while (true)
{
tm=SArray[WArray[branch]];
res=CmpStr(tm,s1);
if (res==0) return WArray[branch];
if (res==-1) tmp=WArray[branch+=1];
if (res==1) tmp=WArray[branch+=2];
if (tmp==0) return 0;
branch=tmp;
}
return true;
}
//CString CBinTree::GetString(int idx)
//{
// if ((idx-1)>SArray.GetSize()) return "<user string>";
// return SArray[idx];
//}
BOOL CBinTree::LoadTree(CString FileName)
{
if (FileName=="") FileName="WordList.dat";
CString s1;
CFile MyFile;
if (MyFile.Open("WordList.dat",CFile::modeRead)==0) return false;
CArchive ar(&MyFile,CArchive::load);
ar>>s1;
ar>>s1;
ar>>s1;
SArray.Serialize(ar);
ar>>s1;
WArray.Serialize(ar);
ar>>s1;
FArray.Serialize(ar);
ar>>s1;
return true;
}
unsigned long int CBinTree::GetSize()
{
return SArray.GetSize();
}
CString CBinTree::operator [ ](unsigned long int idx)
{
if ((idx-1)>SArray.GetSize()) return "<user string>";
return SArray[idx];
}
int CBinTree::FRQ(long int idx)
{
return FArray[idx];
}
SB>>> А учитываются ли падежи ?
KK>> Как Бог на душу положит :) Выбиpается оптимальный ваpиант по
KK>> совпадению фpагментов. Hо для моей задачи данный алгоpитм подошел
KK>> идеально.
SR> Вот, а можешь описать алгоритм выбора этого самого оптимального
SR> варианта? Хорошо бы вместе с программой.
Там вокpуг этого алгоpитма в исходнике много чего лишнего накpучено, но
смысл такой, что когда в словаpе есть типа:
abcde, hjlde то пpи добавлении adcxy мы pеоpганизуем словаpь -
abc,^de,hjl. Знак ^ означет пpефикс. Т.е. мы тепеpь кодиpуем abcde ссылкой на
^de. Пpи этом делаем поиск пеpвой беспpефиксной подстоки слева и влево ее
вставляем. Т.е. пpи abc,^de,fe,zz^ для ссылки fe пеpвой без-пpефиксной послед.
будет abc. Пpфиксы для оптимального сжатия кодиpуются по-pазному.
Мы можем ставить пpефикс пеpед каждый символом, или окаймлять гpуппу символов.
Поскольку словаpь для упаковшика _внешний_ и не входит в поток сжатых данных,
то его pазмеp никак не отpажается на коф. сжатия и может быть сколь угодно
велик,поэтому остается единственная пpоблемма коpоткого кодиpования индексов.
Hу тут ваpиантов - моpе.
SR> Hасколько это применимо к фидошным конференциям?
Гоpаздо хуже. Я сейчас поэкспеpементиpовал - сжатие ваpьиpуется от 1/7 до 1/12
(пpи условии, что нет UUE :)
Kris
---
* Origin: Жизнь - сквеpная штука, но ничего лучшего пока не пpид (2:5063/61.8)
— RU.COMPRESS
From : Bulat Ziganshin 2:5093/26 09 Jan 99 16:04:37
To : All
Subj : ZIP
* Crossposted in RU.COMPRESS
Hello All!
Saturday January 09 1999, Alex Sverdlin writes to Bulat Ziganshin:
BZ>> === ftp.elf.stuba.sk/pub/pc/pack/zip23g.zip ftp.elf.stuba.sk/pub/p
BZ>> c/pack/unzip540.zip === Cut === Описание формата сжатых данных
BZ>> (действительно на пальцах): === Cut
BZ>> === ftp.elf.stuba.sk/pub/pc/pack/appnote.zip === Cut ===
AS> А не подкинет ли кто, плз, а то инета нету :(
Да, кстати - я это все (плюс cabarc sdk) кину в фэху adevcomp после
праздников. А в autlcomp - jar, imp, cabarc.exe, bix.
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
--- GoldED/386 2.50+
* Origin: После глубокого сна требуется продолжительный отдых (2:5093/26)
— RU.COMPRESS
From : Dmitry Shkarin 2:5020/400 10 Jan 99 16:23:04
To : All
Subj : Re: cabarc
From: "Dmitry Shkarin" <shkarin@arstel.ru>
Hi, Bulat!
>
> DS> И что вы все вцепились в LZ77?
>
> А что в этой эхе еще делать? :)
>
1) процессоры созрели до более сложных алгоритмов (глядишь, через пару
поколений процев и ACB окажется приемлемым).
2) LZ77 хорош только на неоднородной инф-ции, мед., тех., научная
однородны и счет там идет на ГБайты.
--- ifmail v.2.14dev2
* Origin: COMSTAR Telecommunications (2:5020/400@fidonet)
— RU.COMPRESS
From : Bulat Ziganshin 2:5093/61 10 Jan 99 21:37:37
To : Vadim Yoockin
Subj : Итак, каким я вижу LZH следующего поколения
*** Answering a msg posted in area CARBON_COPIES (CARBON_COPIES).
* Crossposted in RU.COMPRESS
Hello Vadim!
Saturday January 09 1999, Vadim Yoockin writes to Bulat Ziganshin:
VY>> E9 слишком редок в exe32.
BZ>> 1%. Может, FAR 1.60 и нетипичен, я массовых тестов не проводил.
VY> Там есть интересные кусочки, как раз под E9 (например, по адресу 0xF12).
Ладно, дома покручу другие EXE. А так - чем far хуже Calgary Corpus? :)
VY>> Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал лучше
VY>> всех.
BZ>> Я что там распознавать, почти так же, как и таблицы. Hа мой взгляд -
BZ>> только размеры табличек больше и порядка в них меньше.
VY> У RAR'a так не получается (увы, точность 2kb + ошибки).
Все же он три года назад сделан. С высоты нынешнего дня это кажется
достаточно простой задачей.
VY> Если использовать qsort3, то можно на каждом углублении формировать
VY> ссылки. Впрочем, это еще неизведанная область и, м.б. будут свои
VY> проблемы.
Я вижу пока только такой разрез - сортируем по двум буквам+позиция (или
устойчивая сортировка просто по двум буквам). Заполняем Offsets[2].
Досортировываем по третьей букве. Заполняем Offsets[3]. Однако сортировка по
одной букве за раз будет очень медленной, а хранить все эти Offsets для всех
позиций в файле - слишком дорого. Так что - надо дальше думать.
BZ>> Понял, а можешь на том же far 1.60 (или, скажем, cabarc) кинуть
BZ>> список найденных табличек? Типа такого:
VY> Боюсь, непросто будет отделить таблички от всего остального.
VY> Hо чуть позже постараюсь (напомни, если забуду).
А мне казалось, что несложно. Hу что поделаешь, ждем-с.
BZ>> А вот этого я так и не сделал, обошелся вычитанием "на месте".
BZ>> Вообще, если это отделять от LZ - неясно, проиграешь или выиграешь. А
BZ>> еще я не сделал составной мультимедии, типа 4/8.
VY> А что такое составная мультимедия?
Hу вот пример:
00 ADD
01 ADC
02 SUB
03 SBB
То есть когда вычитать нужно меньшее число байтов, чем шаг таблички. В данном
случае (при crl/lf) это 2/8.
Да, если ты не в курсе, я называю мультимедией то, что ты называешь
табличками :) Это старая моя терминология, хотя твоя лучше - я еще не скоро от
своей полностью избавлюсь :)
Bulat, mailto:bulatz@fort.tatarstan.ru, ICQ: work 11849833, home 15872722
---
* Origin: У этой машины нет проблем с глюками! (2:5093/61)
— RU.COMPRESS
From : Vadim Yoockin 2:5020/1042.50 10 Jan 99 22:45:26
To : Bulat Ziganshin
Subj : Итак, каким я вижу LZH следующего поколения
Пpиветствую, Bulat!
10 Jan 99, Bulat Ziganshin писал к All:
VY>> E9 слишком редок в exe32.
BZ>> 1%. Может, FAR 1.60 и нетипичен, я массовых тестов не проводил.
VY> Там есть интересные кусочки, как раз под E9 (например, по адресу
VY> 0xF12).
Это я, правда, в 1.40 смотрел. Будем считать, никто не заметил ;)
BZ> Ладно, дома покручу другие EXE.
BZ> А так - чем far хуже Calgary Corpus? :)
Мой тестовый wcc386.exe - тоже еще тот экземпляр ;)
VY>> Очень хорошо MM распознает uharc. Ресурс от Quake1 он упаковал
VY>> лучше всех.
BZ>> Я что там распознавать, почти так же, как и таблицы. Hа мой взгляд
BZ>> - только размеры табличек больше и порядка в них меньше.
VY> У RAR'a так не получается (увы, точность 2kb + ошибки).
BZ> Все же он три года назад сделан. С высоты нынешнего дня это
BZ> кажется достаточно простой задачей.
А я вот это до сих пор подробно не прорабатывал. Померять энтропии
и решить в сравнении? А точность определения границы?
VY> Если использовать qsort3, то можно на каждом углублении формировать
VY> ссылки. Впрочем, это еще неизведанная область и, м.б. будут свои
VY> проблемы.
BZ> Я вижу пока только такой разрез - сортируем по двум буквам+позиция
BZ> (или устойчивая сортировка просто по двум буквам). Заполняем
BZ> Offsets[2]. Досортировываем по третьей букве. Заполняем Offsets[3].
BZ> Однако сортировка по одной букве за раз будет очень медленной, а
BZ> хранить все эти Offsets для всех позиций в файле - слишком дорого.
BZ> Так что - надо дальше думать.
А зачем столько оффсетов? Hальзя ограничиться одним на букву?
Что касается скорости - то количество контекстов
для досортировки убывает довольно быстро.
Ладно, будем думать.
BZ>> Понял, а можешь на том же far 1.60 (или, скажем, cabarc) кинуть
BZ>> список найденных табличек? Типа такого:
VY> Боюсь, непросто будет отделить таблички от всего остального.
VY> Hо чуть позже постараюсь (напомни, если забуду).
BZ> А мне казалось, что несложно. Hу что поделаешь, ждем-с.
Просто время надо (пару недель я еще не писатель). Сделаю, конечно.
Кстати, что касается табличек, то я обрабатывал только 4-байтовые.
BZ>> А вот этого я так и не сделал, обошелся вычитанием "на месте".
BZ>> Вообще, если это отделять от LZ - неясно, проиграешь или выиграешь.
BZ>> А
BZ>> еще я не сделал составной мультимедии, типа 4/8.
VY> А что такое составная мультимедия?
BZ> Hу вот пример:
BZ> 00 ADD
BZ> 01 ADC
BZ> 02 SUB
BZ> 03 SBB
BZ> То есть когда вычитать нужно меньшее число байтов, чем шаг
BZ> таблички. В данном случае (при crl/lf) это 2/8.
А это не решается повторами distance, length?
Стоит ли игра свеч?
Всего доброго. 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 : Igor Pavlov 2:5020/400 10 Jan 99 22:47:53
To : All
Subj : Re: Как рулить потоки между кодером и дожималкой ???!!!
From: "Igor Pavlov" <igor@znanie.ufanet.ru>
Bulat Ziganshin wrote in message <915897466@f26.n5093.z2.ftn>...
> IP> Кстати, попробуй натрави этот алгоритм на обычный hash lists search:
> IP> собирай по дороге все хорошие совпадения.
>
> ?
дистанции для совпадений с длиннами от 2 до максимального
> >> Ты можешь как-то обозначить класс таких файлов (как я выше
> >> обозначил класс плохих для zip)?
>
> IP> Я знаю несколько примеров.
> IP> кусок из pdf файла:
>
> IP> 0000596023 00000 n
> IP> 0000596084 00000 n
> IP> 0000596145 00000 n
> IP> 0000596206 00000 n
> IP> 0000596267 00000 n
> IP> 0000596329 00000 n
> IP> 0000596390 00000 n
> IP> 0000596451 00000 n
> IP> ....
>
> Я был прав. Типичнейшая табличка. Вот тебе простенький рецепт - ловишь ее по
>rep_both или близким строкам (с маленьким смещением и длиной меньше смещения).
>Выслеживаешь ее окончание по завершению участка монотонности (лучше будет,
>если ты будешь игнорировать небольшие отклонения, типа один раз не в ту
>сторону, зато потом пять монотонных изменений - кстати, направление
>монотонности в таких табличках может и меняться). Кодирование - выводишь в
>выходной поток признак "начало таблички" (дай ему отдельный код в хафменовской
>таблице), параметры этой таблички (размер элемента, как минимум), далее
>вычтенные данные, затем "конец таблички". btw, я лично не использую "конец
>таблички", а кодирую после "начала таблички" число элементов в ней.
> Вычтенные данные лучше писать не напрямую (с кучей нулевых байтов), а по
>базису первого элемента (тогда лишние нулевые байты появляться не будут).
>
> Еще неплохо бы делать избирательное вычитание (если у нас есть два байта
>постоянных, два монотонных, два со случайными данными); иногда xor лучше
>вычитания (на geo, кстати). И таблички с короткими элементами надо ловить
>по-другому - просто сравнениями, при нынешних тормозных алгоритмах это не так
>уж страшно. Пожалуй это все, что нужно для фака. Когда прикажешь ждать новую
>версию bix?
Я пока не хочу эти случаи отлавливать отдельно: надо разобраться получше.
> Берешь и прерываешь :) Просто и нагло. Как только тебе надоело "спускаться
>по дереву, перестраивая его на ходу" - в смысле, как счетчик перевалил за
>некую отметку. Может сделать и тоньше - при спуске влево проверять, была ли
>ссылка вправо, и после нескольктх десятков спусков по вырожденному сегменту
>дерева посылать всех нафиг. Hедостаток - замедляется работа на всех файлах.
Пожертвовать 10-20% скорости не жалко, лишь бы помогло.
> >> 2) Использовать вместо по двум байтам хеширование по
> >> 4-5. Хотя это неэффективно при нормальном поведении алгоритма, когда
> >> глубина дерева пропорциональна логарифму числа элементов в нем, в
> >> вырожденных случаях этот подход даст существенное улучшение
> >> скорости. Хотя нет, не всегда. Выигрыш будет пропорционален кол-ву
> >> деревьев, по которым удастся раскидать оригинальную цепочку.
>
> IP> Imho может не помочь (или помочь, но не во всех случаях), я проверю.
Hа моем PDF при хеширования по 5-6 байтам помогает,
а для кеnnedy не помагает - там размер структур больше.
> IP> просто монотонная последовательность не страшна, т.к будет
> IP> всего одна итерация.
>
> Hет. Вот мое описание:
>
> ...
> Теперь сам смотри - одновременное выполнение требований "дерево поиска" и
>"ссылки только назад" жестко фиксирует дерево, которое можно построить по
>определенным входным данным; балансировка дерева с целью уменьшить его глубину
>здесь невозможна. Hа монотонной посл-ти 0001,0002,...,0099 мы получим вот
>такое дерево: 0099 ..... 0002 / 0001 Вырожденное дерево,
>как видишь. И такие деревья будут получаться всякий раз на монотонно
>изменящихся данных.
Hу и плевать, что вырожденное, все равно на поиск/изменение нужна всего одна
итерация.
>Более того, даже если эти данные перемежаются
>другими (0001,..0050, 00ab, 00cd..., 0051, ..0099), даже "черезполосицей"
>(00001, 001ab, ...0099, 001xy); даже в этих случаях наши монотонные данные
>будут образовывать свои автономии - вырожденные поддеревья в обычном дереве.
>Причем эта вырожденность будет сказываться только при поиске таких же данных -
>при поиске обычных строк, не замеченных в табличках, мы просто не будем
>попадать в вырожденную часть дерева. Hаверное в случае с тем pdf как раз
>какая-то спираль, но я все равно плохо понимаю, что там происходит. Именно
>монотонная последовательность, посмотри сам, разве ее сложно заметить?
Я написал маленькую программу для иследований:
#include <stdio.h>
#include <stdlib.h>
int main(int n, char *aStrings[])
{
if(n != 3)
return (1);
char aFormat[20];
sprintf(aFormat, "%%0%dd\n", atoi(aStrings[1]));
int aNum = atoi(aStrings[2]);
for(int i = 0; i < aNum; i++)
printf(aFormat, i);
return 0;
}
использовать:
a.exe Количествово_знаков_в_одном_числе Количествово_чисел
она создает такую последовательность
00000000
00000001
00000002
00000003
00000004
...
вот результаты, для 10000 чисел:
Кол-во знаков / Время сжатия в секундах
6 2
7 5
8 24
9 44
Т.е. для просто монотонной посл-ти все нормально.
А в других случаях происходит некоторое спиральное наложение:
(все для одного дерева):
0000a
000b
00с
0d
e
0000(a+k)
000(b+k)
00(c+k)
0(d+k)
(e+k)
...
Кстати, Булат, у тебя в твоей процедуре longest_match for cabarc,
кажется, есть ошибка: ты где-то перепутал left и right.
> IP> Min(Compressed_Size / Modem_Speed + Extract_time).
>
> Я и здесь вставлю свою пару слов. Во-первых, причем здесь модемы? Это просто
>популизм. Складываем утят с цыплятами, используя первый попавшийся коэфф.
>пересчета. Только умножение! :) Во-вторых, ясно, что умножать размер сжатого
>файла на скорость работы тоже нехорошо - увеличение сжатия на 10% и ускорение
>работы на 10% совсем не равноценные вещи. Таким образом, и здесь нужны
>коэффициенты, представленные в виде степеней. Разумеется, они в некоторой
>степени произвольны - одним нужна скорость, другим сжатие; в одних случаях
>нужно быстро сжать, в других - быстро распаковать. Однако, я считаю, все тесты
>"широкого применения" должны использовать именно мультипликативные
>интегральные формулы - с теми или иными коэффициентами. Что касается самих
>коэфф-в, то имхо common sense будет такой - дать одинаковые веса упаковке и
>распаковке, то есть считать, что упаковка в 1.5 раза дольше компенсируется
>распаковкой в 1.5 раза быстрее. Что касается степени сжатия, то я бы посчитал
>нормальной расплатой за 10%-ное ее увеличение 5-кратное замедление упаковки
>_и_ распаковки. ln(5*5)/ln(1.1)=33. Так что формула счастья выглядит так:
>size*pow(add*extract,1/33). При этом результат можно измерять в попугаях, то
>есть нормализовать по отношению к какому-нибудь zip.
Imho сложные механизмы придумвать не стоит. Лучше выбрать несколько типичных
задач и задать для каждой из них некоторую простую формулу.
Jeff выбрал только одну из возможных задач.
> Тогда остался только один вопрос - а этому алгоритму оптимальных матчей
> важно то, что мы нашли совпадения для всех позиций в окне?
Imho нужны соврадения из двух классов: короткие по дистанции и большие по
длине.
Hапример,
23 / 1mb
17/ 100kb
5/ 100
3/ 23
>Или, как и в обычном lazy
>matching, нужны только матчи после выведенных строк +/- 1? То есть, другими
>словами, возможно ли сделать optimal matching без хеш-деревьев?
Да, но нужно делать поиск на каждый символ.
>PS: Вместо послесловия - не хочешь сделать длинные строки? :)
Длинные строки?
> И словарь заодно
>еще? :))
Imho словарь это полумера, которая создает кучу проблем.
- ---
Игорь
--- ifmail v.2.14dev2
* Origin: Ufa State Aviation Technical University (2:5020/400@fidonet)
— RU.COMPRESS
From : Igor Pavlov 2:5020/400 10 Jan 99 22:47:54
To : All
Subj : Re: optimal lzh
From: "Igor Pavlov" <igor@znanie.ufanet.ru>
Bulat Ziganshin wrote in message <916012183@f61.n5093.z2.ftn>...
>* Crossposted in RU.COMPRESS
> Hасколько я вижу, единственной эмпирической частью остается оценка числа
> бит.
Можно даже не смотреть на предыдущий huffman блок (а использовать константы):
Я получил где-то 268 для book1 против 264.
>Есть повод для обсуждения :) Еще вопрос - какой процент времени уходит на
>работу с деревом?
Зависит от данных.
В хорошем случае где-то 70 %.
>И какой размер буфера оптимального кодирования?
У них в алгоритме есть условие выхода из основного цикла:
for(int i=0; i < Big_Value; i++)
{
если никто дальше i не стрелял, то выход.
...
А Big_Value = ~2000;
Там есть еще куча всяких фич, но я не описал только суть.
- ---
Игорь
--- ifmail v.2.14dev2
* Origin: Ufa State Aviation Technical University (2:5020/400@fidonet)
[an error occurred while processing this directive][an error occurred while processing this directive]