Дерево Уоллеса — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Схемная сложность)
(Элемент 3→2)
Строка 23: Строка 23:
 
===Элемент 3→2===
 
===Элемент 3→2===
 
[[file:3→2.png|thumb|200px|Элемент 3→2]]
 
[[file:3→2.png|thumb|200px|Элемент 3→2]]
Теперь о том, как устроен элемент <tex>3\to2</tex>.
+
Для того, чтобы представить сумму трёх чисел с помощью двух чисел, воспользуемся полным сумматором. Для каждого <tex>i</tex> направим <tex>x_i</tex>, <tex>y_i</tex> и <tex>z_i</tex> на вход полного сумматора. Тогда младший бит сумматора будет <tex>i</tex>-ым битом первого числа, а старший {{---}} <tex>(i + 1)</tex>-ым второго.  
  
Для построения элемента <tex>3\to2</tex> нам потребуется элемент, который умеет складывать 3 бита и возвращать 2 бита результата.
+
Очевидно, полученные числа в сумме дают <tex>x + y + z</tex>.
Основная идея реализации {{---}} отдельная обработка переносов и остатков.
 
  
Тогда первое число ответа <tex>a</tex> может быть получена так:
+
На иллюстрации изображён элемент <tex>3\to2</tex> для четырёхбитных чисел, в верхнем прямоугольнике изображены четыре полных сумматора, выходы которых и являются разрядами результатов.
<tex>a_i = x_i \oplus y_i \oplus z_i</tex> ,
 
где <tex>x</tex>, <tex>y</tex> и <tex>z</tex> {{---}} входные числа, а <tex>x_i</tex>, <tex>y_i</tex> и <tex>z_i</tex> {{---}} соответствующие их <tex>i</tex>-е биты.
 
  
Второе же число <tex>b</tex> можно получить так:
+
Поскольку все полные сумматоры работают параллельно (выходы на каждом из них зависят только от собственных входов), то глубина такой схемы есть константа (не зависит от количества бит).
<tex> \begin{cases}
 
b_0 & = 0\\
 
b_{i + 1} & = \langle x_i, y_i, z_i \rangle
 
\end{cases}</tex> ,
 
где <tex>\langle x, y, z\rangle</tex> {{---}} функция медианы (она же "голосование 2 из 3"). С помощью этой функции считается перенос.
 
 
 
Очевидно, полученные числа <tex>a</tex> и <tex>b</tex> дадут в сумме <tex>x + y + z</tex>
 
  
 
==Схемная сложность==
 
==Схемная сложность==

Версия 13:29, 12 января 2012

Определение

Дерево Уоллеса — схема для умножения двух чисел.

Принцип работы

Дерево Уоллеса

Иллюстрация работы дерева для суммирования 9 чисел

Для получения произведения, воспользуемся методом, напоминающим умножение «в столбик»: распишем произведение в сумму [math]n[/math] чисел (как в матричном умножителе).

Однако, в отличие от матричного умножителя, дерево Уоллеса складывает все числа не последовательно, а с помощью специального элемента(назовём его [math]3\to2[/math]), преобразующего 3 числа [math]x[/math], [math]y[/math] и [math] z [/math] в числа [math]a[/math] и [math]b[/math] такие, что [math]x + y + z = a + b[/math].

С помощью этого элемента на каждом шаге производятся следующие операции:

  1. Берутся тройки чисел [math](x_1, x_2, x_3)[/math], [math](x_4, x_5, x_6)[/math], [math]\ldots[/math]. При этом какие-то числа могут остаться.
  2. Для каждой тройки применяется элемент [math]3\to2[/math].
  3. Повторяются пункты 1 и 2 пока не осталось 2 числа.
  4. Оставшиеся 2 числа складываются с помощью двоичного каскадного сумматора.

На выходе имеем число, которое равно сумме чисел на всех входах.

Элемент 3→2

Элемент 3→2

Для того, чтобы представить сумму трёх чисел с помощью двух чисел, воспользуемся полным сумматором. Для каждого [math]i[/math] направим [math]x_i[/math], [math]y_i[/math] и [math]z_i[/math] на вход полного сумматора. Тогда младший бит сумматора будет [math]i[/math]-ым битом первого числа, а старший — [math](i + 1)[/math]-ым второго.

Очевидно, полученные числа в сумме дают [math]x + y + z[/math].

На иллюстрации изображён элемент [math]3\to2[/math] для четырёхбитных чисел, в верхнем прямоугольнике изображены четыре полных сумматора, выходы которых и являются разрядами результатов.

Поскольку все полные сумматоры работают параллельно (выходы на каждом из них зависят только от собственных входов), то глубина такой схемы есть константа (не зависит от количества бит).

Схемная сложность

Определим схемную сложность этого элемента.

Каждый элемент [math]3\to2[/math] имеет глубину [math]O(1)[/math] и размер [math]O(n)[/math].

Подсчитаем количество элементов [math]3\to2[/math]. На каждом шаге количество чисел, которые нужно просуммировать, уменьшается в полтора раза. Тогда глубина дерева будет равна [math]\log_{3/2}n[/math], и в нём будет [math]n + \frac23n + \left(\frac23\right)^2n + \ldots = O(n)[/math] элементов [math]3\to2[/math]. Тогда общая сложность равна

[math]depth = depth_{3\to2} \cdot \log_{3/2}n + depth_{sum} = O(\log n)[/math]

[math]size = size_{3\to2} \cdot O(n) + size_{sum} = O(n^2) [/math]

Литература

  • Т. Кормен, Ч. Лейзерсон, Р. Ривест: Алгоритмы: построение и анализ, 1-е изд