¿Imaginas poder ver el ADN compartido entre un coche y una bicicleta a través de sus características? 🧬 Descifremos juntos cómo hacerlo con Python y conjuntos.
🔮 Enunciado del Problema
Tenemos una red neuronal entrenada para el reconocimiento de objetos. Cada vez que esta red identifica un objeto, devuelve un arreglo de enteros. Cada entero representa el ID de una característica específica detectada en el objeto. Por ejemplo, [1, 5, 122]
podría significar “tiene llantas (1)”, “tiene puertas (5)”, y “es rojo (122)”.
El objetivo es determinar las similitudes entre dos objetos diferentes analizados por la red neuronal. Para ello, necesitamos una función que, dados dos arreglos de características (uno para cada objeto), retorne un nuevo arreglo conteniendo únicamente las características compartidas entre ambos.
Parámetros:
article1
:int[n]
- Arreglo de enteros representando las características del objeto 1.article2
:int[m]
- Arreglo de enteros representando las características del objeto 2.
Valor de Retorno:
int[o]
: Arreglo de enteros conteniendo las características en común entrearticle1
yarticle2
. Este arreglo deberá estar ordenado.
Ejemplos:
>>> sorted(get_in_common([2, 5, 9], [2, 7, 1])) == [2]
True
>>> sorted(get_in_common([2, 3, 4, 5], [5, 9, 2])) == [2, 5]
True
>>> sorted(get_in_common([1, 2, 3], [5, 6, 9])) == [] #Modificado para reflejar el comportamiento correcto
True
🧩 Resolución Paso a Paso
Para solucionar este problema, aprovecharemos las bondades de los conjuntos en Python, especialmente su eficiencia para realizar operaciones de intersección.
-
Definición de la función: Comenzamos definiendo la función
get_in_common
, que recibirá como entrada dos arreglos,article1
yarticle2
.def get_in_common(article1, article2):
-
Conversión a conjuntos: El primer paso crucial es convertir ambos arreglos en conjuntos. Esta conversión elimina duplicados dentro de cada lista y, lo más importante, nos permite usar el operador de intersección de conjuntos (
&
), que es altamente eficiente para encontrar elementos comunes.article1 = set(article1)
article2 = set(article2)
-
Cálculo de la intersección: Utilizamos el operador
&
para obtener la intersección de los dos conjuntos. El resultado es un nuevo conjunto que contiene solo los elementos que están presentes en ambos conjuntos originales.return list(article1 & article2)
Finalmente, convertimos el conjunto resultante de vuelta a una lista para cumplir con el formato de retorno especificado.
Solución Completa:
def get_in_common(article1, article2):
"level: easy; points: 3"
article1 = set(article1)
article2 = set(article2)
return list(article1 & article2)
🧠 Conceptos Clave
La clave de la eficiencia de esta solución reside en el uso de conjuntos (sets). A diferencia de las listas, los conjuntos en Python están optimizados para operaciones de búsqueda y pertenencia. La operación de intersección de conjuntos (&
) tiene una complejidad temporal promedio de O(min(len(set1), len(set2))), lo que significa que es mucho más rápida que iterar sobre una lista y verificar la pertenencia en otra (que tendría una complejidad de O(n*m) en el peor de los casos). Además, la conversión de tipos entre listas y conjuntos (y viceversa) permite aprovechar las ventajas de cada estructura de datos en diferentes etapas del proceso. La eliminación de duplicados que realiza el set
también es importante para evitar que un mismo identificador de característica aparezca varias veces en el resultado final.
💫 Reflexiones Finales
Aunque la solución presentada es concisa y eficiente, existen algunas mejoras potenciales. Por ejemplo, podríamos añadir validaciones de entrada para asegurarnos de que article1
y article2
sean realmente listas de enteros. Además, si el orden de las características en común fuese relevante, podríamos modificar la función para mantener ese orden (quizás usando un diccionario para rastrear la posición original de cada característica). ¿Sabías que la implementación de conjuntos en CPython utiliza tablas hash, lo que explica su excelente rendimiento en operaciones de búsqueda y pertenencia? 🤯
Espero que este análisis te haya resultado útil e interesante. Si quieres seguir explorando el fascinante mundo de las estructuras de datos y algoritmos en Python, ¡no dudes en suscribirte y explorar más artículos! ¡Feliz codificación! ✨