Đề bài
Mọi nơ-ron đều bắt đầu bằng cùng một phép tính: nhân từng đầu vào với trọng số của nó rồi cộng tất cả lại. Đó là tích vô hướng của hai vector:
a · b = a₁×b₁ + a₂×b₂ + … + aₙ×bₙ
Hãy cài đặt dot_product(a, b).
Đầu vào
a, b: Hai danh sách số có cùng độ dài.
Đầu ra
Trả về tích vô hướng dưới dạng số thực.
Ràng buộc
1 ≤ độ dài của a = độ dài của b ≤ 1.000
-1.000 ≤ mỗi giá trị ≤ 1.000
Ví dụ
Đầu vào:
a = [1.0, 2.0, 3.0]
b = [4.0, 5.0, 6.0]
Kết quả mong đợi:
expected = 32.0
Đầu vào:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {4.0, 5.0, 6.0};
Kết quả mong đợi:
double expected = 32.0;
Đầu vào:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {4.0, 5.0, 6.0};
Kết quả mong đợi:
double expected = 32.0;
Giải thích
1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32.
Đầu vào:
a = [0.5, -1.5]
b = [2.0, 4.0]
Kết quả mong đợi:
expected = -5.0
Đầu vào:
std::vector<double> a = {0.5, -1.5};
std::vector<double> b = {2.0, 4.0};
Kết quả mong đợi:
double expected = -5.0;
Đầu vào:
double[] a = new double[] {0.5, -1.5};
double[] b = new double[] {2.0, 4.0};
Kết quả mong đợi:
double expected = -5.0;
Giải thích
0.5×2 + (-1.5)×4 = 1 - 6 = -5.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Nhân các vị trí tương ứng của hai danh sách rồi cộng lại thành một tổng duy nhất.
Gợi ý 2
Chỉ cần duyệt một lần vì mỗi cặp đóng góp độc lập vào giá trị cuối.
Gợi ý 3
Đảm bảo hai danh sách cùng độ dài, và dùng kiểu số cho biến tích lũy đủ giữ phần thập phân nếu cần.
Độ phức tạp mong đợi
thời gian O(n), bộ nhớ phụ O(1)
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.