Fusion tree — различия между версиями
Lena (обсуждение | вклад) (→Поиск вершины) |
Lena (обсуждение | вклад) (→Succ(q) и pred(q)) |
||
Строка 28: | Строка 28: | ||
Теперь надо найти количество едениц в ''L''. Умножим ''L'' на <tex>\underbrace{0\ldots 01}_{l + 1 bits}\ldots \underbrace{0\ldots 01}_{l+1 bits}</tex>, тогда все еденицы сложатся в первом блоке результата, и, чтобы получить количество едениц, сдвинем его вправо. | Теперь надо найти количество едениц в ''L''. Умножим ''L'' на <tex>\underbrace{0\ldots 01}_{l + 1 bits}\ldots \underbrace{0\ldots 01}_{l+1 bits}</tex>, тогда все еденицы сложатся в первом блоке результата, и, чтобы получить количество едениц, сдвинем его вправо. | ||
===Succ(q) и pred(q)=== | ===Succ(q) и pred(q)=== | ||
− | Пусть <tex>sketch(a_i) \leqslant sketch(q) \leqslant sketch(a_{i+1})</tex>. Среди всех ключей наибольший общий префикс с <tex>q</tex> будет иметь или <tex>a_i</tex> или <tex>a_{i+1}</tex>. Сравнивая <tex>a | + | Пусть <tex>sketch(a_i) \leqslant sketch(q) \leqslant sketch(a_{i+1})</tex>. |
+ | {{Утверждение | ||
+ | |id=prefix. | ||
+ | |author= | ||
+ | |about= | ||
+ | |statement=Среди всех ключей наибольший общий префикс с <tex>q</tex> будет иметь или <tex>a_i</tex> или <tex>a_{i+1}</tex>. | ||
+ | |proof= | ||
+ | Педположим, что <tex>y</tex> имеет наибольший общий префикс с <tex>q</tex>. Тогда <tex>sketch(q)</tex> будет иметь больше общих битов со <tex>sketch(y)</tex>. Значит, <tex>sketch(y)</tex> ближе по значению к <tex>sketch(q)</tex>, чем <tex>sketch(a_i)</tex> или <tex>sketch(a_{i+1})</tex>, что приводит к противоречию. | ||
+ | }} | ||
+ | Сравнивая <tex>a</tex> ''XOR'' <tex>q</tex> и <tex>b</tex> ''XOR'' <tex>q</tex>, найдем какой из ключей имеет наибольший общий префикс с <tex>q</tex> (наименьшнее значение соответствует наибольшей длине). | ||
Предположим, что <tex>p</tex> - наибольший общий перфикс, а <tex>y</tex> его длина, <tex>a_j</tex> - ключ, имеющий наибольший общий префикс с <tex>q</tex> (<tex>j = i</tex> или <tex>i+1</tex>). | Предположим, что <tex>p</tex> - наибольший общий перфикс, а <tex>y</tex> его длина, <tex>a_j</tex> - ключ, имеющий наибольший общий префикс с <tex>q</tex> (<tex>j = i</tex> или <tex>i+1</tex>). | ||
− | * если <tex>q>a_j</tex>, то <tex>y + 1</tex> бит <tex>q</tex> равен еденице, а <tex>y + 1</tex> бит <tex>a_j</tex> равен | + | * если <tex>q>a_j</tex>, то <tex>y + 1</tex> бит <tex>q</tex> равен еденице, а <tex>y + 1</tex> бит <tex>a_j</tex> равен нулю. Так как общий префикс <tex>a_j</tex> и <tex>q</tex> является наибольшим, то не существет ключа с префиксом <tex>p1</tex>. Значит, <tex>q</tex> больше всех ключей с префиксом меньшим либо равным <tex>p</tex>. Найдем <tex>pred(e)</tex>, <tex>e = p01\ldots 11</tex>, который одновременно будет <tex>равен pred(q)</tex>; |
* если <tex>q<a_j</tex> - найдем <tex>succ(e)</tex>, <tex>e = p10\ldots 00</tex>. Это будет <tex>succ(q)</tex>. | * если <tex>q<a_j</tex> - найдем <tex>succ(e)</tex>, <tex>e = p10\ldots 00</tex>. Это будет <tex>succ(q)</tex>. | ||
− | Длина наибольшего общего префикса двух ''w''-битных чисел | + | Длина наибольшего общего префикса двух ''w''-битных чисел <tex>a</tex> и <tex>b</tex> может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом ''XOR'' <tex>a</tex> и <tex>b</tex>. |
==Вычисление sketch(x)== | ==Вычисление sketch(x)== |
Версия 17:42, 11 июня 2013
Fusion tree — дерево поиска, позволяющее хранить
-битных положительных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложенна в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard).Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей;
- время, за которое определяется в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим цифровой бор из ключей узла дерева. Всего
ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера . Количество существенных битов не больше чем .В Fusion tree вместе с ключом
хранится - последовательность битов .Утверждение: |
сохраняет порядок, то есть , если . |
Рассмотрим наибольший общий префикс | и . Тогда следующий бит определяет их порядок и одновременно является существенным битом.
Поиск вершины
Пусть
- множество ключей узла, отсортированных по возрастанию, - ключ искомой вершины, - количество бит в . Сначала найдем такой ключ , что . Но положение среди не всегда эквивалентно положению среди , поэтому, зная соседние элементы , найдем и .Параллельное сравнение
Сначала найдем
и . Определим как число, составленное из едениц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся еденицы. Применим к получившемуся побитовое c , чтобы убрать лишние биты.AND
Если
, то , в противном случае . Теперь надо найти количество едениц в L. Умножим L на , тогда все еденицы сложатся в первом блоке результата, и, чтобы получить количество едениц, сдвинем его вправо.Succ(q) и pred(q)
Пусть
.Утверждение: |
Среди всех ключей наибольший общий префикс с будет иметь или или . |
Педположим, что | имеет наибольший общий префикс с . Тогда будет иметь больше общих битов со . Значит, ближе по значению к , чем или , что приводит к противоречию.
Сравнивая
XOR и XOR , найдем какой из ключей имеет наибольший общий префикс с (наименьшнее значение соответствует наибольшей длине).Предположим, что
- наибольший общий перфикс, а его длина, - ключ, имеющий наибольший общий префикс с ( или ).- если , то бит равен еденице, а бит равен нулю. Так как общий префикс и является наибольшим, то не существет ключа с префиксом . Значит, больше всех ключей с префиксом меньшим либо равным . Найдем , , который одновременно будет ;
- если - найдем , . Это будет .
Длина наибольшего общего префикса двух w-битных чисел
и может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом XOR и .Вычисление sketch(x)
Чтобы найти sketch за константное время, будем вычислять
, имеющий все существенные биты в нужном порядке, но содержащий лишние нули.1) уберем все несущественные биты
AND ;2) умножением на некоторое число
сместим все существенные биты в блок меньшего размера;
3) применив побитовое AND уберем лишние биты, появившиеся в результате умножения;
;
4) сделаем сдвиг вправо на
бит.Утверждение: |
Дана последовательность из r чисел . Тогда существует последовательность , такая что:
1) все различны, для ;2) 3) ; . |
Выберем некоторые Чтобы получить , таким образом, чтобы . Предположим, что мы выбрали . Тогда . Всего недопустимых значений для , поэтому всегда можно найти хотя бы одно значение. , выбираем каждый раз наименьшее и прибавляем подходящее число кратное , такое что . |
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить sketch узла в w-битный тип. Так как
, то будет занимать бит.Индекс наиболее значащего бита
Чтобы найти в w-битном числе x индекс самого старшего бита, содержащего еденицу, разделим x на
блоков по бит. . Далее найдем первый непустой блок и индекс первого еденичного бита в нем.1)Поиск непустых блоков.
a. Определим какие блоки имеют еденицу в первом бите. Применим побитовое AND к x и константой F
b. Определим, содержат ли остальные биты еденицы.
Вычислим
.
Вычтем от
. Если какой-нибудь бит обнулится, значит, соответствующий блок содержит еденицы.
Чтобы найти блоки, содержащие еденицы, вычислим
.
c. Первый бит в каждом блоке
содержит еденицу, если соответствующий блок x ненулевой.
2) найдем sketch(y), чтобы сместить все нужные биты в один блок. Существенными битами в данном случае будут первые биты каждого блока, поэтому
.Будем использовать
. Тогда . Все суммы различны при . Все возрастают, и . Чтобы найти sketch(y), умножим y на m и сдвинем вправо на w бит.3)Найдем первый ненулевой блок. Для этого надо найти первую еденицу в sketch(y). Как и при поиске succ(sketch(q)) и pred(sketch(q)) используем параллельное сравнение sketch(y) с
. В результате сравнения получим номер первого ненулевого блока .4) найдем номер
первого еденичного бита в найденном блоке так же как и в предыдущем пункте.5) инедекс наиболее значащего бита будет равен
.Каждый шаг выполняется за
, поэтому всего потребуется времени, чтобы найти индекс.Ссылки
MIT CS 6.897: Advanced Data Structures: Lecture 4, Fusion Trees, Prof. Erik Demaine (Spring 2003)