Открыть сервис

Преобразование Барроуза — Уилера

Преобразование Барроуза — Уилера (BWT, от англ. Burrows–Wheeler transform) — это обратимый алгоритм перестановки символов в строке, применяемый в сжатии данных. Преобразование не сжимает данные само по себе, но перегруппировывает символы таким образом, чтобы одинаковые символы оказывались рядом, что значительно повышает эффективность последующего кодирования (например, run-length encoding (RLE) или move-to-front transform (MTF)). Алгоритм был предложен Майклом Барроузом и Дэвидом Уилером в 1994 году в исследовательском отчёте Digital Equipment Corporation. BWT лежит в основе многих популярных архиваторов и форматов сжатия, включая bzip2 и некоторые реализации в форматах FASTQ (биоинформатика).

История

Идея преобразования возникла в контексте разработки алгоритмов сжатия без потерь, способных работать с текстовыми и бинарными данными. Майкл Барроуз и Дэвид Уилер в 1994 году опубликовали технический отчёт «A Block-sorting Lossless Data Compression Algorithm». В основе подхода лежала сортировка всех циклических сдвигов исходной строки. Первоначально алгоритм реализовывался программно и демонстрировал высокую степень сжатия для текстов на естественных языках, уступая на то время специализированным методам (например, арифметическому кодированию) по скорости, но превосходя их по коэффициенту сжатия на некоторых типах данных.

В 1996 году алгоритм был интегрирован в утилиту bzip2, которая стала стандартной в операционных системах Linux и Unix. Позднее BWT нашёл применение в задачах хранения геномных последовательностей (секвенирование ДНК), где требуется эффективное сжатие больших объёмов данных с сохранением точности.

Описание алгоритма

Преобразование Барроуза — Уилера выполняется над блоком данных фиксированной длины. Оно состоит из двух этапов: построение матрицы всех циклических сдвигов и извлечение последнего столбца отсортированной матрицы.

Построение матрицы сдвигов

Пусть имеется строка \( S \) длины \( n \). Строится матрица \( M \) размером \( n \times n \), где каждая строка \( i \) (\( 0 \leq i < n \)) является циклическим сдвигом \( S \) на \( i \) позиций влево. Другими словами, строка \( i \) содержит символы \( S[i], S[i+1], ..., S[n-1], S[0], ..., S[i-1] \).

Сортировка строк

Все строки матрицы \( M \) сортируются в лексикографическом порядке (в порядке возрастания кодов символов). Полученная матрица называется матрицей BWT.

Извлечение последнего столбца

Из отсортированной матрицы извлекается последний столбец \( L \) (последний символ каждой строки). Этот столбец \( L \) и является результатом преобразования BWT. Дополнительно сохраняется индекс исходной строки в отсортированной матрице — то есть номер строки, которая соответствует исходной строке \( S \) (до сортировки). Этот индекс необходим для обратного преобразования.

Пример

Рассмотрим строку BANANA.

  1. Исходная строка: BANANA (длина \( n = 6\)).
  2. Циклические сдвиги (все 6 возможных):
  1. Сортировка в лексикографическом порядке:
  1. Последний столбец \( L \): символы последних позиций строк в порядке сортировки: N, N, B, A, A, A. Получается строка NNBAAA.
  2. Индекс исходной строки: исходная строка BANANA находится в отсортированной матрице на позиции 3 (строка BANANA). Сохраняется число 3.

Результат BWT: L = NNBAAA, первичный индекс = 3.

Таким образом, BWT преобразовал исходную строку BANANA в строку NNBAAA. В результирующей строке символы A оказались сгруппированы, что облегчает их кодирование.

Обратное преобразование

Обратное BWT восстанавливает исходную строку по \( L \) и первичному индексу. Оно использует алгоритм, основанный на свойствах циклических сдвигов и счётчика символов. Суть обратного преобразования заключается в следующем:

  1. Построить массив первых символов \( F \) строк отсортированной матрицы. Для этого \( L \) сортируется в лексикографическом порядке.
  2. Создать массив \( T \) (префиксное отображение), где для каждого символа из \( L \) записывается его позиция в \( F \). Для этого используется подсчёт количества вхождений каждого символа в \( L \).
  3. Начиная с первичного индекса \( I \), последовательно двигаться назад по массиву \( T \), извлекая символы из \( L \) в обратном порядке. Полученная последовательность символов является исходной строкой.

Алгоритм обратного преобразования гарантирует однозначное восстановление исходных данных при условии, что известен первичный индекс. Без этого индекса восстановление невозможно, так как разные исходные строки могут давать одинаковые \( L \) при разных индексах.

Свойства и особенности

Преимущества

Недостатки

Классификация и варианты

Преобразование Барроуза — Уилера можно классифицировать по способу реализации сортировки и типу данных:

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

Применение

Сжатие данных

Основная область применения BWT — сжатие данных без потерь. Наиболее известный пример — архиватор bzip2, который использует BWT совместно с RLE, MTF и арифметическим кодированием. bzip2 обеспечивает высокую степень сжатия для текстовых файлов (например, HTML, исходного кода, текстовых документов). В тестах bzip2 часто опережает gzip (LZ77-основанный) по степени сжатия, но уступает по скорости. Используется в протоколах передачи данных (например, в HTTP сжатие bzip2 ограничено).

Биоинформатика

В биоинформатике BWT используется для сжатия и индексации геномных последовательностей. Разработанный на основе BWT FM-индекс (Ferragina–Manzini index) позволяет выполнять поиск подстрок (например, определённых генов или мутаций) в полном геноме за линейное время от длины запроса. Этот подход лежит в основе многих инструментов секвенирования, таких как bowtie, BWA (Burrows–Wheeler Aligner) и SOAP. Формат FASTQ, используемый для хранения данных секвенирования, часто сжимается с помощью bzip2 или специализированных BWT-кодеков.

Другие области

Критика и ограничения

Хотя BWT является мощным инструментом сжатия, он не лишён недостатков. Основные критические замечания:

Тем не менее, BWT остаётся одним из стандартных методов сжатия без потерь, особенно для текстов и геномных данных, благодаря своей эффективности и обратимости.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →