Fusion tree — различия между версиями
| Zernov (обсуждение | вклад) | Zernov (обсуждение | вклад)   (→Структура) | ||
| Строка 4: | Строка 4: | ||
| * у всех вершин, кроме листьев, <tex>B = w^{1/5}</tex> детей, | * у всех вершин, кроме листьев, <tex>B = w^{1/5}</tex> детей, | ||
| * время, за которое определяется, в каком поддереве находится вершина, равно <tex>O(1)</tex>. | * время, за которое определяется, в каком поддереве находится вершина, равно <tex>O(1)</tex>. | ||
| − | Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим [[:Сверхбыстрый_цифровой_бор|цифровой бор]] из ключей узла дерева. Всего <tex>B - 1</tex> ветвящихся вершин. Биты, соответствующие уровням дерева,  в которых происходит ветвление, назовем существенными и обозначим их номера <tex>b_0, b_1\ldots b_{r-1}</tex>. Количество существенных битов <tex>r</tex>  | + | Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим [[:Сверхбыстрый_цифровой_бор|цифровой бор]] из ключей узла дерева. Всего <tex>B - 1</tex> ветвящихся вершин. Биты, соответствующие уровням дерева,  в которых происходит ветвление, назовем существенными и обозначим их номера <tex>b_0, b_1\ldots b_{r-1}</tex>. Количество существенных битов <tex>r</tex> не больше <tex>B - 1</tex> (все ребра на уровне детей ветвящейся вершины (обведены на рисунке) являются существенными битами, и так как ветвящихся вершин <tex>B - 1</tex>, значит, и количество уровней с детьми не больше <tex>B - 1</tex>, поскольку на одном уровне могут быть несколько ветвящихся вершин). | 
| [[Файл:Fusion.png||500x400px|center|визуализация функции sketch]] | [[Файл:Fusion.png||500x400px|center|визуализация функции sketch]] | ||
Версия 20:30, 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
Граф де Брёйна
Существует удобная интерпретация последовательностей и циклов де Брёйна, основанная на так называемом графе де Брёйна — ориентированном графе с вершинами, соответствующими различных наборов длины с элементами из , в котором из вершины в вершину ребро ведёт в том и только том случае, когда (); при этом самому ребру можно сопоставить набор длины : . Для такого графа не проходящие дважды через одно и то же ребро эйлеровы пути (эйлеровы циклы) соответствуют последовательности (циклу) де Брёйна с параметрами и , а не проходящие дважды через одну и ту же вершину гамильтоновы пути (гамильтоновы циклы) — последовательности (циклу) де Брёйна с параметрами и .
Граф де Брёйна широко применяется в биоинформатике в задачах сборки генома.


