¿Cómo cultivar la intuición de algoritmo?


17

Cuando se enfrentan con un problema en el software, generalmente veo una solución de inmediato. Por supuesto, lo que veo suele ser algo apagado, y siempre tengo que sentarme y diseñar (reconozco que normalmente no diseño lo suficiente), pero obtengo una cierta intuición de inmediato.

Mi problema es que no tengo la misma intuición cuando se trata de algoritmos avanzados. Me siento mucho más a la tarea de construir otro Facebook y luego construir otro Google búsqueda, o un Music Genom project. Probablemente sea porque he estado construyendo el software durante bastante tiempo, pero tengo poca experiencia con los algoritmos que componen.

Me gustaría recibir consejos de la comunidad sobre qué leer y qué proyectos emprender para ser mejores en la composición de algoritmos.

(Esta pregunta no tiene nada que ver con Algorithmic composition. Bueno, casi nada)

8

1 A quien dijo que la experiencia es el mejor maestro.

Existen varios portales en línea que tienen una gran cantidad de problemas de programación, que puede enviar sus propias soluciones a, y obtener un pase automático/no pasa indicación.

  1. http://www.spoj.pl/
  2. http://uva.onlinejudge.org/
  3. http://www.topcoder.com/tc
  4. http://code.google.com/codejam/contests.html
  5. http://projecteuler.net/

El USACO training site es el programa de entrenamiento que todos los participantes de la Olimpiada de computación EE.UU. pasan. Va paso a paso, introduciendo algoritmos cada vez más complejos a medida que avanza.


7

Steve Yegge refiere a "The Algorithm Design Manual" en one de sus diatribas. No lo he visto yo mismo, pero parece que es solo el boleto de su descripción.

Mi favorito absoluto para este tipo de preparación de entrevistas es The Algorithm Design Manual de Steven Skiena. Más que cualquier otro libro, me ayudó a comprender cuán asombrosamente comunes (e importantes) son los problemas de los gráficos: deberían formar parte del conjunto de herramientas de todos los programadores que trabajan. El libro también cubre estructuras básicas de datos y algoritmos de clasificación, lo cual es una buena ventaja. Pero la mina de oro es la segunda mitad del libro, que es una especie de enciclopedia de 1-pagers en tropecientos de problemas útiles y varias maneras de resolverlos, sin demasiados detalles. Casi cada 1-pager tiene una imagen simple, por lo que es fácil de recordar. Esta es una gran manera de aprender a identificar cientos de tipos de problemas.

  0

+1 para la referencia del libro. Eso se ve bastante interesante. 21 feb. 092009-02-21 22:31:27


5

dominio del problema

En primer lugar hay que entender el dominio del problema. Una solución elegante al problema equivocado no sirve, ni es una solución ineficiente al problema correcto en la mayoría de los casos. La calidad de la solución, en otras palabras, es a menudo relativa. Un simple problema de programación que tiene una solución determinística que demora diez minutos puede ser correcto si los cronogramas se realizan una vez por semana, pero si los cronogramas cambian varias veces al día, puede ser necesaria una solución de algoritmo genético que converja en unos segundos.

descomposición y mapeo

En segundo lugar, se descompone el problema en sub-problemas y elementos desconocidos conocidos/que corresponden a elementos de la solución. A veces esto es obvio, p. para contar widgets necesita una forma de identificar widgets, un contador incrementable y una forma de almacenar el conteo. A veces no es tan obvio. A veces hay que descomponer el problema, el dominio y las posibles soluciones al mismo tiempo y probar varias asignaciones diferentes entre ellos para encontrar uno que conduzca a los resultados correctos [este es el método general].

modelo

Modelo de la solución, en su cabeza, al menos, y caminar a través de él para ver si funciona correctamente. Ajustar según sea necesario (ver descomposición y mapeo, arriba).

composición/interfaces de

Muchas veces se pueden encontrar elementos del problema y los elementos de la solución que se asignan entre sí y producir resultados parciales que son útiles. Esta composición y construcción de interfaz proporciona el núcleo de la solución y también sirve para reducir el alcance del problema restante. Entonces simplemente vuelves a la parte superior con un problema inicial más pequeño, y lo revisas nuevamente.

experiencia

La experiencia es el mejor maestro, por supuesto, pero leer sobre diferentes tipos de problemas y soluciones también será de utilidad. También es muy útil estudiar algunos de los conocidos algoritmos y sus aplicaciones, p. Dijkstra, Bresenham, Unification, y por supuesto, graph theory.


9

Puede que le resulte útil para realizar algoritmos físicamente. Por ejemplo, cuando estés estudiando algoritmos de clasificación, practica haciendo cada uno con un mazo de cartas. Eso activará diferentes partes de tu cerebro que leer o programar solo.


0

No estoy seguro de la intuición puede ser cultivado, pero creo que sé lo que está pidiendo. Cuantos más problemas resuelva, más información y experiencia tendrá a su disposición para problemas futuros. Entonces, digo simplemente practica. Practica la programación de aplicaciones del mundo real y te encontrarás con muchos problemas. A veces, resolver acertijos puede ser muy educativo también.


0

trato de encontrar analogías físicas cuando estoy mirando un problema complejo.