Estaba revisando mis notas y me topé con la implementación de diferentes algoritmos de clasificación.
Cuando intenté dar sentido a la implementación de QuickSort y MergeSort, se me ocurrió que aunque programo para vivir y me considero decente en lo que hago, no tengo ni la memoria fotográfica ni la capacidad intelectual para implementar esos algoritmos sin confiando en mis notas. Todo lo que recuerdo es que algunos de esos algoritmos son estables y otros no. Algunos tardan O (nlog (n)) u O (n ^ 2) en completarse. Algunos usan más memoria que otros ...
Sentiría que no merezco este tipo de trabajo si no fuera porque mi posición no requiere que use ningún algoritmo de clasificación que no sea el que se encuentra en las API estándar. Quiero decir, ¿cuántos de ustedes tienen una posición de programación donde realmente es esencial que puedan recordar o crear este tipo de cosas por su cuenta?
fuente
Respuestas:
Preguntémosle a Albert y veamos qué tiene que decir sobre el tema:
Amén, hermano Albert, amén.
Una vez que haya hecho una buena encuesta de los algoritmos esenciales en cualquier disciplina en particular (ordenar, buscar, lo que sea), puede olvidarse de los detalles de implementación hasta que realmente necesite el algoritmo, en cuyo caso debe buscarlo o usar un lib preexistente. Hace 25 años construí un importante sistema de búsqueda usando árboles B *, pero hoy necesitaría RTFM para poder usarlos bien.
fuente
O(n log n)
, pero si obtiene una gran cantidad de errores de caché o (Dios no lo quiera) golpea el disco, entonces eson log n
será solo un buen recuerdo.No es realmente una cuestión de memorización. Se trata de comprender profundamente las clases generales de algoritmos como dividir y conquistar. Si realmente comprende dividir y conquistar, entonces no necesita memorizar la clasificación rápida. Puede volver a derivarlo en el acto según sea necesario. Además, la verdadera recompensa ni siquiera es poder derivar la clasificación rápida por su cuenta, es que puede reconocer cuándo un nuevo problema es susceptible de una solución de divide y vencerás.
No todos los trabajos de programación son iguales. Algunos trabajos necesitan un conocimiento profundo de los algoritmos, algunos necesitan personas que entiendan la teoría de tipos, y algunos solo necesitan personas que puedan extraer datos de un formulario web y moverlos a una base de datos. Algunos trabajos incluso necesitan todas esas habilidades a la vez. ¿En qué tipo de trabajo quieres trabajar?
fuente
Creo que la única vez que necesita recordarlo todo es cuando solicita un trabajo cuando tiene que encontrar respuestas en el acto y no tiene recursos externos.
He tenido compañeros de trabajo que reescriben quicksort y otras cosas, pero sigo diciéndoles que vuelvan a usar las funciones de clasificación integradas que están en el idioma. Sé que, dependiendo de los tipos de proyectos en los que trabajemos, debemos recordar otros algoritmos, ya que generalmente no se incluyen en las bibliotecas estándar, pero la clasificación no surge porque generalmente está integrada en el lenguaje.
Sin embargo, cuando necesitamos recordar esos algoritmos, generalmente recurrimos a google o un libro, y generalmente no busca una implementación específica, sino cuál sería la mejor implementación para nuestro problema.
fuente
Solo recordar qué algoritmo es útil en qué escenarios sería más que suficiente para ayudarlo durante su trabajo. De hecho, la mayoría de los trabajos de programación no requieren la memorización del enfoque, sino que están interesados en su forma de reconocer el patrón algorítmico cuando se enfrentan al problema .
De hecho, hay abundante información en la mayoría de los blogs / artículos de programación sobre temas de algoritmos. Por lo tanto, memorizar la implementación exacta no tiene importancia. La información más valiosa sería obtener una idea básica sobre qué tipo de algoritmos están disponibles y qué problema específico son buenos para resolver . Buscar una implementación exacta una vez que sabe lo que está buscando es bastante rápido.
En resumen, siempre es mejor saber qué busca y dónde están las referencias , que lo guiarán a la fuente.
fuente
La implementación exacta no es muy importante. Pero el principio detrás de mergesort / quicksort: recursión, particionamiento, etc., es muy básico y todo programador debe entenderlo. Estos algoritmos son realmente muy simples de describir en palabras una vez que lo entiendes.
No es realmente un problema si puede buscarlo o si puede buscarlo en Google, es si el programador comprende estas técnicas de resolución de problemas y puede aplicarlo a otras situaciones.
fuente
Soy de dos mentes sobre este tema. Conozco a muchos programadores que no saben qué es un algoritmo de clasificación, pero hacen su trabajo bastante bien. También creo en la comprensión de los principios para comprender verdaderamente el dominio.
Es difícil para mí tener una respuesta imparcial sobre este tema, ya que he estado programando durante tanto tiempo que probablemente haya olvidado más algoritmos que conozco actualmente, pero todavía sé los que se mencionan en esta pregunta. Creo que los líderes de pensamiento en Agile (por ejemplo, Ron Jeffries, Alistair Cockburn) tienen algunas buenas ideas cerca de esta idea (por ejemplo, Shu-Ha-Ri).
En resumen a esta respuesta inestable: definitivamente use la API (NIH es un signo de inmadurez del desarrollador), pero siempre comprenda los principios subyacentes. Espero que esto ayude.
fuente
La clasificación y la búsqueda son increíblemente importantes, tanto si eres fanático de Donald Knuth como si quieres ser el próximo Larry Page. Dependiendo del negocio en el que se encuentre y del nivel de competencia que pueda tener entre sus candidatos, le recomendaría que incluya algunos de los siguientes conceptos en la entrevista.
Clasificación
buscando
Algunos podrían decir que exigir el código para estos algoritmos es excesivo a menos que el trabajo esté en una isla desierta sin conexión a Internet. Otra consideración es que si tiene 30 minutos, y desea preguntar sobre cualquier otra cosa, para muchos candidatos, implementar el tipo podría tomar una gran parte de su tiempo.
fuente