Pregunta de entrevista que clasifica FizzBuzz (1), implementando malloc (10) [cerrado]

10

Me gustaría tener su opinión sobre la dificultad de la siguiente pregunta de la entrevista:

Encuentre el subconjunto contiguo con suma máxima en una matriz de enteros en tiempo O (n).

Este problema de sonido trivial se hizo famoso por Jon Bentley en sus Perlas de programación, donde lo usa para demostrar las técnicas de diseño de algoritmos.

En una escala de 1-10, siendo 1 la prueba FizzBuzz (o HoppityHop ) y 10 implementando la función C stdlib malloc (), ¿cómo calificaría el problema anterior?

Creo que las personas que mejor pueden responder a esta pregunta son las que han leído Programming Pearls y han tratado de resolver este problema por su cuenta. Para motivar a aquellos que no lo han hecho, 'Programming Pearls' aparece muchas veces en la lista de 'Los 10 mejores libros de programación'.

Un par de comentarios pueden ayudar a obtener una mejor calificación:

  • Implementar malloc () no es tan formidable como parece. Consulte el lenguaje de programación C de K&R, por ejemplo. A veces se le pregunta en Microsoft .

  • Observación de CLRS sobre resolución de problemas: a menudo es más difícil resolver un problema desde cero que verificar una solución claramente presentada, especialmente cuando se trabaja con limitaciones de tiempo .

blrs
fuente
12
¿La dificultad aquí es que los enteros pueden ser negativos? (de lo contrario, toda la matriz es siempre el subconjunto más grande, por lo tanto, O (1) :-P)
Macke
44
El problema debería decir "Encuentra el subconjunto contiguo ..."
v64
66
No haría "en O (n)" un requisito en una entrevista. Puede comenzar con una solución ingenua y luego refinarla si lo desea, pero no esperaría que alguien pueda derivar una solución O (n) en una entrevista de 1 hora sin exposición previa a este algoritmo.
Dean Harding
2
Correcto. Este es un problema fácil si permite soluciones O (n²).
dan04
@Dean, espero que puedan mover una suma de tipo de promedio de la ubicación j a j + 1 en O (1). Tal vez para ser justos, eso se puede proporcionar como una pista. (Supongo que la longitud del subconjunto se ha especificado previamente)
Omega Centauri

Respuestas:

17

Eso realmente depende del desarrollador.

Si malloc tuviera 10, entonces calificaría este problema como 20. Pero, nuevamente, he hecho malloc antes y probablemente podría hacerlo nuevamente.

Alguien que haya solucionado este problema o conozca el algoritmo apropiado de la parte superior de su cabeza lo convertirá en 5 y malloc () en 10.

El problema con este tipo de preguntas es que si las ha hecho antes son fáciles y esto es realmente una prueba de si ha visto este algoritmo anteriormente. Por lo tanto, no me gustan para las entrevistas.

Ahora, para las pruebas en las que le das al desarrollador un par de días, es una prueba perfectamente buena porque si no conocen el algoritmo, entonces les das la oportunidad de investigar y ponerse al día y es una prueba no solo su conocimiento pero su habilidad para obtener nuevos conocimientos.

Martin York
fuente
clima -> ya sea en el cuarto párrafo (y perdón por el ruido, no tengo el representante para hacer ediciones tipográficas ...)
Matthieu M.
Martin, creo que depende del tipo de aplicación para la que estás entrevistando a las personas. Para los tipos de sistemas malloc es bastante simple. Para mí, estoy atascado, [supongo que la dirección de la pila y la longitud, etc., se me han ocultado deliberadamente] con malloc, pero el problema del subconjunto es casi trivial. La clave es hacer coincidir las preguntas con las necesidades del trabajo.
Omega Centauri
8

Supongo que la calificación debería ser bidimensional, al menos. FizzBuzz- mallocdescribe el rango en un eje, yo lo llamaría "complejidad tecnológica". Pero esta dimensión única ciertamente no es suficiente para describir el problema. Para resolver el problema en cuestión, el desarrollador debe pensar más que el código , mientras que la implementación mallocrequiere más disciplina de codificación que la creación de algoritmos complejos.

Así que así es como arreglaría estos problemas:

ingrese la descripción de la imagen aquí

Para ilustrar mi punto, agregué un orden de fusión paralela a la trama, ya que, supongo, es un buen ejemplo de tarea sofisticada tanto tecnológica como algorítmicamente.

P Shved
fuente
2

Creo que es considerablemente más difícil que FizzBuzz o HoppityHop: esos dos no son más que un simple caso de cambio o un caso de cambio en un bucle.

La submatriz máxima requerirá un análisis más profundo del problema subyacente: no es algo que esperaría ver en una clase de programación para principiantes, ya que requiere habilidades matemáticas más altas que un problema de tipo FizzBuzz. Este problema tiene una sensación similar al problema de la ruta más corta, que se resuelve con el algoritmo de Dijkstra, tal vez es una especialización del problema de la ruta más larga .

En su escala del 1 al 10, probablemente lo calificaría entre 3 y 5.

* Mientras el servidor estaba inactivo, descubrí que el problema de subarrays máximo tiene su propia página en wikipedia.

oosterwal
fuente
¿Alguien puede explicar por qué es necesario el algoritmo descrito en wikipedia, cuando el siguiente algoritmo conceptualmente mucho más simple funciona para mí: En una sola pasada, calcule la suma acumulativa, encontrando el mínimo y el máximo de la manera habitual. La subsecuencia consecutiva de suma máxima comienza después del índice mínimo de cumsum y se extiende hasta el índice de cumsum máximo inclusive.
Ben Voigt
2
@Ben Voigt: pruebe la secuencia {+2, -4, +1} o {+1, +1, -1, -1, -1, -1, +1}. En realidad, el método Kadane es muy simple: solo escanea la matriz una vez y mantiene tres variables actualizadas al estilo de la programación dinámica.
rwong
@rwong: ah ok, se necesita Kadane en el caso en que el mínimo viene después del máximo. Y cuento 5 variables, no 3, más el índice de bucle.
Ben Voigt
@Ben: tienes razón, son 5 variables más el índice de bucle.
rwong
1

Le doy un 3. Más allá de la mayoría de los programadores que he entrevistado, pero es un problema fácil para aquellos que recomendé contratar.

Kevin Cline
fuente