- Los pequeños problemas de implementación en entrevistas técnicas pueden ser más efectivos que los acertijos, y calcular la mediana deja ver tanto habilidades básicas de programación como criterio de diseño
- Como es un problema que requiere ordenamiento, lleva naturalmente a discutir la API: si la función debe ordenar por sí misma, si quien la llama debe pasar los datos ordenados y si se puede modificar el arreglo original
- La bifurcación entre longitudes pares e impares, el cálculo de índices y los errores de off-by-one son buenos para observar el proceso de depuración del candidato
- En un problema corto también se puede verificar la diferencia entre mediana y promedio, la facilidad para escribir pruebas e incluso el conocimiento de la biblioteca estándar statistics de Python
- La implementación de ejemplo lanza
ValueErrorcon una lista vacía, ordena una copia consorted()y luego devuelve el promedio de los dos valores centrales si la longitud es par, o el valor central si es impar
Por qué el problema de la mediana es adecuado para una entrevista
- Una buena pregunta de entrevista técnica no debe ser un problema rebuscado tipo acertijo, sino permitir sacar temas más profundos a partir de una implementación intuitiva
- La pregunta “escribe una función que reciba un arreglo de números y devuelva la mediana” sirve bien como una señal tipo Fizz Buzz para comprobar si el candidato realmente sabe programar
- Reducir los valores de un arreglo a un solo resultado es una habilidad básica, y además el problema es lo bastante pequeño como para ver fácilmente la conversación y la depuración
Puntos de decisión que aparecen durante la implementación
- Para calcular la mediana, primero hace falta ordenar
- Hay que decidir si la función ordena por sí misma o si quien la llama debe pasar un arreglo ya ordenado
- Cuando el arreglo se pasa por referencia, también entra en el contrato de la API si se permite modificar el original
- Estas decisiones también conectan con discusiones de rendimiento
- El cálculo de índices tiene trampas de off-by-one
- Más que el error en sí, se puede observar cómo depura un problema pequeño
- La forma de devolver el resultado cambia según la longitud del arreglo
- Si la longitud es par, devuelve el promedio de los dos valores centrales
- Si la longitud es impar, devuelve el valor central
Una conversación que se amplía a partir de un problema corto
- La mediana puede llevar a una discusión estadística, por ejemplo sobre por qué en muchos casos puede ser una mejor opción que el promedio
- Como las entradas y los valores esperados son simples, es fácil de probar y permite que el candidato muestre criterio para escribir tests
- En Python, también es una oportunidad para mostrar conocimiento de la biblioteca estándar
statistics
Decisiones en la implementación de ejemplo en Python
- Una lista vacía provoca
ValueError("median called with empty list") - Se usa
sorted(numbers)para no ordenar directamente la lista de entrada, a diferencia denumbers.sort() - La longitud se obtiene con
len(numbers)y el índice central se calcula comomid = length // 2 - Si la longitud es par, devuelve
(numbers[mid - 1] + numbers[mid]) / 2.0; si es impar, devuelvenumbers[mid]
1 comentarios
Opiniones en Lobste.rs
No se entiende muy bien este artículo. Parece que el autor no sabe que la mediana puede calcularse en O(n). Referencia: https://rcoh.me/posts/linear-time-median-finding/
Así que eso de que “los números tienen que estar ordenados desde el principio” es incorrecto. Por eso tampoco me parece una buena pregunta de entrevista. La solución óptima usa un algoritmo complejo; salvo que alguien se lo sepa de memoria, es difícil esperar que lo saque en el momento, y saberlo de memoria tampoco ayuda mucho para evaluar al candidato.
En todo caso, podrías pedirle al candidato que proponga una solución ingenua: ordenar el arreglo con una función de biblioteca y devolver el valor del medio
n*log(n)y me filtraron en una entrevista telefónica por esoDespués aprendí quickselect en una clase de algoritmos, y pensé: “No pueden haber esperado en serio que se me ocurriera eso en el momento”. Bueno, quizá simplemente no encajaba con ese puesto
Sobre eso de esperar “la solución ingenua de ordenar el arreglo con una función de biblioteca y devolver el valor del medio”, no esperaría que el candidato escriba algo mejor que la biblioteca estándar de Python
Como bono, te permite ver de inmediato si alguien ha estudiado algoritmos o al menos si se preparó para entrevistas. Va a proponer usar quickselect: https://en.wikipedia.org/wiki/Quickselect
Y si tuviera que escribir quickselect desde cero, también podría hacerlo. Básicamente se parece a partición + búsqueda binaria
El tipo
intde Python no tiene overflow, pero si usas C, C++ o Go, ¿no habría que preocuparse también por el overflow en la suma en la rama del arreglo de longitud par?float, no enint. Aun así, podría desbordarse ainf. Si los dos elementos del arreglo sonsys.float_info.max, la respuesta también debería sersys.float_info.max, pero el resultado de la suma seríainf, y al dividirlo entre 2 seguiría siendoinfPodrías intentar arreglarlo distribuyendo la división entre 2 sobre la suma, pero entonces daría una respuesta incorrecta con números subnormales. La mayoría simplemente asume que en sus programas no van a aparecer números tan grandes como para causar este problema. Incluso numpy aquí devuelve
infcon una advertencia:En la práctica, también hay varias formas de elegir la mediana en sí. Puedes optar por interpolación lineal, por el límite superior o por el límite inferior
Y si te pasas a los cuantiles, podrías hablar durante horas. Elegir uno solo y elegir varios a la vez requiere enfoques distintos
Yo no uso preguntas de entrevista como la del artículo original. Yo exijo suavidad, es decir, que la dificultad del problema tenga que variar de forma fluida según la habilidad y la experiencia del candidato. En especial, si saber que existen funciones de biblioteca o algoritmos como quickselect o radix sort cambia el resultado de forma brusca, entonces no es una buena pregunta para medir nada
Terminas no midiendo la experiencia y capacidad del candidato, sino si conoce cierto artefacto mágico específico. Se puede compensar con preguntas de seguimiento, pero es mejor plantear desde el inicio un problema más suave