Fusion tree — различия между версиями
Lena (обсуждение | вклад) (→Ссылки) |
Lena (обсуждение | вклад) (→Структура) |
||
| Строка 8: | Строка 8: | ||
[[Файл:Fusion.png||500x400px|center|визуализация функции sketch]] | [[Файл:Fusion.png||500x400px|center|визуализация функции sketch]] | ||
| − | В Fusion tree вместе с ключом <tex>x</tex> хранится <tex>sketch(x)</tex> - последовательность битов <tex>x_{b_{r-1}}\ldots x_{b_0}</tex>. <tex>Sketch</tex> сохраняет порядок, то есть <tex>sketch(x) < sketch(y)</tex>, если <tex>x < y</tex>. | + | В Fusion tree вместе с ключом <tex>x</tex> хранится <tex>sketch(x)</tex> - последовательность битов <tex>x_{b_{r-1}}\ldots x_{b_0}</tex>. |
| + | {{Утверждение | ||
| + | |id=sketch. | ||
| + | |author= | ||
| + | |about= | ||
| + | |statement=<tex>Sketch</tex> сохраняет порядок, то есть <tex>sketch(x) < sketch(y)</tex>, если <tex>x < y</tex>. | ||
| + | |proof= | ||
| + | Рассмотрим наибольший общий префикс <tex>x</tex> и <tex>y</tex>. Тогда следующий бит определяет их порядок и одновременно является существенным битом. | ||
| + | }} | ||
==Поиск вершины== | ==Поиск вершины== | ||
Версия 16:30, 11 июня 2013
Fusion tree — дерево поиска, позволяющее хранить -битных положительных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложенна в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard).
Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей;
- время, за которое определяется в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим цифровой бор из ключей узла дерева. Всего ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера . Количество существенных битов не больше чем .
В Fusion tree вместе с ключом хранится - последовательность битов .
| Утверждение: |
сохраняет порядок, то есть , если . |
| Рассмотрим наибольший общий префикс и . Тогда следующий бит определяет их порядок и одновременно является существенным битом. |
Поиск вершины
Пусть - множество ключей узла, отсортированных по возрастанию, - ключ искомой вершины, - количество бит в .
Параллельное сравнение
Сначала найдем и . Определим как число, составленное из едениц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся еденицы. Применим к получившемуся побитовое c , чтобы убрать лишние биты.
AND
Если , то , в противном случае . Теперь надо найти количество едениц в L. Умножим L на , тогда все еденицы сложатся в первом блоке результата, и, чтобы получить количество едениц, сдвинем его вправо.
Succ(q) и pred(q)
Пусть . Среди всех ключей наибольший общий префикс с будет иметь или или . Сравнивая и , найдем какой из ключей имеет наибольший общий префикс с (наименьшнее значение соответствует наибольшей длине).
Предположим, что - наибольший общий перфикс, а его длина, - ключ, имеющий наибольший общий префикс с ( или ).
- если , то бит равен еденице, а бит равен 0. Так как общий префикс и является наибольшим, то не существет ключа с префиксом .Значит, больше всех ключей с префиксом меньшим либо равным . Найдем , который одновременно будет ;
- если - найдем , . Это будет .
Длина наибольшего общего префикса двух w-битных чисел a и b может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом a и b.
Вычисление 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)