Fusion tree — различия между версиями
Zernov (обсуждение | вклад) м (→Понятия succ(q) и pred(q)) |
Zernov (обсуждение | вклад) |
||
| Строка 185: | Строка 185: | ||
Каждый шаг выполняется за <tex>O(1)</tex>, поэтому всего потребуется <tex>O(1)</tex> времени, чтобы найти индекс. | Каждый шаг выполняется за <tex>O(1)</tex>, поэтому всего потребуется <tex>O(1)</tex> времени, чтобы найти индекс. | ||
| + | == Циклы де Брёйна == | ||
| + | |||
| + | '''Последовательность де Брёйна''' {{---}} последовательность <math>a_1,\;\ldots,\;a_t</math>, элементы которой принадлежат заданному конечному множеству (обычно рассматривают множество <math>\{0,\;1,\;\ldots,\;k-1\}</math>), и все подпоследовательности <math>a_{i+1},\;\ldots,\;a_{i+n}</math> заданной длины <math>n</math> различны. | ||
| + | |||
| + | Часто рассматриваются периодические последовательности с периодом <math>T</math>, содержащие <math>T</math> различных подпоследовательностей <math>a_{i+1},\;\ldots,\;a_{i+n}</math>, {{---}} то есть такие периодические последовательности, в которых любой отрезок длины <math>T+n-1</math> является последовательностью де Брёйна с теми же параметрами <math>n</math> и <math>k</math>. | ||
| + | |||
| + | === Свойства === | ||
| + | |||
| + | Очевидно, что длина (период) такого цикла не может превосходить <math>k^n</math> {{---}} числа́ всех различных векторов длины <math>n</math> с элементами из <math>\{0,\;1,\;\ldots,\;k-1\}</math>; несложно доказать, что эта оценка достигается. Циклы этой максимально возможной длины обычно называют '''циклами де Брёйна''' (впрочем, иногда этот термин применяют и к циклам меньшей длины). | ||
| + | |||
| + | При <math>k=2</math> существуют такие циклы де Брёйна с длиной, на единицу меньшей максимума, которые выражаются линейными рекуррентными соотношениями порядка <math>n</math>: так, при <math>n=3</math> соотношение <math>x_n=x_{n-2}+x_{n-3}\pmod 2</math> порождает последовательности с периодом 7, например 0010111001011100… (цикл де Брёйна 0010111). На основе таких последовательностей построен, в частности, циклический избыточный код. | ||
| + | |||
| + | === Примеры === | ||
| + | |||
| + | Примеры циклов де Брёйна для <math>k=2</math> с периодом 2, 4, 8, 16: | ||
| + | * 01 (содержит подпоследовательности 0 и 1) | ||
| + | * 0011 (содержит подпоследовательности 00, 01, 11, 10) | ||
| + | * 00010111 (000, 001, 010, 101, 011, 111, 110, 100) | ||
| + | * 0000100110101111 | ||
| + | |||
| + | === Граф де Брёйна === | ||
| + | |||
| + | Существует удобная интерпретация последовательностей и циклов де Брёйна, основанная на так называемом '''графе де Брёйна''' {{---}} ориентированном графе с <math>k^n</math> вершинами, соответствующими <math>k^n</math> различных наборов длины <math>n</math> с элементами из <math>\{0,\;1,\;\ldots,\;k-1\}</math>, в котором из вершины <math>(x_1,\;\ldots,\;x_n)</math> в вершину <math>(y_1,\;\ldots,\;y_n)</math> ребро ведёт в том и только том случае, когда <math>x_i=y_{i-1}</math> (<math>i=2,\;\ldots,\;n</math>); при этом самому ребру можно сопоставить набор длины <math>n+1</math>: <math>(x_1,\;\ldots,\;x_n,\;y_n)=(x_1,\;y_1,\;\ldots,\;y_n)</math>. Для такого графа не проходящие дважды через одно и то же ребро эйлеровы пути (эйлеровы циклы) соответствуют последовательности (циклу) де Брёйна с параметрами <math>n+1</math> и <math>k</math>, а не проходящие дважды через одну и ту же вершину гамильтоновы пути (гамильтоновы циклы) {{---}} последовательности (циклу) де Брёйна с параметрами <math>n</math> и <math>k</math>. | ||
| + | |||
| + | Граф де Брёйна широко применяется в биоинформатике в задачах сборки генома. | ||
==См. Также== | ==См. Также== | ||
| Строка 190: | Строка 215: | ||
*[[:2-3_дерево|2-3 дерево]] | *[[:2-3_дерево|2-3 дерево]] | ||
| − | |||
== Источники информации == | == Источники информации == | ||
| Строка 203: | Строка 227: | ||
* [http://en.wikipedia.org/wiki/Fusion_tree Wikipedia — Fusion tree] | * [http://en.wikipedia.org/wiki/Fusion_tree Wikipedia — Fusion tree] | ||
| + | |||
| + | * [https://en.wikipedia.org/wiki/De_Bruijn_sequence Wikipedia — De Bruijn sequence] | ||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Деревья поиска]] | [[Категория:Деревья поиска]] | ||
Версия 20:24, 5 июня 2015
Fusion tree — дерево поиска, позволяющее хранить -битных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложена в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard).
Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей,
- время, за которое определяется, в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим цифровой бор из ключей узла дерева. Всего ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера . Количество существенных битов равно (все ребра на уровне детей ветвящейся вершины являются существенными битами).
В Fusion tree вместе с ключом хранится — последовательность битов .
| Утверждение: |
сохраняет порядок, то есть , если . |
| Рассмотрим наибольший общий префикс и . Тогда следующий бит определяет их порядок и одновременно является существенным битом. Поэтому, если , то и . |
Поиск вершины
Пусть — множество ключей узла, отсортированных по возрастанию, — ключ искомой вершины, — количество бит в . Сначала найдем такой ключ , что . Но положение среди не всегда эквивалентно положению среди , поэтому, зная соседние элементы , найдем и .
Понятия succ(q) и pred(q)
Пусть .
| Утверждение: |
Среди всех ключей наибольший общий префикс с будет иметь или или . |
| Предположим, что имеет наибольший общий префикс с . Тогда будет иметь больше общих битов со . Значит, ближе по значению к , чем или , что приводит к противоречию. |
Сравнивая и , найдем какой из ключей имеет наибольший общий префикс с (наименьшее значение соответствует наибольшей длине).
Предположим, что — наибольший общий префикс, а его длина, — ключ, имеющий наибольший общий префикс с ( или ).
- если , то бит равен единице, а бит равен нулю. Так как общий префикс и является наибольшим, то не существует ключа с префиксом . Значит, больше всех ключей с префиксом меньшим либо равным . Найдем , , который одновременно будет ,
- если — найдем , . Это будет .
Длина наибольшего общего префикса двух -битных чисел и может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом и .
Параллельное сравнение
Найдем и . Определим как число, составленное из единиц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся единицы. Применим к получившемуся побитовое c , чтобы убрать лишние биты.
Если , то , в противном случае . Теперь надо найти количество единиц в . Умножим на , тогда все единицы сложатся в первом блоке результата, и, чтобы получить количество единиц, сдвинем его вправо.
Вычисление sketch(x)
Чтобы найти sketch за константное время, будем вычислять , имеющий все существенные биты в нужном порядке, но содержащий лишние нули.
- Уберем все несущественные биты .
- Умножением на некоторое заранее вычисленное число сместим все существенные биты в блок меньшего размера: .
- Применив побитовое , уберем лишние биты, появившиеся в результате умножения: .
- Сделаем сдвиг вправо на бит.
| Утверждение: |
Дана последовательность из чисел . Тогда существует последовательность , такая что:
|
|
Выберем некоторые , таким образом, чтобы . Предположим, что мы выбрали . Тогда . Всего недопустимых значений для , поэтому всегда можно найти хотя бы одно значение. Чтобы получить , выбираем каждый раз наименьшее и прибавляем подходящее число кратное , такое что . |
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить sketch узла в w-битный тип. Так как , то будет занимать бит.
Индекс наиболее значащего бита
Чтобы найти в -битном числе индекс самого старшего бита, содержащего единицу, разделим на блоков по бит. . Далее найдем первый непустой блок и индекс первого единичного бита в нем.
1) Поиск непустых блоков.
a. Определим, какие блоки имеют единицу в первом бите. Применим побитовое к и константе .
b. Определим, содержат ли остальные биты единицы.
Вычислим .
Вычтем из . Если какой-нибудь бит обнулится, значит, соответствующий блок содержит единицы.
Чтобы найти блоки, содержащие единицы, вычислим .
c. Первый бит в каждом блоке содержит единицу, если соответствующий блок ненулевой.
2) Найдем , чтобы сместить все нужные биты в один блок. Существенными битами в данном случае будут первые биты каждого блока, поэтому .
Будем использовать . Тогда . Все суммы различны при . Все возрастают, и .
Чтобы найти , умножим на и сдвинем вправо на бит.
3) Найдем первый ненулевой блок. Для этого надо найти первую единицу в . Как и при поиске и используем параллельное сравнение с . В результате сравнения получим номер первого ненулевого блока .
4) Найдем номер первого единичного бита в найденном блоке так же как и в предыдущем пункте.
5) Индекс наиболее значащего бита будет равен .
Каждый шаг выполняется за , поэтому всего потребуется времени, чтобы найти индекс.
Циклы де Брёйна
Последовательность де Брёйна — последовательность , элементы которой принадлежат заданному конечному множеству (обычно рассматривают множество ), и все подпоследовательности заданной длины различны.
Часто рассматриваются периодические последовательности с периодом , содержащие различных подпоследовательностей , — то есть такие периодические последовательности, в которых любой отрезок длины является последовательностью де Брёйна с теми же параметрами и .
Свойства
Очевидно, что длина (период) такого цикла не может превосходить — числа́ всех различных векторов длины с элементами из ; несложно доказать, что эта оценка достигается. Циклы этой максимально возможной длины обычно называют циклами де Брёйна (впрочем, иногда этот термин применяют и к циклам меньшей длины).
При существуют такие циклы де Брёйна с длиной, на единицу меньшей максимума, которые выражаются линейными рекуррентными соотношениями порядка : так, при соотношение порождает последовательности с периодом 7, например 0010111001011100… (цикл де Брёйна 0010111). На основе таких последовательностей построен, в частности, циклический избыточный код.
Примеры
Примеры циклов де Брёйна для с периодом 2, 4, 8, 16:
- 01 (содержит подпоследовательности 0 и 1)
- 0011 (содержит подпоследовательности 00, 01, 11, 10)
- 00010111 (000, 001, 010, 101, 011, 111, 110, 100)
- 0000100110101111
Граф де Брёйна
Существует удобная интерпретация последовательностей и циклов де Брёйна, основанная на так называемом графе де Брёйна — ориентированном графе с вершинами, соответствующими различных наборов длины с элементами из , в котором из вершины в вершину ребро ведёт в том и только том случае, когда (); при этом самому ребру можно сопоставить набор длины : . Для такого графа не проходящие дважды через одно и то же ребро эйлеровы пути (эйлеровы циклы) соответствуют последовательности (циклу) де Брёйна с параметрами и , а не проходящие дважды через одну и ту же вершину гамильтоновы пути (гамильтоновы циклы) — последовательности (циклу) де Брёйна с параметрами и .
Граф де Брёйна широко применяется в биоинформатике в задачах сборки генома.