Jakie są najbardziej efektywne algorytmy mnożenia dwóch bardzo rzadkich macierzy boolowskich (powiedzmy, N = 200, a jest tylko około 100-200 niezerowych elementów)?
W rzeczywistości mam tę zaletę, że kiedy mnożę A przez B, B są predefiniowane i mogę na nich dowolnie skomplikowane przetwarzanie wstępne. Wiem też, że wyniki produktów są zawsze tak rzadkie jak oryginalne matryce.
Algorytm „raczej naiwny” (skanowanie A po wierszach; dla każdego 1 bitu rzędu A LUB wynik z odpowiednim rzędem B) okazuje się bardzo wydajny i wymaga tylko kilku tysięcy instrukcji CPU do obliczenia pojedynczego produktu , więc nie będzie łatwo go przekroczyć, a da się go pokonać tylko przez stały współczynnik (ponieważ w wyniku są setki jednych bitów). Ale nie tracę nadziei i proszę społeczność o pomoc :)
Odpowiedzi:
Nie chciałem na to odpowiadać, ponieważ mój jedyny wynik teoretyczny, jaki znam, jest na papierze ...
(Uwaga: ten algorytm jest naprawdę użyteczny tylko w przypadku, gdy jedna matryca jest gęsta, a druga jest rzadka. Ten przypadek pojawia się często, np. Podczas obliczania przejściowego zamknięcia rzadkiego wykresu macierz przechodniego przechodzenia w końcu będzie gęsta w porównaniu do oryginalnej macierzy przylegania).
Papier jest
Wykorzystaliśmy tę strukturę danych, aby uzyskać szybsze algorytmy teoretyczne dla APSP w rzadkich nieważonych grafach.
źródło
Myślę, że to, co nazywacie, to macierz „hipersparse” (nnz <n). Kilka lat temu napisałem artykuł na temat ich pomnożenia. Zasadniczo jest to połączenie produktu zewnętrznego ze sprytnym połączeniem na wiele sposobów, aby wyeliminować realizację potrójnych pośrednich.
Buluc and Gilbert, IPDPS 2008: http://gauss.cs.ucsb.edu/publication/hypersparse-ipdps08.pdf
źródło