Метод четырёх русских для умножения матриц — различия между версиями
| Строка 34: | Строка 34: | ||
Итого: <tex>O(2^{2k}k) + O(\frac{n^3}{k})</tex>. | Итого: <tex>O(2^{2k}k) + O(\frac{n^3}{k})</tex>. | ||
Приведем анализ выбора числа <tex>k</tex> для получения оптимальной сложности алгоритма. | Приведем анализ выбора числа <tex>k</tex> для получения оптимальной сложности алгоритма. | ||
| + | |||
| + | В силу возрастания функции <tex>f(k) = 2^{2k}k</tex> и убывания функции <tex>g(k) = \frac{n^3}{k}</tex> имеем, что сложность будет оптимальна при таком значении <tex>k</tex>, что <tex>f(k) = g(k)</tex>. | ||
Таким образом, при подстановке <tex>k = \log n</tex>, получаем итоговую трудоёмкость <tex dpi=140>O(n^2 \log n) + O(\frac{n^3}{\log n}) = O(\frac{n^3}{\log n})</tex> | Таким образом, при подстановке <tex>k = \log n</tex>, получаем итоговую трудоёмкость <tex dpi=140>O(n^2 \log n) + O(\frac{n^3}{\log n}) = O(\frac{n^3}{\log n})</tex> | ||
Версия 03:44, 16 декабря 2011
Содержание
Постановка задачи
Рассмотрим следующую задачу: «Дано две квадратных матрицы и , состоящие из нулей и единиц. Нужно найти их произведение. При этом, все операции выполняются по модулю .»
Простое решение
Если мы будем считать произведение матриц по определению(), то трудоёмкость алгоритма составит — каждый из элементов результирующей матрицы вычисляется за время, пропорциональное .
Сейчас будет показано, как немного уменьшить это время.
Предподсчёт
Воспользуемся следующим приёмом. Возьмём некоторое целое число . Для всех возможных пар двоичных векторов длины подсчитаем и запомним их скалярное произведение по модулю .
Сжатие матриц
Воспользуемся полученным в предыдущем пункте результатом.
Возьмём первую матрицу. разделим каждую её строку на куски размера . Для каждого куска определим номер двоичного вектора, который соответствует числам, находящимся на этом куске. Если кусок получился неравным по длине (последний кусок строки), то будем считать, что в конце в нём идут не влияющие на умножение нули. Получим матрицу .
Аналогично поступим с матрицей , вместо строк деля столбцы. Получим матрицу .
Теперь, если вместо произведения матриц и считать произведение новых матриц и , воспользовавшись посчитанными скалярными произведениями, то каждый элемент матрицы будет получаться уже за время, пропорциональное вместо , и время произведения матриц сократится с до .
Оценка трудоёмкости и выбор k
Оценим трудоёмкость данного алгоритма.
- Предподсчёт скалярных произведений работает за .
- Создание матриц и —
- Перемножение полученных матриц —
Итого: . Приведем анализ выбора числа для получения оптимальной сложности алгоритма.
В силу возрастания функции и убывания функции имеем, что сложность будет оптимальна при таком значении , что .
Таким образом, при подстановке , получаем итоговую трудоёмкость