Метод четырёх русских для умножения матриц — различия между версиями
| Строка 35: | Строка 35: | ||
Приведем анализ выбора числа <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>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 \ln 4 + \ln k= 3 \ln n - \ln k</tex> | ||
| + | |||
| + | <tex>k = \frac{3 \ln n - 2 \ln k}{\ln 4} </tex> | ||
| + | |||
| + | <tex> k = 3 \log_4 n - 2 \log_4 k </tex> | ||
| + | |||
| + | В силу того, что <tex> \log_4 k </tex> пренебрежительно мал по сравнению с <tex> k </tex> имеем, что <tex> k </tex> с точностью до константы равен <tex> \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> | Таким образом, при подстановке <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> | ||
Версия 04:17, 16 декабря 2011
Содержание
Постановка задачи
Рассмотрим следующую задачу: «Дано две квадратных матрицы и , состоящие из нулей и единиц. Нужно найти их произведение. При этом, все операции выполняются по модулю .»
Простое решение
Если мы будем считать произведение матриц по определению(), то трудоёмкость алгоритма составит — каждый из элементов результирующей матрицы вычисляется за время, пропорциональное .
Сейчас будет показано, как немного уменьшить это время.
Предподсчёт
Воспользуемся следующим приёмом. Возьмём некоторое целое число . Для всех возможных пар двоичных векторов длины подсчитаем и запомним их скалярное произведение по модулю .
Сжатие матриц
Воспользуемся полученным в предыдущем пункте результатом.
Возьмём первую матрицу. разделим каждую её строку на куски размера . Для каждого куска определим номер двоичного вектора, который соответствует числам, находящимся на этом куске. Если кусок получился неравным по длине (последний кусок строки), то будем считать, что в конце в нём идут не влияющие на умножение нули. Получим матрицу .
Аналогично поступим с матрицей , вместо строк деля столбцы. Получим матрицу .
Теперь, если вместо произведения матриц и считать произведение новых матриц и , воспользовавшись посчитанными скалярными произведениями, то каждый элемент матрицы будет получаться уже за время, пропорциональное вместо , и время произведения матриц сократится с до .
Оценка трудоёмкости и выбор k
Оценим трудоёмкость данного алгоритма.
- Предподсчёт скалярных произведений работает за .
- Создание матриц и —
- Перемножение полученных матриц —
Итого: . Приведем анализ выбора числа для получения оптимальной сложности алгоритма.
В силу возрастания функции и убывания функции имеем, что сложность будет оптимальна при таком значении , что . Прологарифмируем обе части этого равенства:
В силу того, что пренебрежительно мал по сравнению с имеем, что с точностью до константы равен
Таким образом, при подстановке , получаем итоговую трудоёмкость