Fusion tree — различия между версиями
Zernov (обсуждение | вклад) (→Индекс наиболее старшего бита с помощью цикла де Брёйна) |
Zernov (обсуждение | вклад) (Удаление) |
||
Строка 33: | Строка 33: | ||
Рассмотрим <tex>y</tex>. У него есть существенные биты и некоторый элемент <tex>x</tex>, с которым у <tex>y</tex> наибольший общий префикс (настоящий, а не по <tex>sketch</tex>). Биты из <tex>sketch</tex>, находящиеся в префиксе совпадают, значит <tex>succ</tex> и <tex>pred</tex> <tex>y</tex> среди <tex>sketch</tex> должны быть такими же среди <tex>x</tex>, и один из них имеет дальше бит <tex>0</tex> (а другой <tex>1</tex>) и с ним может быть больше других общих бит в <tex>sketch</tex>. То есть либо <tex>succ</tex>, либо <tex>pred</tex> имеют следующий существенный бит такой же, как и у <tex>y</tex>. Поэтому если значение равно <tex>0</tex>, то <tex>x</tex> наибольший среди значений с меньшим <tex>sketch</tex>, и, аналогично для <tex>1</tex>, наименьший среди больших. | Рассмотрим <tex>y</tex>. У него есть существенные биты и некоторый элемент <tex>x</tex>, с которым у <tex>y</tex> наибольший общий префикс (настоящий, а не по <tex>sketch</tex>). Биты из <tex>sketch</tex>, находящиеся в префиксе совпадают, значит <tex>succ</tex> и <tex>pred</tex> <tex>y</tex> среди <tex>sketch</tex> должны быть такими же среди <tex>x</tex>, и один из них имеет дальше бит <tex>0</tex> (а другой <tex>1</tex>) и с ним может быть больше других общих бит в <tex>sketch</tex>. То есть либо <tex>succ</tex>, либо <tex>pred</tex> имеют следующий существенный бит такой же, как и у <tex>y</tex>. Поэтому если значение равно <tex>0</tex>, то <tex>x</tex> наибольший среди значений с меньшим <tex>sketch</tex>, и, аналогично для <tex>1</tex>, наименьший среди больших. | ||
}} | }} | ||
− | |||
[[Файл:FusionTree.png|400x400px|thumb|right|Пример случая, когда <tex>sketch(a_i) \leqslant sketch(q) \leqslant sketch(a_{i+1})</tex>, но <tex>a_{i+1}\leqslant q</tex> <tex>sketch(a_i) = 00, sketch(q) = 00, sketch(a_{i+1}) = 01, \\ a_i = 0000, a_{i+1} = 0010, q = 0101</tex> ]] | [[Файл:FusionTree.png|400x400px|thumb|right|Пример случая, когда <tex>sketch(a_i) \leqslant sketch(q) \leqslant sketch(a_{i+1})</tex>, но <tex>a_{i+1}\leqslant q</tex> <tex>sketch(a_i) = 00, sketch(q) = 00, sketch(a_{i+1}) = 01, \\ a_i = 0000, a_{i+1} = 0010, q = 0101</tex> ]] | ||
Строка 73: | Строка 72: | ||
}} | }} | ||
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить <tex>sketch</tex> узла в <tex>w</tex>-битный тип. Так как <tex>r \leqslant B-1</tex>, то <tex>sketch(node)</tex> будет занимать <tex>B(r^4 + 1) \leqslant B((B-1)^4 + 1) = B((B^2 - 2B + 1)^2 + 1)=</tex><tex>B(B^4 + 4B^2 + 1 - 4B^3 + 2B^2 -4B + 1) = B^5 - 4B^3 + 6B^2 - 4B + 2 \leqslant B^5 </tex><tex> = (w^{1/5})^5 = w </tex> бит, при всех <tex>B \geqslant 1</tex> | Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить <tex>sketch</tex> узла в <tex>w</tex>-битный тип. Так как <tex>r \leqslant B-1</tex>, то <tex>sketch(node)</tex> будет занимать <tex>B(r^4 + 1) \leqslant B((B-1)^4 + 1) = B((B^2 - 2B + 1)^2 + 1)=</tex><tex>B(B^4 + 4B^2 + 1 - 4B^3 + 2B^2 -4B + 1) = B^5 - 4B^3 + 6B^2 - 4B + 2 \leqslant B^5 </tex><tex> = (w^{1/5})^5 = w </tex> бит, при всех <tex>B \geqslant 1</tex> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Индекс наиболее старшего бита с помощью цикла де Брёйна == | == Индекс наиболее старшего бита с помощью цикла де Брёйна == |
Версия 23:27, 6 июня 2015
Fusion tree — дерево поиска, позволяющее хранить
-битных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложена в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard).Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей,
- время, за которое определяется, в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим цифровой бор из ключей узла дерева. Всего ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера (индексация идет от листьев, которые соответствуют концу числа, т.е. младшему разряду). Количество существенных битов не больше (все ребра на уровне детей ветвящейся вершины — обведены на рисунке — являются существенными битами, и так как ветвящихся вершин , значит, и количество уровней с детьми не больше , поскольку на одном уровне могут быть несколько ветвящихся вершин).
В Fusion tree вместе с ключом
хранится — последовательность битов .Утверждение: |
сохраняет порядок, то есть , если . |
Рассмотрим наибольший общий префикс | и . Тогда следующий бит определяет их порядок и одновременно является существенным битом. Поэтому, если , то и .
Поиск вершины
Пусть
— множество ключей узла, отсортированных по возрастанию, — ключ искомой вершины, — количество бит в . Сначала найдем такой ключ , что . Хотя положение среди не всегда эквивалентно положению среди , зная соседние элементы , мы можем найти и .Поиск следующего и предыдущего
Утверждение: |
Среди значений и по есть или по значению . |
Рассмотрим | . У него есть существенные биты и некоторый элемент , с которым у наибольший общий префикс (настоящий, а не по ). Биты из , находящиеся в префиксе совпадают, значит и среди должны быть такими же среди , и один из них имеет дальше бит (а другой ) и с ним может быть больше других общих бит в . То есть либо , либо имеют следующий существенный бит такой же, как и у . Поэтому если значение равно , то наибольший среди значений с меньшим , и, аналогично для , наименьший среди больших.
Предположим, что
— наибольший общий префикс, а его длина, — ключ, имеющий наибольший общий префикс с ( или ).- если , то бит равен единице, а бит равен нулю. Так как общий префикс и является наибольшим, то не существует ключа с префиксом . Значит, больше всех ключей с префиксом меньшим либо равным . Найдем , , который одновременно будет ,
- если — найдем , . Это будет .
Длина наибольшего общего префикса двух
-битных чисел и может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом и .Сравнение значений sketch двух чисел
Определим
как число, составленное из единиц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся единицы. Применим к получившемуся побитовое c , чтобы убрать лишние биты.
Если
, то , в противном случае . Теперь надо найти количество единиц в . Умножим на , тогда все единицы сложатся в первом блоке результата, и, чтобы получить количество единиц, сдвинем его вправо на бит. В таком случае мы получим некоторое , где является реальным , а мы можем получить с помощью цикла де БрёйнаВычисление sketch(x)
Чтобы найти
за константное время, будем вычислять , имеющий все существенные биты в нужном порядке, но содержащий лишние нули. Хотя содержит лишние нули, мы сможем вычислять его быстрее, чем обычный , потому что нам не придется каждый раз идти по всем битам числа, выбирая стоящие на нужных нам местах. Будем использовать вместо — это никак не повлияет на сравнение, поскольку добавленные биты равны нулю и стоят на одних и тех же местах для всех- Уберем все несущественные биты .
- Умножением на некоторое заранее вычисленное число сместим все существенные биты в блок меньшего размера: .
- Применив побитовое , уберем лишние биты, появившиеся в результате умножения: .
- Сделаем сдвиг вправо на бит.
Утверждение: |
Дана последовательность из чисел . Тогда существует последовательность , такая что:
|
Выберем некоторые Чтобы получить , таким образом, чтобы . Предположим, что мы выбрали . Тогда . Всего недопустимых значений для , поэтому всегда можно найти хотя бы одно значение. , выбираем каждый раз наименьшее и прибавляем подходящее число кратное , такое что . |
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить
узла в -битный тип. Так как , то будет занимать бит, при всехИндекс наиболее старшего бита с помощью цикла де Брёйна
Последовательность де Брёйна — последовательность
, элементы которой принадлежат заданному конечному множеству (обычно рассматривают множество ), и все подпоследовательности заданной длины различны.Примеры
Примеры циклов де Брёйна для
с периодом 2, 4, 8, 16:- 01 (содержит подпоследовательности 0 и 1)
- 0011 (содержит подпоследовательности 00, 01, 11, 10)
- 00010111 (000, 001, 010, 101, 011, 111, 110, 100)
- 0000100110101111
Получение индекса по значению степени двойки
Возьмем цикл де Брёйна для
и запишем его как число (для цикл де Брёна равен , а значение ). Умножим это число на , сдвинем его влево на , а затем обратно вправо на ( такое, что ). ), тогда получившееся число — -ая подстрока длины данного цикла де Брёйна. Эту перестановку опозначим за и тогда применив ее к получим : в данном случае такое, что подряд идущих бит равны значению, на сколько мы сдвинули, на какой позиции стоит вектор длины .