Đề bài
Độ tương đồng cosine so sánh hướng của hai vector và bỏ qua độ dài của chúng. Tìm kiếm ngữ nghĩa dùng nó để tìm các văn bản có embedding giống nhau:
cos(a, b) = (a · b) / (|a| × |b|), với |a| = √(a₁² + a₂² + … + aₙ²)
Kết quả bằng 1 khi cùng hướng, 0 khi vuông góc và -1 khi ngược hướng. Nếu một trong hai vector toàn số 0, trả về 0.
Hãy cài đặt cosine_similarity(a, b).
Đầu vào
a, b: Hai danh sách số có cùng độ dài.
Đầu ra
Trả về độ tương đồng cosine dưới dạng số thực.
Ràng buộc
1 ≤ độ dài ≤ 1.000
-1.000 ≤ mỗi giá trị ≤ 1.000
Ví dụ
Đầu vào:
a = [1.0, 0.0]
b = [0.0, 1.0]
Kết quả mong đợi:
expected = 0.0
Đầu vào:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Kết quả mong đợi:
double expected = 0.0;
Đầu vào:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Kết quả mong đợi:
double expected = 0.0;
Giải thích
Tích vô hướng bằng 0, nên hai vector vuông góc và độ tương đồng bằng 0.
Đầu vào:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Kết quả mong đợi:
expected = 1.0
Đầu vào:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Kết quả mong đợi:
double expected = 1.0;
Đầu vào:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Kết quả mong đợi:
double expected = 1.0;
Giải thích
b bằng a nhân 2: cùng hướng, nên độ tương đồng bằng 1 dù độ dài khác nhau.
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.