Fusion tree
Fusion tree — дерево поиска, позволяющее хранить
-битных положительных чисел, используя памяти, и выполнять операции поиска за время .Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей;
- время, за которое определяется в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Рассмотрим цифровой бор из ключей узла дерева. Всего
ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера . Количество существенных битов не больше чем .В Fusion tree вместо ключа
хранится - последовательность битов . сохраняет порядок, то есть , если .Поиск вершины
Пусть
- множество ключей узла, отсортированных по возрастанию, - ключ искомой вершины, - количество бит в .Succ(sketch(q)) и pred(sketch(q))
Определим
как число, составленное из едениц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся еденицы. Применим к получившемуся побитовое AND c , чтобы убрать лишние биты.AND
Если
, то , в противном случае . Так как ключи отсортированны по возрастанию, получив номер наиболее значащего бита, можно найти .Succ(q) и pred(q)
Пусть
. Среди всех ключей наибольший общий префикс с будет иметь или или . Сравнивая aXORq и bXORq, найдем какой из ключей имеет наибольший общий префикс с q (наименьшнее значение соответствует наибольшей длине).Предположим, что p - наибольший общий перфикс, а y его длина, a_j - ключ, имеющий наибольший общий префикс с q (j = i или i+1).
- если q>a_j, то y + 1 бит q равен еденице, а y + 1 бит a_j равен 0. Так как общий префикс a_j и q является наибольшим, то не существет ключа с префиксом p1.Значит, q больше всех ключей с префиксом меньшим либо равным p. Найдем pred e = p01\ldots 11, который одновременно будет равен pred(q);
- если < - найдем succ e = p10\ldots 00. Это будет succ(q).
Длина наибольшего общего префикса двух w-битных чисел a и b может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом XOR a и b.
Вычисление sketch(x)
Чтобы найти sketch за константное время, будем вычислять sketch(x), имеющий все существенные биты в нужном порядке, но содержащий лишние нули.
1) уберем все несущественные биты
AND ;2) умножением на некоторое число
сместим все существенные биты в блок меньшего размера;
3) применив побитовое AND уберем лишние биты, появившиеся в результате умножения;
AND ;
4) сделаем сдвиг вправо на
бит.Утверждение: |
Дана последовательность из r чисел . Тогда существует последовательность , такая что:
1) все различны, для ;2) 3) ; . |
Выберем некоторые, таким образом, чтобы. Предположим, что мы выбрали. mt' != mi' + bj - bk A i,j,k. В противном случае . Всего t*r*r <= r^3 недопустимых значений для mt', поэтому всегда можно найти хотя бы одно значение. Чтобы получить mi, выбираем каждый раз наименьшие mi' и прибавляем подходящее число кратное r^3, такое что mi+ci<mi+l+Ci+l<=mi+ci+r3. |
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить sketch узла в w-битный тип. Так как r<=B-1, то sketch(node) будет занимать B*(r*4 + 1) <= B*((B-1)^4 + 1) <= B^5 = (w^{1/5})^5 = w бит.
Индекс наиболее значащего бита
Чтобы найти в w-битном числе x индекс самого старшего бита, содержащего еденицу, разделим x на
блоков по бит. . Далее найдем первый непустой блок и индекс первого еденичного бита в нем.1)Поиск непустых блоков.
a. Определим какие блоки имеют еденицу в первом бите. Применим побитовое AND к x и константой F
b. Определим, содержат ли остальные биты еденицы.
Вычислим
.
Вычтем от
. Если какой-нибудь бит F обнулится, значит, соответствующий блок содержит еденицы.
Чтобы найти блоки, содержащие еденицы, вычислим
.
Первый бит в каждом блоке
содержит еденицу, если соответствующий блок x ненулевой.