Изменения

Перейти к: навигация, поиск

Fusion tree

73 байта убрано, 19:14, 6 июня 2015
Индекс наиболее значащего бита
Чтобы найти в <tex>w</tex>-битном числе <tex>x</tex> индекс самого старшего бита, содержащего единицу (это понадобится в дальнейшем, для нахождения <tex>sketch(y)</tex> ), разделим <tex>x</tex> на <tex>\sqrt{w}</tex> блоков по <tex>\sqrt{w}</tex> бит. <tex>x = \underbrace{0101}_{\sqrt{w}}\; \underbrace{0000}_{\sqrt{w}}\; \underbrace{1000}_{\sqrt{w}}\; \underbrace{1101}_{\sqrt{w}}</tex>. Далее найдем первый непустой блок и индекс первого единичного бита в нем.
'''1)''' # Поиск непустых блоков. '''a.''' ##Определим, какие блоки имеют единицу в первом бите. Применим побитовое <tex>\&</tex> к <tex>x</tex> и константе <tex>F</tex>.   : <tex> $$
\begin{array}{r}
\&
t_1 = \underline{0}000\; \underline{0}000\; \underline{1}000\; \underline{1}000 \end{array}\end{array}
$$</tex>
  '''b.''' ##Определим, содержат ли остальные биты единицы.  ###Вычислим <tex>x \oplus t_1</tex>.  : <tex>
$$
\begin{array}{r}
\end{array}
$$</tex>
  ### Вычтем из <tex>F\; t_2</tex>. Если какой-нибудь бит <tex>F</tex> обнулится, значит, соответствующий блок содержит единицы.  : <tex>
$$
\begin{array}{r}
\end{array}
$$</tex>
  ###Чтобы найти блоки, содержащие единицы, вычислим <tex>t_3 \oplus F</tex>.  : <tex>
$$
\begin{array}{r}
\end{array}
$$</tex>
  '''c.''' ##Первый бит в каждом блоке <tex>y = t_1 \lor t_4</tex> содержит единицу, если соответствующий блок <tex>x</tex> ненулевой.  : <tex>$$
\begin{array}{r}
\lor
\end{array}
$$</tex>
  '''2)''' # Найдем <tex>sketch(y)</tex>, чтобы сместить все нужные биты в один блок. Существенными битами в данном случае будут первые биты каждого блока, поэтому <tex>b_i = \sqrt{w} - 1 + i\sqrt{w}</tex>.  Будем использовать <tex>m_j = w - (\sqrt{w}-1) - j\sqrt{w} +j</tex>. Тогда <tex>b_i + m_j = w + (i - j)\sqrt{w} + j</tex>. Все суммы различны при <tex>0\leqslant i, j < \sqrt{w} </tex>. Все <tex>b_i + m_i = w + i</tex> возрастают, и <tex>(b_{\sqrt{w} - 1} + m_{\sqrt{w} - 1}) - (b_0 + m_0) = \sqrt{w} - 1</tex>.  Чтобы найти <tex>sketch(y)</tex>, умножим <tex>y</tex> на <tex>m</tex> и сдвинем вправо на <tex>w</tex> бит. '''3)''' # Найдем первый ненулевой блок. Для этого надо найти первую единицу в <tex>sketch(y)</tex>. Как и при поиске <tex>succ(sketch(q))</tex> и <tex>pred(sketch(q))</tex> используем параллельное сравнение <tex>sketch(y)</tex> с <tex>2^0, 2^1 \ldots 2^{\sqrt{w} - 1}</tex>. В результате сравнения получим номер первого ненулевого блока <tex>c</tex>. '''4)''' #Найдем номер <tex>d</tex> первого единичного бита в найденном блоке так же как и в предыдущем пункте. '''5)''' #Индекс наиболее значащего бита будет равен <tex>c\sqrt{w}+d</tex>.
Каждый шаг выполняется за <tex>O(1)</tex>, поэтому всего потребуется <tex>O(1)</tex> времени, чтобы найти индекс.
317
правок

Навигация