Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
tsvpis.docx
Скачиваний:
75
Добавлен:
11.04.2015
Размер:
388.15 Кб
Скачать

2.3. Быстрая свертка

2.3.1. Понятие свертки

Определение. Пусть даны два массива:

a = (…,a-1, a0, a1, a2, …), b = (…,b-1 ,b0,b1, b2, …) – конечные или бесконечные в одну или в обе стороны. Тогда сверткой последовательности a и b называется массив

c = (.., c-1, c0, c1, c2, …), где (2.5a)

т.е. суммирование производится по всевозможным сочетаниям, в которых k + l = i. Обозначается свёртка как: c = a*b.

В случае, когда последовательности (массивы) a и b бесконечны в обе стороны, выражение для ci можно представить в виде

(2.5б)

Аналогичным образом определяется свертка для конечных массивов (в формулу (2.5.б) подставляются конечные пределы суммирования).

Пример. Даны два массива:

a = (a0, a1);

b = (b0, b1, b2).

Определим свёртку этих массивов , используя формулу (2.5а):

c0 = a0b0,

c1 = a0b1 + a1b0,

c2 = a1b + a0b2,

c3 = a1b2.

Рассмотрим классический пример свёртки.

  1. При умножении многочленов:

a(x) = a0 + a1x + … + an-1 xn-1,

bx) = b0 + b1x + … + bn-1- xn-1.

a(x)*b(x) = c(x) = c0 + c1x1 + … + c2n-2 x2n – 2,

c = a*b.

  1. При перемножении числе столбиком (если не делать переносы в старшие разряды).

  2. Пусть a и b – дискретные независимые случайные величины, такие что P(a = i) = ai, P(b = i) = bi. Причем a и b – обязательно независимые случайные величины (независимые случайные величины – те, для которых справедливо высказывание: P((xA) и (y B)) = P(xA) · P(y B), где x, y – значения случайных величин, А и В – некоторые множества из области значений соответствующих случайных величин).

Тогда, случайная величина c = a + b имеет распределение, которое есть ни что иное, как всёртка массивов ai и bi.

.

2.3.2. Обычный и быстрый алгоритм свертки

Рассмотрим два конечных вектора (массива). Для удобства их длина одинакова и равна n. Если же массивы имеют разное количество элементов n и m, причем n>m, то более короткий массив дополняем n-m нулями до n элементов (выравниваем массивы по более длинному).

Имеем:

a = (a0, a1, a2, …, an-1)

b = (b0, b1, b2, …, bn-1).

Оценим трудоемкость вычисление свертки по обычному алгоритму:

c0 = a0b0 - состоит из 1 слагаемого

c1 = a0b1 + a1b0 - состоит из 2 слагаемых

c2 = … - состоит из 3 слагаемых

до середины массива с количество слагаемых, из которых состоят его элементы, увеличивается до n

сn-1 = a0bn-1 + … + an-1b0,

n слагаемых

а от cn до c2n-2 уменьшается. Последний элемент массива – c2n – 2 – имеет одно слагаемое. Итого:

T(n) = 1 + 2 + 3 + … + (n-1) + n + (n-1) + … + 3 + 2 + 1 = n2.

Если реализовать вычисления по формуле (2.5а), т.е. нерационально – путем организации трех вложенных циклов (во внутреннем цикле будет проверка по условию k + l = i), то трудоемкость будет даже не n2, а n3. На самом деле, используя в формулах свертки преобразование Фурье, можно снизить трудоемкость с n2 до nlog(n). Для вывода этих формул сначала докажем теорему.

Теорема 2.1. Пусть a = (a0, a1, a2, … , an-1, 0, 0, 0 … 0)

и b = (b0, b1, b2, … , bn-1, 0, 0, 0 … 0) – массив длины 2n полученные из первоначальных массивов длины n путем дописывания n нулей. Соответственно, F(a) и F(b) – преобразования Фурье от этих массивов, т.е.

F(a) =

F(b) =( .

Тогда преобразование Фурье от их свертки:

есть ничто иное, как покоординатное произведение массивов F(a) и F(b), помноженное на 2n: .

Доказательство. Введем переменную w = exp { -2i/2n}.

Тогда, по формулам преобразования Фурье:

Аналогично,

Теперь мы можем перемножить и . Посмотрим, что получится в результате:

Ввёдем новую переменную m = l +j.

В результате получаем

Теорема доказана.

Используя Теорему 2.1, в которой фактически сказано, что преобразование Фурье от свертки есть

F(c) = F(a*b) = 2n F(a) ○ F(b)

Операция покоординатного перемножения массивов

приходим к выводу, что можно выполнять свертку с помощью преобразования Фурье по следующей формуле:

a*b = F-1(2nF(a) ○ F(b)), (2.6)

где F-1 – обратное преобразование Фурье. => Свертка массивов a и b может быть выполнена по формуле 2.6.

Трудоемкость свертки по формуле 2.6:

T(n) = 3 · 2n · log(2n) ≈ n logn << n2

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

трудоемкость покоординатного перемножения массивов

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]