Fusion tree — различия между версиями
Lena (обсуждение | вклад) (→Структура) |
Lena (обсуждение | вклад) (→Вычисление sketch(x)) |
||
Строка 52: | Строка 52: | ||
1) уберем все несущественные биты <tex>x' = x</tex> ''AND'' <tex>\displaystyle \sum_{i=0}^{r-1}2^{b_i}</tex>; | 1) уберем все несущественные биты <tex>x' = x</tex> ''AND'' <tex>\displaystyle \sum_{i=0}^{r-1}2^{b_i}</tex>; | ||
− | 2) умножением на некоторое число <tex>M = \displaystyle\sum_{i=0}^{r-1}2^{m_i}</tex> сместим все существенные биты в блок меньшего размера | + | 2) умножением на некоторое заранее вычисленное число <tex>M = \displaystyle\sum_{i=0}^{r-1}2^{m_i}</tex> сместим все существенные биты в блок меньшего размера. |
<tex>x'\times M = \displaystyle(\sum_{i=0}^{r-1}x_{b_i}2^{b_i})(\sum_{i=0}^{r-1}2^{m_i}) = \sum_{i=0}^{r-1}\sum_{j=0}^{r-1}x_{b_i}2^{b_i+m_j}</tex>; | <tex>x'\times M = \displaystyle(\sum_{i=0}^{r-1}x_{b_i}2^{b_i})(\sum_{i=0}^{r-1}2^{m_i}) = \sum_{i=0}^{r-1}\sum_{j=0}^{r-1}x_{b_i}2^{b_i+m_j}</tex>; | ||
− | 3) применив побитовое ''AND'' уберем лишние биты, появившиеся в результате умножения; | + | 3) применив побитовое ''AND'', уберем лишние биты, появившиеся в результате умножения; |
<tex>\displaystyle\sum_{i=0}^{r-1}\sum_{j=0}^{r-1}x_{b_i}2^{b_i+m_j}</tex> ''AND'' <tex>\displaystyle\sum_{i=0}^{r-1}2^{b_i+m_i} = \sum_{i=0}^{r-1}x_{b_i}2^{b_i+m_i}</tex>; | <tex>\displaystyle\sum_{i=0}^{r-1}\sum_{j=0}^{r-1}x_{b_i}2^{b_i+m_j}</tex> ''AND'' <tex>\displaystyle\sum_{i=0}^{r-1}2^{b_i+m_i} = \sum_{i=0}^{r-1}x_{b_i}2^{b_i+m_i}</tex>; | ||
Строка 65: | Строка 65: | ||
|author= | |author= | ||
|about= | |about= | ||
− | |statement=Дана последовательность из r чисел <tex>b_0<b_1<\ldots <b_{r-1}</tex>. Тогда существует последовательность <tex>m_0<m_1\ldots <m_{r-1}</tex>, такая что: | + | |statement=Дана последовательность из <tex>r</tex> чисел <tex>b_0<b_1<\ldots <b_{r-1}</tex>. Тогда существует последовательность <tex>m_0<m_1\ldots <m_{r-1}</tex>, такая что: |
1) все <tex>b_i + m_j</tex> различны, для <tex>0\leqslant i,j \leqslant r-1</tex>; | 1) все <tex>b_i + m_j</tex> различны, для <tex>0\leqslant i,j \leqslant r-1</tex>; | ||
− | 2) <tex> | + | 2) <tex>b_0 + m_0\leqslant b_1 + m_1\leqslant \ldots \leqslant b_{r-1} + m_{r-1}</tex>; |
3) <tex>(b_{r-1} + m_{r-1}) - (b_0 + m_0) \leqslant r^4</tex>. | 3) <tex>(b_{r-1} + m_{r-1}) - (b_0 + m_0) \leqslant r^4</tex>. | ||
|proof= | |proof= | ||
− | Выберем некоторые <tex>m_i'</tex>, таким образом, чтобы <tex>m_i' + b_k not\equiv m_j' + b_p</tex>. Предположим, что мы выбрали <tex>m_1' \ldots m_{t-1}'</tex>. Тогда <tex>m_t' \ne m_i' + b_j - b_k \; \forall i,j,k</tex>. Всего <tex>t\times r\times r < r^3 </tex> недопустимых значений для <tex>m_t'</tex>, поэтому всегда можно найти хотя бы одно значение. | + | Выберем некоторые <tex>m_i'</tex>, таким образом, чтобы <tex>m_i' + b_k \not\equiv m_j' + b_p</tex>. Предположим, что мы выбрали <tex>m_1' \ldots m_{t-1}'</tex>. Тогда <tex>m_t' \ne m_i' + b_j - b_k \; \forall i,j,k</tex>. Всего <tex>t\times r\times r < r^3 </tex> недопустимых значений для <tex>m_t'</tex>, поэтому всегда можно найти хотя бы одно значение. |
Чтобы получить <tex>m_i</tex>, выбираем каждый раз наименьшее <tex>m_i'</tex> и прибавляем подходящее число кратное <tex>r^3</tex>, такое что <tex>m_i+c_i < m_{i+1}+c_{i+1} \leqslant m_i+c_i+r^3</tex>. | Чтобы получить <tex>m_i</tex>, выбираем каждый раз наименьшее <tex>m_i'</tex> и прибавляем подходящее число кратное <tex>r^3</tex>, такое что <tex>m_i+c_i < m_{i+1}+c_{i+1} \leqslant m_i+c_i+r^3</tex>. |
Версия 20:49, 11 июня 2013
Fusion tree — дерево поиска, позволяющее хранить
-битных чисел, используя памяти, и выполнять операции поиска за время . Эта структура данных была впервые предложенна в 1990 году М. Фредманом (M. Fredman) и Д. Уиллардом (D. Willard).Содержание
Структура
Fusion tree — это B-дерево, такое что:
- у всех вершин, кроме листьев, детей;
- время, за которое определяется, в каком поддереве находится вершина, равно .
Такое время работы достигается за счет хранения дополнительной информации в вершинах. Построим цифровой бор из ключей узла дерева. Всего
ветвящихся вершин. Биты, соответствующие уровням дерева, в которых происходит ветвление, назовем существенными и обозначим их номера . Количество существенных битов не больше чем .В Fusion tree вместе с ключом
хранится - последовательность битов .Утверждение: |
сохраняет порядок, то есть , если . |
Рассмотрим наибольший общий префикс | и . Тогда следующий бит определяет их порядок и одновременно является существенным битом. Поэтому, если , то и .
Поиск вершины
Пусть
- множество ключей узла, отсортированных по возрастанию, - ключ искомой вершины, - количество бит в . Сначала найдем такой ключ , что . Но положение среди не всегда эквивалентно положению среди , поэтому, зная соседние элементы , найдем и .Параллельное сравнение
Найдем
и . Определим как число, составленное из едениц и , то есть . Вычтем из число . В начале каждого блока, где , сохранятся еденицы. Применим к получившемуся побитовое AND c , чтобы убрать лишние биты.AND
Если
, то , в противном случае . Теперь надо найти количество едениц в L. Умножим L на , тогда все еденицы сложатся в первом блоке результата, и, чтобы получить количество едениц, сдвинем его вправо.Succ(q) и pred(q)
Пусть
.Утверждение: |
Среди всех ключей наибольший общий префикс с будет иметь или или . |
Педположим, что | имеет наибольший общий префикс с . Тогда будет иметь больше общих битов со . Значит, ближе по значению к , чем или , что приводит к противоречию.
Сравнивая
XOR и XOR , найдем какой из ключей имеет наибольший общий префикс с (наименьшнее значение соответствует наибольшей длине).Предположим, что
- наибольший общий перфикс, а его длина, - ключ, имеющий наибольший общий префикс с ( или ).- если , то бит равен еденице, а бит равен нулю. Так как общий префикс и является наибольшим, то не существет ключа с префиксом . Значит, больше всех ключей с префиксом меньшим либо равным . Найдем , , который одновременно будет ;
- если - найдем , . Это будет .
Длина наибольшего общего префикса двух w-битных чисел
и может быть вычислена с помощью нахождения индекса наиболее значащего бита в побитовом XOR и .Вычисление sketch(x)
Чтобы найти sketch за константное время, будем вычислять
, имеющий все существенные биты в нужном порядке, но содержащий лишние нули.1) уберем все несущественные биты
AND ;2) умножением на некоторое заранее вычисленное число
сместим все существенные биты в блок меньшего размера.;
3) применив побитовое AND, уберем лишние биты, появившиеся в результате умножения;
AND ;
4) сделаем сдвиг вправо на
бит.Утверждение: |
Дана последовательность из чисел . Тогда существует последовательность , такая что:
1) все различны, для ;2) 3) ; . |
Выберем некоторые Чтобы получить , таким образом, чтобы . Предположим, что мы выбрали . Тогда . Всего недопустимых значений для , поэтому всегда можно найти хотя бы одно значение. , выбираем каждый раз наименьшее и прибавляем подходящее число кратное , такое что . |
Первые два условия необходимы для того, чтобы сохранить все существенные биты в нужном порядке. Третье условие позволит поместить sketch узла в w-битный тип. Так как
, то будет занимать бит.Индекс наиболее значащего бита
Чтобы найти в w-битном числе
индекс самого старшего бита, содержащего еденицу, разделим на блоков по бит. . Далее найдем первый непустой блок и индекс первого еденичного бита в нем.1) Поиск непустых блоков.
a. Определим, какие блоки имеют еденицу в первом бите. Применим побитовое AND к
и константе .
b. Определим, содержат ли остальные биты еденицы.
Вычислим
XOR .
Вычтем от . Если какой-нибудь бит обнулится, значит, соответствующий блок содержит еденицы.
Чтобы найти блоки, содержащие еденицы, вычислим XOR .
c. Первый бит в каждом блоке OR содержит еденицу, если соответствующий блок ненулевой.
2) Найдем , чтобы сместить все нужные биты в один блок. Существенными битами в данном случае будут первые биты каждого блока, поэтому .
Будем использовать
. Тогда . Все суммы различны при . Все возрастают, и .Чтобы найти
, умножим на и сдвинем вправо на бит.3) Найдем первый ненулевой блок. Для этого надо найти первую еденицу в
. Как и при поиске и используем параллельное сравнение с . В результате сравнения получим номер первого ненулевого блока .4) Найдем номер
первого еденичного бита в найденном блоке так же как и в предыдущем пункте.5) Индекс наиболее значащего бита будет равен
.Каждый шаг выполняется за
, поэтому всего потребуется времени, чтобы найти индекс.Ссылки
MIT CS 6.897: Advanced Data Structures: Lecture 4, Fusion Trees, Prof. Erik Demaine (Spring 2003)