Problema
La similitud coseno compara la dirección de dos vectores e ignora su longitud. La búsqueda semántica la usa para encontrar textos con embeddings parecidos:
cos(a, b) = (a · b) / (|a| × |b|), donde |a| = √(a₁² + a₂² + … + aₙ²)
El resultado es 1 para la misma dirección, 0 para vectores perpendiculares y -1 para direcciones opuestas. Si alguno de los vectores es todo ceros, devuelve 0.
Implementa cosine_similarity(a, b).
Entrada
a, b: Dos listas de números con la misma longitud.
Salida
Devuelve la similitud coseno como número decimal.
Restricciones
1 ≤ longitud ≤ 1000
-1000 ≤ cada valor ≤ 1000
Ejemplos
Entrada:
a = [1.0, 0.0]
b = [0.0, 1.0]
Salida esperada:
expected = 0.0
Entrada:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Salida esperada:
double expected = 0.0;
Entrada:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Salida esperada:
double expected = 0.0;
Explicación
El producto escalar es 0, así que los vectores son perpendiculares y la similitud es 0.
Entrada:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Salida esperada:
expected = 1.0
Entrada:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Salida esperada:
double expected = 1.0;
Entrada:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Salida esperada:
double expected = 1.0;
Explicación
b es a por 2: misma dirección, así que la similitud es 1 aunque las longitudes sean distintas.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.