2009-06-29 17 views
8

Bir dizi seyrek vektörleri saklayan bir tablom var. Seyrek vektör, veri yapısında açıkça sadece sıfır olmayan değerleri sakladığı anlamına gelir. 1 milyon boyutlu bir vektöre sahip olabilirdim, ama sadece sıfır olmayan boyutlar için değerleri saklıyorum. Dolayısıyla, boyut sıfır olmayan girdilerin sayısıyla orantılıdır, vektörün boyutsallığı değil. boyut int: değerini int: vector_id:Seyrek nokta çarpımı SQL

Tablo tanım böyle bir şey olurdu (Şimdi

yüzer, normal programlama topraklarda ben O iç ürünü veya iki vektörlerin nokta ürününü hesaplayabilir | v1 | + | v2 |) saati. Temel olarak, algoritma boyutlara göre sınıflandırılmış seyrek vektörleri saklamak ve boyutlar arasında çarpışmalar bulana kadar her bir boyutta yinelemek ve paylaşılan boyutun değerlerini çoğaltmak ve vektörlerden birinin sonuna gelene kadar bunları eklemeye devam etmektir. .

Bunu SQL'de yapmanın en hızlı yolu nedir? Tek bir sorguda bu algoritmayı çoğaltmak mümkün olmalıdır

cevap

5

:

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

Peki indeks tablosu ki? Ile (vector_id, boyut)? –

+0

(Vector_id, boyut) ile dizin oluşturma, en mantıklıdır çünkü bunlar tabloda benzersiz bir kayıt tanımlamalıdır. – dpmattingly

+0

Bu, temel olarak, daha önce bir şeyi daha hızlı yayınlayana kadar size verdiğim şey. Teşekkürler! –