Алгоритм четырёх русских

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм четырёх русских — в информатике представляет собой метод ускорения алгоритмов с использованием булевых матриц или, в более общем смысле, алгоритмов с использованием матриц, в которых каждая ячейка может принимать только ограниченное число возможных значений.

Разработанный комбинаторный алгоритм позволяет умножать матрицы за O(n3/logn). С некоторыми изменениями можно получить время работы O(n3/log2n). В 2015 году был получен алгоритм, работающий за O^(n3/log4n).[1]

Идея

Основная идея метода состоит в том, чтобы разделить матрицу на небольшие квадратные блоки размером t×t для некоторого параметра t и использовать таблицу поиска для быстрого выполнения алгоритма в каждом блоке. Индекс в таблице поиска кодирует значения ячеек матрицы в верхнем левом углу границы блока до некоторой операции алгоритма, а значения в таблице поиска кодируют значения граничных ячеек в правом нижнем углу блока после операции. Таким образом, общий алгоритм может быть выполнен с использованием только (n/t)2 блоков вместо n2 ячеек матрицы, где n — длина строки матрицы. Для того чтобы размер таблиц поиска (и время, необходимое для их инициализации) было достаточно малым, t обычно выбирается равным O(logn).

Применение

Алгоритмы, к которым может быть применен метод четырех русских:

В каждом из этих случаев это ускоряет алгоритм в logn или log2n раз.

Опубликованный Бардом алгоритм инверсии матрицы «Метод четырёх русских» реализован в библиотеке M4RI для быстрой арифметики с плотными матрицами над F2. M4RI используется SageMath и библиотекой PolyBoRi.[1]

Алгоритм умножения булевых матриц

Описание алгоритма

Алгоритм получает на вход две булевы матрицы (n×n) A и B и возвращает матрицу C=AB.

Пусть m=logn.

Разобьём A на матрицы A1,A2,...,An/m, где Ai,1i<n/m, состоит из столбцов матрицы A с номерами от m(i1)+1 до mi, а An/m — из оставшихся столбцов, к которым добавлены столбцы нулей, если это нужно, чтобы в матрице было m столбцов.

Разобьём B на матрицы B1,B2,...,Bn/m, где Bi,1i<n/m, состоит из строк матрицы B с номерами от m(i1)+1 до mi, а Bn/m — из оставшихся строк, к которым добавлены строки нулей, если это нужно, чтобы в матрице было m строк.

Псевдокод

begin

  for i1 to n/m do

  begin

    comment Вычисляем суммы строк b1(i),...,bm(i) матрицы Bi;

    СУММАСТРОК[0] [0,0,,0]n

    for j1 to 2m1 do

    begin

      Пусть k таково, что 2kj<2k+1

      СУММАСТРОК[j]СУММАСТРОК[j2k]+bk+1(i)

    end

    Пусть Ci — матрица,  i-я строка которой равна СУММАСТРОК[ЧИС(aj)],

    где aj — j-я строка матрицы Ai, 1j<n,

  end;

  Пусть C=i=1n/mCi

end.[2]

ЧИС(v) — целое число, представленное двоичным вектором v, записанным в двоичной системе счисления с обратным порядком разрядов. Например, ЧИС([0,1,1])=6.

Обоснование корректности

Простая индукция по j показывает, что СУММАСТРОК[j] становится равной поразрядной булевой сумме таких строк bk матрицы Bi, что в двоичном представлении числа j на k-том месте справа стоит 1. Отсюда вытекает, что Ci=AiBi и C=AB.

Время работы

Рассмотрим цикл по j. Вычисление и присваивание значений СУММАСТРОК[j] происходит за O(n). Вычисление k занимает время O(m). Итерация цикла выполняется за O(n), всего 2m1 итераций. m<logn, 2m1<n, следовательно весь цикл выполнится за O((2m1)n)=O(n2).

Вычисление ЧИС(aj) имеет сложность O(m), а копирование вектора СУММАСТРОК[ЧИС(aj)] — сложность O(n), так что инициализация Ci выполняется за O(n2). Итого, цикл по i выполняется за O(n2). Всего n/m итераций. n/m<2n/logn, следовательно сложность цикла — O(n3/logn).

Сумма Ci вычисляется за O(n2*n/m)=O(n3/logn).

Итоговая сложность алгоритма — O(n3/logn).

История

Алгоритм был введён В. Л. Арлазаровым, Е. А. Диницем, М. А. Кронродом и И. А. Фараджевым в 1970 году. Происхождение названия неизвестно; Ахо, Хопкрофт и Ульман (1974) объясняют:

Второй метод, часто называемый алгоритмом «четырёх русских», в честь его изобретателей, в какой-то мере «практичнее» алгоритма в теореме 6.9.[2]

Все четыре автора работали в Москве в то время.[3]

Примечания

Шаблон:Примечания

  1. Шаблон:Статья
  2. 2,0 2,1 А. Ахо, Дж. Ульман, Дж. Хопкрофт. Построение и анализ вычислительных алгоритмов. М.: Мир, 1979
  3. Шаблон:Cite web