2009-06-29 12 views
8

Immaginate di avere una tabella che memorizza una serie di vettori sparsi. Un vettore sparse significa che memorizza solo i valori diversi da zero nella struttura dei dati. Potrei avere un vettore dimensionale da 1 milione, ma memorizzo solo i valori per le dimensioni che non sono zero. Quindi la dimensione è proporzionale al numero di voci diverse da zero, non alla dimensionalità del vettore.Prodotto con punti sparsi in SQL

definizione Tabella sarebbe qualcosa di simile a questo: vector_id: int dimensione: int valore: galleggiare

Ora, nel normale terreno di programmazione posso calcolare il prodotto interno o prodotto scalare di due vettori a O (| v1 | + | v2 |) tempo. Fondamentalmente l'algoritmo è quello di memorizzare i vettori sparse ordinate per dimensione e scorrere le dimensioni in ciascuna finché non si trovano collisioni tra le dimensioni e moltiplicare i valori della dimensione condivisa e continuare ad aggiungerle fino a raggiungere la fine di uno dei vettori .

Qual è il modo più veloce per eseguire questa operazione in SQL?

risposta

5

Si dovrebbe essere in grado di replicare questo algoritmo in una query:

select sum(v1.value * v2.value) 
from vectors v1 
inner join vectors v2 
on v1.dimension = v2.dimension 
where v1.vector_id = ... 
and v2.vector_id = ... 
+0

Così come è possibile indicizzare il tavolo? Di (vector_id, dimensione)? –

+0

L'indicizzazione per (vector_id, dimensione) ha più senso, poiché è necessario definire un record univoco nella tabella. – dpmattingly

+0

Questo è praticamente ciò che mi è venuto in mente - fino a quando qualcun altro posterà qualcosa di più veloce te lo darò io. Grazie! –