Використання простору становить щонайбільше для всіх алгоритмів, подібних Страссену (тобто таких, що ґрунтуються на верхньому обмеженні рангу множення матриці алгебраїчно). Див. Просторову складність алгоритму Копперсміта — ВиноградаО ( н.)2)
Однак у своїй попередній відповіді я зрозумів, що не пояснював, чому використання простору дорівнює ... тому тут іде щось ручно-хвилясте. Поміркуйте, що робить алгоритм, схожий на Страссена. Він починається з фіксованого алгоритму множення матриць на K × K, який використовує множення K c для деякої постійної c < 3 . Зокрема, цей алгоритм (який би він не був) може бути записаний WLOG так, що:О ( н.)2)К× KКcc<3
Він обчислює різних матриць L 1 , … , L K c, які множать записи першої матриці A на різні скалярні та K c матриці R 1 , … , R K c з другої матриці B аналогічної форми,KcL1,…,LKcAKcR1,…,RKcB
Він примножує ті лінійні комбінації , потімLi⋅Ri
Примножує елементи матриці різними скалярів, а потім додає всі ці матриці вгору entrywise отримати A ⋅ B .Li⋅RiA⋅B
(Це так званий "білінеарний" алгоритм, але виявляється, що кожен алгоритм множення "алгебраїчної" матриці можна записати таким чином. Для кожного , цей алгоритм повинен зберігати лише поточний добуток L i ⋅ R i та поточне значення A ⋅ B (спочатку встановлене на всі нулі) в пам'яті в будь-якій заданій точці, тому використання місця становить O ( K 2 ) .i=1,…,KcLi⋅RiA⋅BO(K2)
Враховуючи цей кінцевий алгоритм, він розширюється на довільні матриці , розбиваючи великі матриці на блоки K × K розмірами K ℓ - 1 × K ℓ - 1 , застосовуючи кінцевий алгоритм K × K до блоку матриць і рекурсивно викликати алгоритм, коли потрібно множити два блоки. На кожному рівні рекурсії нам потрібно зберігати в пам'яті лише елементи O ( K 2 ℓ ) (зберігання O ( 1 )Kℓ×KℓK×KKℓ−1×Kℓ−1K×KO(K2ℓ)O(1)різні матриці ). Якщо припустити використання простору для матричного множення K ℓ - 1 × K ℓ - 1 є S ( ℓ - 1 ) , використання простору цього рекурсивного алгоритму становить S ( ℓ ) ≤ S ( ℓ - 1 ) + O ( K 2 ℓ ) , що для S ( 1 ) = 2 K 2Kℓ×KℓKℓ−1×Kℓ−1S(ℓ−1)S(ℓ)≤S(ℓ−1)+O(K2ℓ)S(1)=2K2вирішує на .S(ℓ)≤O(K2ℓ)