Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм четырёх русских — Википедия

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

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

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

ИдеяПравить

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

ПрименениеПравить

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

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

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

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

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

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

Пусть m = log n  .

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

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

ПсевдокодПравить

begin

  for i 1   to n / m   do

  begin

    comment Вычисляем суммы строк b 1 ( i ) , . . . , b m ( i )   матрицы B i  ;

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

    for j 1   to 2 m 1   do

    begin

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

      СУММАСТРОК[ j  ]  СУММАСТРОК[ j 2 k  ] + b k + 1 ( i )  

    end

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

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

  end;

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

end.[2]

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

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

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

Время работыПравить

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

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

Сумма C i   вычисляется за O ( n 2 n / m ) = O ( n 3 / log n )  .

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

ИсторияПравить

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

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

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

ПримечанияПравить

  1. Huacheng Yu. An Improved Combinatorial Algorithm for Boolean Matrix Multiplication // arXiv:1505.06811 [cs]. — 2015-05-26. Архивировано 20 мая 2022 года.
  2. 1 2 А. Ахо, Дж. Ульман, Дж. Хопкрофт. Построение и анализ вычислительных алгоритмов. М.: Мир, 1979
  3. V. L. Arlazarov, Y. A. Dinitz, M. A. Kronrod, I. A. Faradzhev, “On economical construction of the transitive closure of an oriented graph”, Dokl. Akad. Nauk SSSR, 194:3 (1970), 487–488  (неопр.). www.mathnet.ru. Дата обращения: 18 апреля 2020. Архивировано 1 октября 2018 года.