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)