FM-индекс

редактировать

На компьютере наука, FM-индекс - это сжатый полнотекстовый индекс подстроки, основанный на преобразовании Барроуза-Уиллера, с некоторым сходством с массив суффиксов. Он был создан Паоло Феррагиной и Джованни Манзини, которые описывают его как гибкую структуру данных, поскольку она позволяет сжимать входной текст, но при этом позволяет выполнять быстрые запросы подстроки. Название расшифровывается как полнотекстовый индекс в минутном пространстве.

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

Первоначальные авторы усовершенствовали свой оригинальный подход и окрестили его «FM-Index версии 2». Дальнейшее улучшение, удобный для алфавита FM-индекс, сочетает в себе использование усиления сжатия и вейвлет-деревьев, чтобы значительно сократить использование пространства для больших алфавитов.

FM-индекс нашел применение, среди прочего, в биоинформатике.

Содержание
  • 1 Предпосылки
  • 2 Структура данных FM-индекса
  • 3 Счетчик
  • 4 Найдите
  • 5 Приложения
    • 5.1 Отображение чтения ДНК
  • 6 См. Также
  • 7 Ссылки
Предпосылки

Использование индекса - распространенная стратегия для эффективного поиска в большом объеме текста. Когда размер текста превышает размер, который разумно помещается в основной памяти компьютера, возникает необходимость сжимать не только текст, но и индекс. Когда был введен FM-индекс, было предложено несколько решений, которые основывались на традиционных методах сжатия и пытались решить проблему сопоставления сжатых данных. Напротив, FM-индекс - это сжатый самоиндекс, что означает, что он сжимает данные и индексирует их одновременно.

Структура данных FM-индекса

FM-индекс создается путем первого принятия преобразования Барроуза-Уиллера (BWT) входного текста. Например, BWT строки T = "abracadabra $" - это "ard $ rcaaaabb", и здесь он представлен матрицей M, где каждая строка представляет собой поворот текста, а строки были отсортированы лексикографически. Преобразование соответствует последнему столбцу L.

IFL
1$abracadabra
2a$ abracadabr
3abra $ abracad
4abracadabra$
5acadabra $ abr
6adabra $ abrac
7bra $ abracada
8bracadabra $a
9cadabra $ abra
10dabra $ abraca
11ra $ abracadab
12racadabra $ ab

Сам по себе BWT допускает некоторое сжатие, например, с перемещением вперед и кодировка Хаффмана, но преобразование имеет еще больше применений. Строки в матрице - это, по сути, отсортированные суффиксы текста, а первый столбец F матрицы имеет сходство с массивами суффиксов . То, как массив суффиксов соотносится с BWT, лежит в основе FM-индекса.

Можно сделать отображение LF (i) столбца "последний-первый" из индекса i в индекс j, такое, что F [j] = L [i], с помощью таблицы C [c ] и функцию Occ (c, k).

  • C [c] - таблица, которая для каждого символа c в алфавите содержит количество вхождений лексически меньших символов в текст.
  • Функция Occ (c, k) - это число вхождений символа c в префиксе L [1..k]. Феррагина и Манзини показали, что можно вычислить Occ (c, k) за постоянное время.
C [c] of "ard $ rcaaaabb"
c$abcdr
C [c]0168910

Последнее - преобразование в первое теперь можно определить как LF (i) = C [L [i]] + Occ (L [i], i). Например, в строке 9 L - это a, и такое же значение a можно найти в строке 5 в первом столбце F, поэтому LF (9) должно быть 5, а LF (9) = C [a] + Occ (a, 9) = 5. Для любой строки i матрицы символ в последнем столбце L [i] предшествует символу в первом столбце F [i] также в T. Наконец, если L [i] = T [k], тогда L [LF (i)] = T [k - 1], и, используя равенство, можно извлечь строку T из L.

Сам FM-индекс является сжатием строки L вместе с C и Occ в некоторой форме, а также информация, которая отображает выбор индексов в L в позиции в исходной строке T.

Occ (c, k) of "ard $ rcaaaabb"
ard$rcaaaabb
123456789101112
$000111111111
a111111234555
b000000000012
c000001111111
d001111111111
r011122222222
Count

Счетчик операций принимает шаблон P [1..p] и возвращает количество вхождений этого шаблона в исходный текст T. Поскольку строки матрицы M отсортированы, и он содержит каждый суффикс из T, вхождения шаблона P будут рядом друг с другом в одном непрерывном диапазоне. Операция повторяется в обратном порядке по шаблону. Для каждого символа в шаблоне находится диапазон, в котором этот символ является суффиксом. Например, подсчет паттерна «бюстгальтер» в «абракадабре» выполняется следующим образом:

  1. Первый символ, который мы ищем, - это а, последний символ в паттерне. Исходный диапазон установлен на [C [a] + 1..C [a + 1]] = [2..6]. Этот диапазон над L представляет каждый символ T, суффикс которого начинается с a.
  2. Следующий символ, который нужно искать, - это r. Новый диапазон: [C [r] + Occ (r, start-1) + 1..C [r] + Occ (r, end)] = [10 + 0 + 1..10 + 2] = [11..12], если start - это индекс начала диапазона, а end - конец. Этот диапазон над L - это все символы T, суффиксы которых начинаются с ra.
  3. Последний символ, на который нужно смотреть, - это b. Новый диапазон: [C [b] + Occ (b, start-1) + 1..C [b] + Occ (b, end)] = [6 + 0 + 1..6 + 2] = [7..8]. Этот диапазон над L - это все символы, у которых есть суффикс, начинающийся с бюстгальтера. Теперь, когда весь шаблон обработан, счетчик совпадает с размером диапазона: 8-7 + 1 = 2.

Если диапазон становится пустым или границы диапазона пересекаются друг с другом до того, как весь шаблон будет обработан После поиска шаблон не встречается в T. Поскольку Occ (c, k) может выполняться за постоянное время, счет может завершаться за линейное время по длине шаблона: время O (p).

Locate

Операция locate принимает в качестве входных данных индекс символа в L и возвращает его позицию i в T. Например, locate (7) = 8. Чтобы найти каждое вхождение шаблона, сначала определяется диапазон символов, суффикс которого является шаблоном, точно так же, как операция подсчета нашла диапазон. Затем можно определить положение каждого символа в диапазоне.

Чтобы отобразить индекс в L на один в T, подмножество индексов в L связано с позицией в T. Если L [j] имеет связанную с ним позицию, locate (j) тривиально. Если он не связан, за строкой следует LF (i), пока не будет найден связанный индекс. Сопоставив подходящее количество индексов, можно найти верхнюю границу. Функция Locate может быть реализована для поиска вхождений шаблона P [1..p] в тексте T [1..u] за время O (p + occ log u) с O (H k (T) + журнал ⁡ журнал ⁡ U журнал ϵ ⁡ u) {\ displaystyle O \ left (H_ {k} (T) + {{\ log \ log u} \ over {\ log ^ {\ epsilon} u}} \ right)}{\ displaystyle O \ left (H_ {k} (T) + {{\ log \ log u} \ over {\ log ^ {\ epsilon} u}} \ right)} бит на входной символ для любого k ≥ 0.

Приложения

Отображение чтения ДНК

Индекс FM с обратным отслеживанием успешно (>2000 цитирований) применяется для приблизительного сопоставления строк / выравнивания последовательностей, см. Bowtie http://bowtie-bio.sourceforge.net/index.shtml

См. также
Ссылки
Последняя правка сделана 2021-05-20 08:00:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте