Quels sont les algorithmes les plus efficaces pour multiplier deux matrices booléennes très clairsemées (disons, N = 200 et il n'y a que 100 à 200 éléments non nuls)?
En fait, j'ai l'avantage que lorsque je multiplie A par B, les B sont prédéfinis et que je peux faire un prétraitement arbitrairement complexe sur eux. Je sais aussi que les résultats des produits sont toujours aussi rares que les matrices originales.
L'algorithme "plutôt naïf" (scan A par lignes; pour chaque 1 bit de la ligne A, OU le résultat avec la ligne correspondante de B) s'avère très efficace et ne nécessite que quelques milliers d'instructions CPU pour calculer un seul produit , il ne sera donc pas facile de le dépasser, et il n'est dépassable que par un facteur constant (car il y a des centaines de bits dans le résultat). Mais je ne perds pas espoir et je demande de l'aide à la communauté :)
Réponses:
J'étais réticent à répondre à cette question, car le seul résultat théorique que je connaisse dans ce sens a mon nom sur le papier ...
Théoriquement, il est possible de prétraiter une matrice booléenne dense afin que les multiplications matricielles-vecteurs éparses avec (sur la semi-continuité de OR et AND) puissent être effectuées plus rapidement que le temps d'exécution naïf. Probablement une quantité importante de piratage serait nécessaire pour l'implémenter dans la pratique, mais je pense que cela se passerait bien dans la pratique pour un assez grand et la bonne implémentation.A A nn×n A A n
(Remarque: cet algorithme n'est vraiment utile que dans le cas où une matrice est dense et l'autre est clairsemée. Ce cas apparaît souvent, par exemple, lors du calcul de la fermeture transitive d'un graphe clairsemé, la matrice de fermeture transitive finira par devenir dense par rapport à la matrice d'adjacence d'origine.)
Le papier est
et le résultat pertinent de l'article est que pour chaque , il existe un algorithme de temps qui, étant donné 0-1 matrice , les opérations suivantes sont prise en charge:O ( n 2 + ε ) n × n Aε>0 O(n2+ε) n×n A
- Pour tout vecteur avec seulement zéros, peut être calculé en temps , où , sont des paramètres libres satisfaisant . (Un bon réglage est et , de sorte que le temps d'exécution est d'environ pour toute constante souhaitée .t A v O ( n ( t / k + n / ℓ ) / log n ) ℓ kv t Av O(n(t/k+n/ℓ)/logn) ℓ k (ℓk)≤nε ℓ=logcn k=ε(logn)/loglogn nt/logn+n2/logcn c
- Les mises à jour des lignes et des colonnes vers peuvent être calculées en temps .A O(n1+ε)
Nous avons utilisé cette structure de données pour donner des algorithmes théoriques plus rapides pour APSP dans des graphiques clairsemés non pondérés.
la source
Je pense que ce que vous appelez est une matrice "hypersparse" (nnz <n). J'ai écrit un article il y a quelques années sur la façon de les multiplier. Il s'agit essentiellement d'une fusion de produits externes avec une fusion multidirectionnelle intelligente pour éliminer la réalisation de triplets intermédiaires.
Buluc et Gilbert, IPDPS 2008: http://gauss.cs.ucsb.edu/publication/hypersparse-ipdps08.pdf
la source