Prodotto a matrice booleana sparsa veloce con possibile preelaborazione


12

Quali sono gli algoritmi più efficienti per moltiplicare due matrici booleane molto sparse (diciamo, N = 200 e ci sono solo circa 100-200 elementi diversi da zero)?

In realtà, ho il vantaggio che quando sto moltiplicando A per B, le B sono predefinite e posso eseguire una pre-elaborazione arbitrariamente complessa su di esse. So anche che i risultati dei prodotti sono sempre scarsi come le matrici originali.

L'algoritmo "piuttosto ingenuo" (scansiona A per righe; per ogni 1 bit della riga A, O il risultato con la corrispondente riga di B) risulta molto efficiente e richiede solo un paio di migliaia di istruzioni CPU per calcolare un singolo prodotto , quindi non sarà facile superarlo, ed è superabile solo con un fattore costante (perché ci sono centinaia di bit nel risultato). Ma non sto perdendo la speranza e chiedendo aiuto alla community :)


1
Dubito che possiamo battere in modo significativo una costante di 10 istruzioni macchina per parola di output. È possibile che una forma implicita dell'output sia accettabile?
Warren Schudy,

Sì, purché possa essere ulteriormente moltiplicato per Bs.
jkff,

Quali sono le operazioni di addizione e moltiplicazione (per bit) su cui viene definita la moltiplicazione matriciale? Il tuo ingenuo algoritmo suggerisce che la risposta è "o" e "e" rispettivamente, ma questa è una strana moltiplicazione della matrice poiché quelli non definiscono un campo. Intendi "xor" invece di "o"?
Warren Schudy,

No, intendo "o" e "e". Non ho bisogno delle operazioni per definire un campo, in realtà è un problema simile alla raggiungibilità del grafico (sto calcolando la composizione di diverse funzioni da una a molte).
jkff,

Risposte:


11

Ero riluttante a rispondere a questo, perché l'unico risultato teorico che conosco in questo senso ha il mio nome sulla carta ...

Teoricamente, è possibile preelaborare una matrice booleana densa A in modo che le moltiplicazioni sparse del vettore matrice con A (oltre il semina di OR ed AND) possano essere eseguite più velocemente del tempo di esecuzione ingenuo. Probabilmente sarebbe necessaria una quantità significativa di hacking per implementarlo nella pratica, ma penso che andrebbe bene in pratica per abbastanza n e la giusta implementazione.n×nAAn

(Nota: questo algoritmo è davvero utile solo nel caso in cui una matrice sia densa e l'altra sia scarsa. Questo caso si presenta molto anche se, ad esempio, quando si calcola la chiusura transitiva di un grafico rado, la matrice di chiusura transitiva alla fine diventerà densa rispetto alla matrice di adiacenza originale.)

Il documento è

Guy E. Blelloch, Virginia Vassilevska, Ryan Williams: un nuovo approccio combinatorio per problemi di grafici sparsi. ICALP (1) 2008: 108-120

e il risultato rilevante dal documento è che per ogni , esiste un algoritmo temporale O ( n 2 + ε ) che, dato qualsiasi matrice n × n 0-1 A , sono supportate le seguenti operazioni:ε>0O(n2+ε)n×nA

vtAvO(n(t/k+n/)/logn)k(k)nε=logcnk=ε(logn)/loglognnt/logn+n2/logcnc

AO(n1+ε)

Abbiamo usato questa struttura di dati per fornire algoritmi teorici più veloci per APSP in grafici sparsi non ponderati.


3
Ho appena notato che anche tu supponi che anche l' output della moltiplicazione della matrice sia scarso. In tal caso, esistono algoritmi ancora più veloci; eseguire una ricerca Web per "moltiplicazione della matrice sensibile all'output".
Ryan Williams,

{1,0,1}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.