Apa algoritma yang paling praktis efisien untuk mengalikan dua matriks boolean yang sangat jarang (katakanlah, N = 200 dan hanya ada sekitar 100-200 elemen non-nol)?
Sebenarnya, saya memiliki keuntungan bahwa ketika saya mengalikan A dengan B, B sudah ditentukan sebelumnya dan saya dapat melakukan preprocessing kompleks yang sewenang-wenang pada mereka. Saya juga tahu bahwa hasil produk selalu jarang seperti matriks asli.
Algoritma "agak naif" (memindai baris demi baris; untuk setiap 1 bit baris-A, ATAU hasil dengan baris B yang sesuai) ternyata sangat efisien dan hanya membutuhkan beberapa ribu instruksi CPU untuk menghitung satu produk. , jadi tidak akan mudah untuk melampauinya, dan itu hanya bisa dilampaui oleh faktor konstan (karena ada ratusan bit dalam hasilnya). Tapi saya tidak kehilangan harapan dan meminta bantuan komunitas :)
Jawaban:
Saya enggan menjawab ini, karena satu-satunya hasil teoretis yang saya ketahui sepanjang garis ini memiliki nama saya di atas kertas ...
(Catatan: algoritma ini hanya benar-benar berguna untuk kasus di mana satu matriks padat dan yang lainnya jarang. Kasus ini muncul banyak, misalnya, ketika menghitung penutupan transitif dari grafik jarang, matriks penutupan transitif akhirnya akan menjadi padat dibandingkan dengan matriks kedekatan asli.)
Kertas itu
- Pembaruan baris dan kolom ke dapat dihitung dalam waktu .O ( n 1 + ε )A O(n1+ε)
Kami menggunakan struktur data ini untuk memberikan algoritma teoretis yang lebih cepat untuk APSP dalam grafik tidak tertimbang.
sumber
Saya pikir apa yang Anda sebut adalah matriks "hypersparse" (nnz <n). Saya menulis makalah beberapa tahun yang lalu tentang cara melipatgandakan mereka. Pada dasarnya, ini merupakan produk luar yang bergabung dengan penggabungan multi-arah yang pintar untuk menghilangkan realisasi tripel perantara.
Buluc dan Gilbert, IPDPS 2008: http://gauss.cs.ucsb.edu/publication/hypersparse-ipdps08.pdf
sumber