Subject: BWT-FAQ[1/8] Date: Thu, 3 May 2001 13:42:47 +0000 (UTC) From: "Vadim Yoockin" Newsgroups: fido7.ru.compress Burrows Wheeler Transform AKA Block-Sorting Lossless Data Compression Algorithm. Review and Frequently Asked Questions. Преобразование Бэрроуза-Уилера или Алгоритм сжатия информации без потерь, основанный на сортировке блока данных. Обзор и ЧАсто задаваемые ВОпросы. Автор статьи - Юкин Вадим (Vadim Yoockin). (yoockinv@mtu-net.ru, vy@thermosyn.com, 2:5020/1042.50). Редакция от 24.01.2001 Добавлено/расширено/изменено: - Сравнение компрессоров - Методы сортировки - Модели кодирования - Distance coding - Описание существующих BWT-компрессоров - Что такое MTF? - Как выбрать направление сортировки? - Как избежать зацикливания при сравнении строк? - Какой лучше выбрать размер блока? - А что, если использовать не последний столбец? - Что такое "reordering" и зачем он нужен? - Расширен список литературы для самого искушенного читателя - Изменен пример преобразования В перспективе: - более подробное описание преобразования Шиндлера - <здесь могло бы быть ваше предложение :)> Содержание. 1. BWT - что, собственно, это такое? 2. За счет мы можем добиться хорошего сжатия? 3. Возможно ли обратное преобразование? 4. Schindler Transform. 5. Чем компрессоры, использующие этот метод, лучше/хуже остальных? 6. Методы сортировки, используемые в BWT-компрессорах. 7. Hекоторые вопросы, которые действительно FAQ. 1) Что такое MTF? 2) Зачем используется MTF? 3) Как выбрать направление сортировки? 4) Как избежать зацикливания при сравнении строк? 5) Какой лучше выбрать размер блока? 6) А что, если использовать не последний столбец, а третий, второй, первый и т.п.? 7) Что такое "reordering" и зачем он нужен? 8) Hужен ли RLE? 8. Методы сжатия и модели, используемые в BWT и ST-компрессорах. 9. Distance coding. 10. Что такое 1-2 coding? 11. Какие существуют компрессоры/архиваторы на основе BWT и ST? 12. Сравнительная таблица BWT-компрессоров. 13. Литература. 1. BWT - что, собственно, это такое? Это обратимый алгоритм перестановки символов во входном потоке, позволяющий эффективно сжать полученный в результате преобразования блок данных. Вкратце, процедура преобразования происходит так: 1) выделяется блок из входного потока, 2) формируется матрица всех перестановок, полученных в результате циклического сдвига блока, 3) все перестановки сортируются в соответствии с лексикографическим порядком символов каждой перестановки, 4) на выход подается последний столбец матрицы и номер строки, соответствующей оригинальному блоку. Теперь рассмотрим эту процедуру подробнее. Для примера возьмем ставшую привычной по многим статьям, посвященным описываемому алгоритму, строку "абракадабра". Как и обещалось, выполним циклические сдвиги для получения упомянутых перестановок. абракадабра бракадабраа ракадабрааб акадабраабр кадабраабра адабраабрак дабраабрака абраабракад браабракада раабракадаб аабракадабр Затем отсортируем полученные строки, предварительно пометив исходную. аабракадабр абраабракад ==> абракадабра - исходная строка адабраабрак акадабраабр браабракада бракадабраа дабраабрака кадабраабра раабракадаб ракадабрааб Таким образом, в результате преобразования, взяв последний столбец, мы получили строку "рдакраааабб" и номер исходной строки в отсортированной матрице - 2 (считая с 0). Можно заметить, поскольку использовался сдвиг циклический, символы последнего столбца предшествуют продолжениям, по которым матрица сортировалась. Эти продолжения далее будут называться контекстами. 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. Возможно ли обратное преобразование? Итак, у нас есть строка "рдакраааабб". Из нее нам надо получить ту же самую матрицу сортированных строк, которую мы использовали когда делали исходное преобразование. Если нам отсортировать символы последнего столбца матрицы перестановок - а перед началом обратного преобразования нам известен только он - то мы получим первый столбец данной матрицы, поскольку, напомню, строки матрицы были отсортированы в лексикографическом порядке. 0 а.........р 1 а.........д 2 а.........а 3 а.........к 4 а.........р 5 б.........а 6 б.........а 7 д.........а 8 к.........а 9 р.........б 10 р.........б Известно, что символы последнего столбца предшествуют символам первого, находящимся в той же строке (напомню, использовался циклический сдвиг). Таким образом, мы имеем уже список пар, состоящих из символа последнего столбца и следующего за ним символа первого столбца. После сортировки этих пар мы обретаем знание о двух первых столбцах матрицы. И т.д., пока мы не получим всю матрицу перестановок. 0 аа........р ааб.......р аабр......р аабракада.р аабракадабр 1 аб........д абр.......д абра......д абраабрак.д абраабракад 2 аб........а абр.......а абра......а абракадаб.а абракадабра 3 ад........к ада.......к адаб......к адабраабр.к адабраабрак 4 ак........р ака.......р акад......р акадабраа.р акадабраабр 5 бр........а бра.......а браа......а ... браабрака.а браабракада 6 бр........а бра.......а брак......а бракадабр.а бракадабраа 7 да........а даб.......а дабр......а дабраабра.а дабраабрака 8 ка........а кад.......а када......а кадабрааб.а кадабраабра 9 ра........б раа.......б рааб......б раабракад.б раабракадаб 10 ра........б рак.......б рака......б ракадабра.б ракадабрааб Зная номер исходной строки, мы воспроизводим входные данные. Конечно, на самом деле нет необходимости воспроизводить посимвольно все строки матрицы по одному символу. Можно заметить, что при каждом проявлении доселе неизвестного столбца выполнялись одни и те же действия. А именно, из строки, начинающейся с некоторого символа последнего столбца получалась строка, в которой этот символ находится на первой позиции. Из строки 0 получается строка 9, из 1 - 7 и т.п.: 0 а.........р 9 1 а.........д 7 ==> 2 а.........а 0 3 а.........к 8 4 а.........р 10 5 б.........а 1 6 б.........а 2 7 д.........а 3 8 к.........а 4 9 р.........б 5 10 р.........б 6 Теперь определяем порядок получения символов первого столбца из символов последнего: 2 а.........а 0 5 б.........а 1 6 б.........а 2 7 д.........а 3 8 к.........а 4 9 р.........б 5 10 р.........б 6 1 а.........д 7 3 а.........к 8 0 а.........р 9 4 а.........р 10 Полученные значения { 2, 5, 6, 7, 8, 9, 10, 1, 3, 0, 4 } и есть вектор обратного преобразования. Для получения исходной строки надо всего-навсего выписать символы из строки преобразованной ("рдакраааабб") в порядке, соответствующему данному вектору, начиная с номера, переданного нам вместе со строкой. 6 -> 10 -> 4 -> 8 -> 3 -> 7 -> 1 -> 5 -> 9 -> 0 -> 2 а б р а к а д а б р а Проделаем тоже самое при помощи простейшей программы. Пусть, N - количество символов в блоке из входного потока n - количество символов в алфавите x - номер исходной строки в матрице перестановок in[N] - входной поток count[n] - частоты каждого символа алфавита во входном потоке T[N] - вектор обратного преобразования. Hа первом шаге считаем частоты символов. for( i=0; i ...-24--2---- Подсказка: тот факт, что символы кончились, в данном примере реализовано посредством ссылки на . 10. Что такое 1-2 coding? В свете данной статьи, это способ кодирования количества повторяющихся символов. В принципе, этот способ может применяться для кодирования любого числа. Как известно, после MTF-преобразования мы получаем последовательность, в которой при удачном раскладе присутствует большое количество нулей, соответствующих нулевому рангу MTF. Ноль возникают тогда, когда после некоторого символа идет такой же (см. ранее в статье). Если кодировать каждый код MTF0, то во 1-х, это накладно по времени и, во 2-х, может ухудшить сжатие из-за погрешностей арифметического кодера. А для кодирования Хаффмана, недолюбливающего вероятности, отличающиеся от кратных степени двойки, это вообще неудобно, когда символ имеет вероятность, значительно превышающую 1/2 (а после BWT и MTF для ряда файлов такое случается) или даже, например, застревает посередине между 1/4 и 1/2. Элегантный выход был найден в отведении под MTF0 не одного, а двух символов (назовем их z1 и z2). Таким образом, у нас в MTF-алфавите получилось не 256, а 257 символов (по желанию, можно добавить еще один символ - конец блока). Эти z1 и z2 можно использовать для кодирования числа идущих подряд MTF0: 1 - z1 7 - z1z1z1 2 - z2 8 - z1z1z2 3 - z1z1 9 - z1z2z1 4 - z1z2 10 - z1z2z2 5 - z2z1 11 - z2z1z1 6 - z2z2 ... 11. Какие существуют компрессоры/архиваторы на основе BWT и ST? Компрессор Автор Адрес и версия ------------ -------------------- ------------------------- imp -2 1.10 Conor McCarthy http://www.technelysium.com.au x1 -m7 0.95 Stig Valentini http://www.saunalahti.fi/~x1 szip 1.12 Michael Schindler http://www.compressconsult.com bwc 0.99 Willem Monsuwe ftp://ftp.stack.nl/pub/users/willem bzip 0.21 Julian Seward bzip2 1.01 Julian Seward http://sourceware.cygnus.com/bzip2 bredX D.J.Wheeler ftp://ftp.cl.cam.ac.uk/users/djw3 ba 1.01br5 Mikael Lundqvist http://hem.spray.se/mikael.lundqvist zzip 0.36b Damien Debin http://www.zzip.f2s.com dc 0.99.015b Edgar Binder ftp://ftp.elf.stuba.sk/pub/pc/pack eri 4.8fre Alexander Ratushnyak http://artest.i.am sbc 0.361b Sami Mдkinen www.geocities.com/sbcarchiver ybs 0.03e Vadim Yoockin http://members.xoom.com/vycct БОльшую часть из указанных архиваторов можно также взять на ftp://ftp.elf.stuba.sk/pub/pc/pack Причем количество таких программ непрерывно растет, видимо, вскоре придется оставлять упоминание только про самые интересные :) Hиже приведены краткие особенности некоторых этих и других программ: Семейство BRED'ов написаны одним из родоначальников BWT, когда узок был круг людей, занимающихся этим методом. Многие идеи, использованные в этих компрессорах, описаны в работах Фенвика. В x1 включена реализация BWT, основанная на этих компрессорах. BZIP использует сортировку, выросшую из BRED'ов и, для дожатия, структурную модель, описанную Петером Фенвиком в одной из его статей про BWT. Выход MTF-преобразования дожимается арифметическим кодером с использованием так называемого 1-2 кодинга для сжатия повторяющихся последовательностей нулей. BZIP2, в отличие от BZIP, выход MTF-преобразования дожимает Хаффманом, также с 1-2 кодингом. Сортировка изменена незначительно - только повышена устойчивость к избыточным данным. BWC использует сортировку, похожую на ту, что применяется в BZIP2. Для дожатия использует структурную модель, 1-2 coding, rangecoder (т.е. все то, что используется в BZIP). IMP использует собственную сортировку, очень быструю на обычных текстах, но буквально зависающую на критических данных. Дожиматель полностью позаимствован из BZIP2. Интересная реализация применена в DjVu library. Сортировку там не смотрел (вроде не особо быстрая). Сжатие сделано на MTF и Шенноновской модели (эта модель описана Фенвиком). Жмет немного лучше BZIP'a, но долго. В SZIP, помимо упоминавшегося ST, реализована и возможность использования BWT-преобразования. Реализована, прямо скажем, только для примера, без затей. А вот дожиматель у szip'a очень интересный. Представляет из себя некий гибрид MTF-преобразования и адаптивный кодер, берущий статистику из короткого окна по выходу BWT-преобразования. BKS98 и BKS99 принадлежит сразу трем авторам (Balkenhol, Kurtz, Shtarkov) и пока есть только у них ;) Использует суффиксную сортировку и многоконтекстовую модель MTF по трем последним кодам. Hовые версии ZZIP'a выпускаются очень часто и свойства этого компрессора постепенно улучшаются. В нем применяется все те же испытанные временем BZIP'ские структурная модель и сортировка. BA использует сортировку, похожую на BZIP'скую тем, что все строки также делятся на пакеты, которые сортируются отдельно при помощи Multikey QuickSort. Hо повышение устойчивости реализовано в BA своим способом. В качестве дожимателя используется MTF с арифметическим кодером. Hовшество, реализованное в BA - это выбор структурной модели MTF в отдельном проходе. За счет динамического определения размера блока заметно улучшено сжатие неоднородных файлов. Для усиления сжатия английских текстов используется reordering. DC - достаточно новый компрессор, в котором реализован целый ряд новаторских идей. Во-первых, конечно, это модель сжатия, отличная от MTF - distance coding. Во-вторых, новый метод сортировки (информация о нем, может быть, будет опубликована позже), очень быстрый на текстах, хотя и дающий слабину на сильно избыточных данных. И, наконец, большой набор текстовых фильтров, позволяющий добиться особенного успеха на английских текстах (описание этих фильтров пока выходит за рамки этого документа). Отличительная особенность SBC - в наличии мощной криптосистемы. Ни в одном из архиваторов, пожалуй, не реализовано столько известных алгоритмов, как в SBC. Для сжатия в нем используется BWT, ориентированный на большие блоки избыточных данных. И хотя SBC не входит в тройку самых быстрых BWT-компрессоров на типичных данных, он ловко сортирует данные с большим количеством длинных повторяющихся строк, достигая при этом очень хорошей скорости. Вместо MTF там используется distance coding, но пока не так эффективно, как в YBS и DC - автор еще обещал позже поработать над уровнем сжатия. ARC (автор Ian Sutton, перу которого также принадлежит PPM-архиватор BOA). Как и многие другие, использует сортировку на основе BeSe и сжатие на основе MTF. Как и в SBC, дополнительно отслеживаются очень длинные повторы данных. YBS основан на сортировке, аналогичной bzip2. В перспективе думаю сделать сортировку, более экономно расходующую память и дающую значительное ускорение на коротких контекстах. Сейчас на текстах уступает по скорости IMP'у и DC, но на очень избыточных данных их обгоняет. Скорость сжатия на данный момент одна из самых быстрых среди BWT-компрессоров, использующих арифметическое кодирование. Собственно жмущая часть использует distance coding. В прошлом применялась MTF со структурной моделью Фенвика (именно эта версия фигурирует в предыдущем CCT 5.6 августа 2000 года). Эта же модель и послужила в качестве прототипа для новой версии. Hа текущий момент достигнута степень сжатия близкая к DC, за исключением того, что YBS пока не использует фильтры. Как ведут себя эти сжиматели по сравнению с другими можно посмотреть на http://members.xoom.com/vycct и на русскоязычном сайте http://arctest.cjb.net. Кроме того, результаты тестов периодически публикуются в эхоконференции FIDO RU.COMPRESS. Избранные фрагменты, позволяющие оценить боевые и летные качества приведены ниже. 12. Сравнительная таблица BWT-компрессоров. Для всех архиваторов выбран такой режим блока, который позволяет добиться наилучших результатов в сжатии без особого ущерба скорости. И параметры, которые, если специально не оговорено, отключают всякого рода ухищрения, особенно, если те ухудшают эффективность :) Во всех таблицах данной главы результаты указаны в следующем порядке: после названия компрессора и параметров идут размер полученного файла, время сжатия и время разжатия. Тестирование производилось на компьютере с конфигурацией iPIII-840, 256 SDRAM, Quantum FB 4.3Gb, NT 4.0sp3, Hачнем со сжатия русских текстов. Почему? Потому что BWT особенно эффективно именно для сжатия текстов. А русские выбраны для того, чтобы показать эффективность сжатия в чистом виде, без использования всякого рода ухищрений типа текстовых фильтров, которые для русских текстов еще не созданы авторами описываемых программ. Файл имеет длину 1,639,139 байтов. Как можно отметить, первенство удерживают компрессоры, использующие distance coding. ybs 0.3e 446,151 1.81 0.93 dc 0.99.015b -a 449,474 1.30 1.31 arc' (I.Sutton) b20 459,409 2.08 1.37 compressia' b2048 462,873 2.92 2.66 ba 1.01b5 -24-m 463,214 2.17 1.26 zzip 0.35g -mx -b8 467,383 1.96 1.65 szip 1.12 b21 o0 470,894 3.34 0.78 ICT UC 1.0 472,556 2.54 1.27 szip 1.12 b21 o8 472,577 2.32 1.12 sbc 0.360 -b3 474,298 2.11 1.08 bwc/PGCC 0.99 m2m 479,162 1.69 0.83 sbc 0.360 499,079 1.97 1.03 bwc/PGCC 0.99 m900k 503,556 1.56 0.83 szip 1.12 b21 o4 506,348 0.48 0.94 imp 1.10 -2 u1000 506,524 1.07 0.64 bzip2/PGCC 1.0b7 -9 507,828 1.55 0.66 Hа английском тексте (2,042,760 байтов) некоторые архиваторы используют фильтры, тем самым заметно улучшая сжатие. Они отмечены знаком '*'. Hиже приведены результаты, принадлежащие тем программам, которые показали наилучшие результаты в первом тесте. dc 0.99.015b 478,812 1.43 1.52 * ybs 0.3e 496,703 2.32 1.09 dc 0.99.015b -a 500,430 1.61 1.55 arc' (I.Sutton) b20 508,737 2.62 1.71 ba 1.01b5 -24 512,696 2.87 1.53 * zzip 0.35g -mx -b8 515,672 2.84 2.08 * compressia' b2048 517,484 3.67 2.12 ba 1.01b5 -24-x 517,626 2.75 1.42 При сжатии данных, представляющих собой исходные тексты программ, распределение среди лидеров тестов практически не меняется. Для иллюстрации поведения BWT-архиваторов на неоднородных данных используется исполнимый модуль из дистрибутива компилятора Watcom 10.0 wcc386.exe (536,624 байта). Для того, чтобы можно было судить об эффективности различных методов и режимов, некоторые строки помечены специальными знаками: * - использовались фильтры ** - использовался уменьшенный размер блока *** - размер блока определяется автоматически ? - нет информации про использование фильтров ybs 0.3e -m512k 275,396 0.66 0.51 * ** ybs 0.3e 276,035 0.66 0.57 * arc' (I.Sutton) b5mm1 278,392 1.33 0.48 * ** arc' (I.Sutton) mm1 280,052 1.34 0.46 * dc 0.99.015b 282,011 0.63 0.52 * zzip 0.35g -mx 291,199 0.74 0.66 arc' (I.Sutton) b5 291,345 0.58 0.48 ** arc' (I.Sutton) 292,979 0.58 0.48 ba 1.01b5 -24-z 293,489 0.82 0.64 *** dc 0.99.015b -a 293,985 0.56 0.49 imp 1.10 -2 u1000 294,679 0.38 0.18 * compressia' b512 297,647 0.97 1.16 ? ICT UC 1.0 298,348 0.75 0.53 ba 1.01b5 298,617 0.82 0.66 szip 1.12 b21 o0 298,668 0.76 0.31 szip 1.12 b21 o4 299,249 0.27 0.39 sbc 0.360 303,049 0.75 0.44 bwc/PGCC 0.99 m600k 304,996 0.58 0.37 bzip2/PGCC 1.0b7 -6 308,624 0.63 0.26 В качестве файла, содержащего смесь текстовых и бинарных данных использовался Fileware.doc из поставки русского MS Office'95 (427,520 байтов). Данный пример показывает, что иногда модель, использующая MTF оказывается лучше прочих. arc' (I.Sutton) b2 128,685 0.38 0.23 ** * ybs 0.3e -m256k 130,356 0.37 0.24 ** compressia' b256 131,737 0.61 0.40 ** ba 1.01b5 -24-r 132,651 0.41 0.30 zzip 0.35g -a1 132,711 0.65 0.40 dc 0.99.015b 133,912 0.42 0.35 ybs 0.3e 133,915 0.37 0.25 bwc/PGCC 0.99 m600k 134,183 0.33 0.19 ** sbc 0.360 -e 134,510 0.54 0.27 *** bzip2/PGCC 1.0b7 -6 134,932 0.44 0.14 ** szip 1.12 b21 o0 134,945 0.90 0.15 imp 1.10 -2 u1000 135,431 0.30 0.12 sbc 0.360 135,783 0.52 0.26 ICT UC 1.0 136,842 0.41 0.29 ba 1.01b5 -24-z 137,566 0.49 0.31 *** szip 1.12 b21 o4 141,784 0.17 0.18 13. Литература. Литературы по 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 Для желающих более подробно изучить предмет могу посоветовать следующую литературу. С сожалением предупреждаю, что рассылкой заниматься не буду, поскольку бОльшая часть из указанных статей доступна в интернете и на раз находится при помощи поисковых серверов. А почтовый ящик у меня все-таки один... пардон, два ;-) Прошу также не обращаться с вопросами, где находится та или иная статья - скорее всего, точный адрес я или забыл, или не знал. Может, я забыл какие-то статьи упомянуть. Тогда рекомендую сходить на http://dogma.net/DataCompression/BWT.shtml Там много всяких ссылок по данной тематике. 4. K.Sadakane. A Fast Algorithm for Making Suffix Arrays and for BWT. 5. K.Sadakane. On Optimality of Variants of Block-Sorting Compression. 6. K.Sadakane. Comparison among Suffix Array Constructions Algorithms. 7. K.Sadakane. Text Compression using Recency Rank with Context and Relation to Context Sorting, Block Sorting and PPM. 8. Z.Arnavaut, S.S.Magliveras. Block Sorting and Compression. DCC99. 9. B.Balkenhol, S.Kurtz, Y.M.Shtarkov. Modifications of the Burrows and Wheeler Data Compression Algorithm. In Proceedings of the IEEE Data Compression Conference, Snowbird, Utah, IEEE Computer Society Press, 1999, 188-197. 10. Z.Arnavaut, S.S.Magliveras. Lexical Permutation Sorting Algorithm. 11. N.J.Larsson. The Context Trees of Block Sorting Compression. 12. N.J.Larsson. Attack of the Mutant Suffix Tree. 13. N.J.Larsson, K.Sadakane. Faster Suffix Sorting. 14. B.Balkenhol, S.Kurtz. Universal Data Compression Based on the Burrows and Wheeler-Transformation: Theory and Practice. 15. S.Kurtz. Reducing the Space Requirement of Suffix Trees. 16. S.Kurtz, R.Giegerich, J.Stoye. Efficient Implementation of Lazy Suffix Trees. 1999 17. M.Arimura, H.Yamamoto. Asymptotic Optimality of the Block Sorting Data Compression Algorithm. 1998 18. S.Kurtz. Space efficient linear time computation of the Burrows and Wheeler - Transformation. DCC2000. 19. B.Chapin. Switching Between Two On-line List Update algorithms for Higher Compression of Burrows-Wheeker Transformed Data. DCC2000. 20. B.Balkenhol, Y.M.Shtarkov. One attempt of a compression algorithm using the BWT. 21. S.Deorowicz. Improvements to Burrows-Wheeler Compression Algorithm. 2000. 22. S.Deorowicz. An analysis of second step algorithms in the Burrows-Wheeler compression algorithm. 2000. 23. F.Schulz. Two New Families of List Update Algorithms. 1998. 24. P.Ferragina, G.Manzini. An experimental study of an opportunistic index. 2001. 25. H.Kruse, A.Mukherjee. Improve Text Compression Ratios with Burrows-Wheeler Transform. 1999. 26. B.Chapin, S.Tate. Higher Compression from the Burrows-Wheeler Transform by Modified strings. 2000. 27. D.Baron, Y.Bresler. Tree Source Identification with the BWT. 2000. 28. H.Baik, D.S.Ha, H-G.Yook, S-C.Shin, M-S.Park. Selective Application of Burrows-wheeler Transformation for Enhancement of JPEG Entropy Coding. 1999. 29. H-K.Baik, D.S.Ha, H-G.Yook, S-C.Shin, M-S.Park. A New Method to Improve the Performance of JPEG Entropy Coding Using Burrows-wheeler Transformation. 1999. 30. S.Albers, B.v.Stengel, R.Werchner. A combined BIT and TIMESTAMP Algorithm for the List Update Problem. 1995. 31. C.Ambuhl, B.Gartnerm B.v.Stengel. A New Lower Bound for the List Update Problem in the Partial Cost Model. 1999. 32. G.Manzini. The Burrows-Wheeler Transform: Theory and Practice. 1999.