2009-06-29 37 views
8

Hãy tưởng tượng tôi có một bảng lưu trữ một loạt các vectơ thưa thớt. Một vectơ thưa thớt có nghĩa là nó chỉ lưu trữ các giá trị khác không rõ ràng trong cấu trúc dữ liệu. Tôi có thể có một véc tơ 1 triệu chiều, nhưng tôi chỉ lưu trữ các giá trị cho các kích thước không đồng nhất. Vì vậy, kích thước tỷ lệ thuận với số lượng các mục nhập không đồng bộ, không phải là chiều của vector.Sản phẩm thưa thớt trong SQL

định nghĩa Bảng sẽ là một cái gì đó như thế này: vector_id: int chiều: int giá trị: float

Bây giờ, trong đất lập trình bình thường tôi có thể tính toán các sản phẩm bên trong hoặc chấm sản phẩm của hai vectơ trong thời gian O (| v1 | + | v2 |) thời gian. Về cơ bản, thuật toán là lưu trữ các vectơ thưa thớt được sắp xếp theo thứ nguyên và lặp qua các thứ nguyên trong mỗi cho đến khi bạn tìm thấy xung đột giữa các thứ nguyên và nhân các giá trị của thứ nguyên được chia sẻ và tiếp tục thêm các giá trị đó cho đến khi bạn kết thúc một trong hai vectơ .

Cách nhanh nhất để gỡ bỏ điều này trong SQL là gì?

Trả lời

5

Bạn sẽ có thể tái tạo thuật toán này trong một truy vấn:

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

Vậy làm thế nào phải không index bảng? Bởi (vector_id, kích thước)? –

+0

Việc lập chỉ mục theo (vector_id, thứ nguyên) có ý nghĩa nhất, vì chúng nên xác định một bản ghi duy nhất trong bảng. – dpmattingly

+0

Điều này về cơ bản là những gì tôi nghĩ ra - cho đến khi bất kỳ ai khác đăng nhanh hơn tôi sẽ đưa cho bạn. Cảm ơn! –

Các vấn đề liên quan