Вимога пам'яті для швидкого множення матриці


12

Припустимо, ми хочемо помножити матриць. Алгоритм множення повільної матриці працює в часі O ( n 3 ) і використовує O ( n 2 ) пам'ять. Найшвидше матричне множення працює за часом n ω + o ( 1 ) , де ω - лінійна константа алгебри, але що відомо про її складність пам'яті?n×nO(n3)O(n2)nω+o(1)ω

Здається, що апріорі можливо, що швидке множення матриць споживає пам'яті. Чи є гарантія, що це можна зробити в пам'яті O ( n 2 ) ? Чи буває так, що відомі в даний час алгоритми множення матриць використовують пам'ять O ( n 2 ) ?nωO(n2)O(n2)

(Мене фактично цікавить множення прямокутної матриці, але я припускаю, що відповідь була б такою ж, як і для квадратного випадку, і квадратний випадок краще вивчений.)

Відповіді:


16

Використання простору становить щонайбільше для всіх алгоритмів, подібних Страссену (тобто таких, що ґрунтуються на верхньому обмеженні рангу множення матриці алгебраїчно). Див. Просторову складність алгоритму Копперсміта — ВиноградаO(n2)

Однак у своїй попередній відповіді я зрозумів, що не пояснював, чому використання простору дорівнює ... тому тут іде щось ручно-хвилясте. Поміркуйте, що робить алгоритм, схожий на Страссена. Він починається з фіксованого алгоритму множення матриць на K × K, який використовує множення K c для деякої постійної c < 3 . Зокрема, цей алгоритм (який би він не був) може бути записаний WLOG так, що:O(n2)K×KKcc<3

  1. Він обчислює різних матриць L 1 , , L K c, які множать записи першої матриці A на різні скалярні та K c матриці R 1 , , R K c з другої матриці B аналогічної форми,KcL1,,LKcAKcR1,,RKcB

  2. Він примножує ті лінійні комбінації , потімLiRi

  3. Примножує елементи матриці різними скалярів, а потім додає всі ці матриці вгору entrywise отримати A B .LiRiAB

(Це так званий "білінеарний" алгоритм, але виявляється, що кожен алгоритм множення "алгебраїчної" матриці можна записати таким чином. Для кожного , цей алгоритм повинен зберігати лише поточний добуток L iR i та поточне значення A B (спочатку встановлене на всі нулі) в пам'яті в будь-якій заданій точці, тому використання місця становить O ( K 2 ) .i=1,,KcLiRiABO(K2)

Враховуючи цей кінцевий алгоритм, він розширюється на довільні матриці , розбиваючи великі матриці на блоки K × K розмірами K - 1 × K - 1 , застосовуючи кінцевий алгоритм K × K до блоку матриць і рекурсивно викликати алгоритм, коли потрібно множити два блоки. На кожному рівні рекурсії нам потрібно зберігати в пам'яті лише елементи O ( K 2 ) (зберігання O ( 1 )K×KK×KK1×K1K×KO(K2)O(1)різні матриці ). Якщо припустити використання простору для матричного множення K - 1 × K - 1 є S ( - 1 ) , використання простору цього рекурсивного алгоритму становить S ( ) S ( - 1 ) + O ( K 2 ) , що для S ( 1 ) = 2 K 2K×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2вирішує на .S()O(K2)


nωωnωω(n2)

1
O(nω+δ)O(n2)δ>0

f(i)n2i=0,...,knω+o(1)n2+o(1)

kfkf1fkkn2+o(1)

nkknf(k(n))=no(1)k(n)nnω+o(1)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.