Kebutuhan memori untuk perkalian matriks cepat

12

Misalkan kita ingin mengalikan matriks. Algoritma multiplikasi matriks lambat berjalan dalam waktu O ( n 3 ) dan menggunakan memori O ( n 2 ) . Perkalian matriks tercepat berjalan dalam waktu n ω + o ( 1 ) , di mana ω adalah konstanta aljabar linier, tetapi apa yang diketahui tentang kompleksitas memorinya?n×nO(n3)O(n2)nω+o(1)ω

Tampaknya mungkin apriori bahwa perkalian matriks cepat mengkonsumsi memori . Apakah ada jaminan bahwa hal itu dapat dilakukan dalam memori O ( n 2 ) ? Apakah itu kasus bahwa algoritma penggandaan matriks yang dikenal saat ini menggunakan memori O ( n 2 ) ?nωO(n2)O(n2)

(Saya sebenarnya tertarik pada multiplikasi matriks persegi panjang, tapi saya berasumsi bahwa jawabannya akan sama dalam kasus itu untuk kasus persegi, dan kasus persegi lebih baik dipelajari.)

David Harris
sumber

Jawaban:

16

Penggunaan ruang paling banyak untuk semua algoritma Strassen-like (yaitu yang didasarkan pada batas atas peringkat perkalian matriks secara aljabar). Lihat Kompleksitas ruang dari algoritma Coppersmith – WinogradO(n2)

Namun, saya menyadari dalam jawaban saya sebelumnya bahwa saya tidak menjelaskan mengapa penggunaan ruang adalah ... jadi begini sesuatu yang bergelombang. Pertimbangkan apa yang dilakukan algoritma seperti Strassen. Dimulai dari algoritma tetap untuk K × K perkalian matriks yang menggunakan K c perkalian untuk beberapa konstanta c < 3 . Secara khusus, algoritma ini (apa pun itu) dapat ditulis WLOG sehingga:O(n2)K×KKcc<3

  1. Ini menghitung matriks yang berbeda L 1 , ... , L K c yang entri multiply dari matriks pertama A oleh berbagai skalar dan K c matriks R 1 , ... , R K c dari matriks kedua B dari bentuk serupa,KcL1,,LKcAKcR1,,RKcB

  2. Ini melipatgandakan kombinasi linear , laluLiRi

  3. Ini mengalikan entri dari oleh berbagai skalar, kemudian menambahkan semua matriks ini sampai entrywise untuk mendapatkan A B .LiRiAB

(Ini adalah yang disebut "bilinear" algoritma, tapi ternyata bahwa setiap "aljabar" algoritma perkalian matriks dapat ditulis dengan cara ini.) Untuk setiap , algoritma ini hanya memiliki untuk menyimpan produk saat ini L iR i dan nilai saat ini dari A B (awalnya diatur ke semua-nol) dalam memori pada titik tertentu, sehingga penggunaan ruang adalah O ( K 2 ) .i=1,,KcLiRiABO(K2)

Mengingat algoritma yang terbatas ini, kemudian diperluas ke sewenang-wenang matriks, dengan melanggar matriks besar menjadi K × K blok dari dimensi K - 1 × K - 1 , menerapkan terbatas K × K algoritma untuk blok matriks, dan memanggil algoritma secara rekursif setiap kali perlu mengalikan dua blok. Pada setiap tingkat rekursi, kita hanya perlu menyimpan elemen bidang O ( K 2 ) dalam memori (menyimpan O ( 1 )K×KK×KK1×K1K×KO(K2)O(1)berbeda matriks). Dengan asumsi penggunaan ruang untuk K - 1 × K - 1 perkalian matriks adalah S ( - 1 ) , penggunaan ruang dari algoritma rekursif ini adalah S ( ) S ( - 1 ) + O ( K 2 ) , yang untuk S ( 1 ) = 2 K 2K×KK1×K1S(1)S()S(1)+O(K2)S(1)=2K2memecahkan ke .S()O(K2)

Ryan Williams
sumber
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)
4

pO(n2/p)

Alexander Tiskin
sumber