2009-09-29 10 views
34

Estaba pensando en maneras de mejorar mi capacidad de encontrar soluciones algorítmicas a un problem.I han pensado en la solución de los problemas de matemáticas de varios sectores de matemáticas tales como las matemáticas discretas o algebra.After lineal "googlear" un poco tengo Leí un artículo que afirmaba la necesidad de aprender la programación de juegos para lograr esto y me parece lógico.mejorar el pensamiento algorítmico

¿Tiene/tenía las mismas preocupaciones que yo o tiene alguna idea sobre esto? Tengo muchas ganas de escucharlos.

Gracias a todos, de antemano.

PS1: quiero decir que ya sé acerca de la programación y cómo programar (aunque estoy en el nivel amateur :-)) y sólo quiero mejorar en el tema específico, para no empezar a aprenderlo

PS2: Creo que es un tema útil para futuras referencias, así que revisé el cuadro wiki de la comunidad.

Respuesta

23

Antes que nada, y lo más importante: practicar. Piense en soluciones para todo en todo momento. No tiene que estar en tu computadora, programando. Todos los algoritmos funcionarán bien. De esta manera: cuando solías intercambiar cartas, ¿cómo comparaste tu mazo y el de tu amigo para determinar la mejor forma de comerciar para ambos? ¿Cómo puede definir cuántos intercambios puede hacer para obtener el máximo y aún así no obtener ninguna tarjeta repetida?

Utilice bases de datos de problemas y jueces en línea como este sitio, http://uva.onlinejudge.org/index.php, que tiene cientos de problemas con respecto a los algoritmos generales. Y no necesita ser un programador experto para resolver ninguno de ellos. Lo que necesitas es una buena habilidad con lógica y matemática. Allí, puede encontrar problemas desde los más simples hasta los más desafiantes. La mayoría de ellos provienen de la programación de maratones.

Puede, luego, implementarlos en C, C++, Java o Pascal y enviarlos al juez en línea. Si tienes un buen algoritmo, será aceptado. De lo contrario, el juez dirá que su algoritmo le dio la respuesta incorrecta al problema, o le llevó demasiado tiempo resolverlo.

Leer sobre los algoritmos ayuda, pero no pierda demasiado tiempo en ello ... Leer no ayudará tanto como tratar de resolver los problemas usted mismo.Tal vez puedas leer el problema, tratar de encontrar una solución para ti, compararla con la solución propuesta por la fuente y ver qué te perdiste. No trates de memorizarlos. Si tiene el concepto bien aprendido, puede implementarlo en cualquier lugar. La comprensión es la parte más difícil para la mayoría de ellos.

43

Resuelva los problemas diariamente. Mire los semáforos y pregúntese: "¿Cómo se pueden sincronizar para optimizar el flujo de tráfico? ¿O para optimizar el flujo de peatones? ¿Cuál es la mejor solución para ambos?". Mire los ascensores y pregúntese: "¿Por qué deberían estos ascensores utilizar reglas diferentes a los ascensores de ese otro edificio que visité ayer? ¿Cómo se implementa realmente? ¿Cómo se puede mejorar?".

Trate de ver un problema en todas partes, incluso si ya está resuelto. Reflexiona sobre la solución. Pregúntese por qué su propia solución superior probablemente no sea tan buena como la que puede ver: ¿qué se está perdiendo?

Y así sucesivamente. Cada día. Todo el tiempo.

La idea es que casi todo lo que se puede ver como un algoritmo (una meta que tiene algún tipo de significado a alguien, y un método con el que para lograrlo). Trate de tener esto en cuenta la próxima vez que vea un espectáculo de televisión, o cuando lea la cobertura de noticias del último robo bancario. Pregúntese: "¿Cuál es el objetivo?", "¿De quién es el objetivo?" y "¿Cuál es el método?".

Puede ser fácilmente confundido con el pensamiento crítico, pero es más sobre cuestionar sus propias soluciones, en lugar de las soluciones que tratar de entender y mejorar.

+8

+1 - Si haces esto bien, se vuelve automático, para disgusto de tus amigos y seres queridos. =) –

+0

Me gusta mucho esta solución. – deeb

+2

@Erik: Algo así como trabajar en una empresa de moldeo por inyección, y luego darse cuenta de que * nadie más en la mesa * está interesado en los pasadores de expulsión en la horquilla de plástico. –

3

Aprender acerca de la programación de juegos probablemente le llevará a buenos algoritmos para la programación de juegos, pero no necesariamente a mejores algoritmos en general.

Es un buen comienzo, pero creo que la mejor manera de aprender y aplicar el conocimiento algorítmico es

  1. Más información sobre los buenos algoritmos que existen actualmente para su área de interés
  2. ampliar sus conocimientos mediante la visualización de otra áreas; por ejemplo, ¿qué tipos de algoritmos se requieren cuando se trabaja en el análisis genético? ¿Cuál es el mejor enfoque para determinar el potencial de fuga de en lo que se refiere a las inundaciones?
  3. leer acerca de problemas en otros dominios e intenta utilizar los algoritmos que usted está familiarizado con para ver si encajan. Si no intentan resolver el problema y ver si puede encontrar su propio algoritmo.
+0

Hay una amplia gama de razones por las cuales la programación de juegos ayuda al pensamiento algorítmico general. ** 1. ** Hablando en términos generales, el dominio del problema es grande, por lo general solo limitado por la imaginación, y no por los problemas que enfrenta una industria específica. ** 2. ** Las soluciones óptimas se buscan de forma rutinaria, en lugar de ser un bien de tener (es decir, hacer el trabajo por lo general no es suficiente, por lo general es un requisito hacerlo rápidamente). ** 3. ** Su los compañeros serán competitivos en esta área y aprenderá más/"ejercitará" más que alguien que escriba una línea típica de negocios o aplicaciones empresariales. – ocodo

9

"How To Solve It" de Polya es un gran libro para pensar sobre cómo resolver problemas matemáticos y hacer pruebas, y lo recomendaría a cualquiera que resuelva problemas.

¡Pero! En realidad, no aborda la emoción que ocurre cuando el mundo real proporciona información a su sistema, a través del ruido del canal, la inquietud del usuario, otros programas que agarran recursos, etc. Para eso vale la pena mirar los algoritmos que se aplican a la información del mundo real (Asignación obligatoria y merecida a la colección de Knuth), y sistemas que son bastante robustos frente a la misma (TCP, kernel internal). Parte de crear buenas soluciones algorítmicas es saber qué es lo que ya existe.

Y junto con la lectura de todo eso, por supuesto práctica práctica práctica.

+0

¡eh, la práctica es buena! Publiqué una respuesta similar al mismo tiempo. Dicen que las grandes mentes piensan igual, ¿verdad? (ya sabes, también lo hacen los mediocres^_ ^) – weiji

5

Definitivamente se aplica el dicho "la práctica hace la perfección". Estoy dando clases particulares a un amigo mío en la programación, y le recuerdo que "si no sabes cómo andar en bicicleta, podrías leer todos los libros, pero eso no significa que serás mejor que Lance Armstrong". mañana - tienes que practicar ".

En su caso, ¿qué le parece probar los problemas en Project Euler? http://projecteuler.net

Hay un montón de problemas allí, y para cada uno puede practicar en el desarrollo de un algoritmo. Una vez que obtiene una implementación lo suficientemente buena, puede acceder a las soluciones de otras personas (para un problema en particular) y ver cómo otros lo han hecho. No pienses en ello como problemas matemáticos, sino más bien como problemas al crear algoritmos para que resuelven problemas matemáticos.

En la universidad, tomé una clase en el diseño y análisis de algoritmos, y definitivamente hay mucha teoría detrás de esto. Es posible que escuche a personas hablar de la complejidad de "O grande" y cosas por el estilo: hay muchas propiedades diferentes sobre los algoritmos en sí mismas que pueden conducir a una mayor comprensión de lo que constituye un algoritmo "bueno". También puedes estudiar bastante a este respecto a largo plazo.

+0

"un montón de propiedades diferentes sobre algoritmos en sí mismas que pueden conducir a una mayor comprensión de lo que constituye un" buen "algoritmo", no tantos. ** 1 ** Velocidad, ** 2 **. Uso de recursos más bajo, ** 3 **. Elegancia, ** 4 ** Concisión. - en otras palabras ... * apretado * – ocodo

6

Debería echar un vistazo a Mathematics and Plausible Reasoning por G. Polya. Es un libro de matemáticas poco común, que en realidad se ocupa del proceso de pensamiento involucrado en hacer descubrimientos matemáticos. Creo que es el mismo proceso de pensamiento el que está involucrado en crear algoritmos.

1

Lea SICP/Structure and Interpretation of Computer Programs y trabaje todos los problemas; luego lea The Art of Computer Programming (todos los volúmenes), trabajando todos los ejercicios sobre la marcha; luego resuelva todos los problemas en Project Euler.

Si no eres muy bueno en los algoritmos después de eso, probablemente no hay esperanza para ti. Jaja!

P.S. El SICP está disponible de forma gratuita en línea, pero debe comprar AoCP (obtenga la edición internacional, no publicada en norteamérica, utilizada por 30 USD). Y aún no he hecho esto yo mismo (lo intento cuando tengo tiempo libre).

0

Ok, para resumir las sugerencias:

la forma más eficaz de mejorar esta capacidad es resolver un problema tan frecuentemente como los problemas del mundo real possible.Either (tales como los ascensores "algoritmo", que es ya se ha sugerido) o ejercicios de libros como CLRS (genial, ya lo tengo :-)). Pero no vi comentarios sobre matemáticas y no sé qué suponer (si está de acuerdo o no).: - s

Los enlaces fueron geniales. Definitivamente los usaré. También creo que será un buen ejercicio para resolver problemas de concursos nacionales/internacionales de informática o para leer la forma en que un matemático demuestra un teorema.

Gracias a todos nuevamente. Siéntase libre de sugerir más, aunque ya estoy satisfecho con las soluciones mencionadas.

+0

Un montón de matemáticas (algunas de ellas realmente, muy difíciles) están cubiertas en El arte de la programación de computadoras (mencionado anteriormente). También hay algunas matemáticas en el SICP, aunque no tan difíciles como las matemáticas en TAoCP. – les2

1

Puedo recomendar el libro "Introducción a la lógica y juegos para informáticos" por Nimal Nissanke (Addison Wesley). La atención se centra en la teoría de conjuntos, la lógica de predicados, etc. Básicamente, la matemática de resolver problemas en el código si se quiere. Cosas buenas y no demasiado difíciles de resolver.

Buena suerte ... Kevin

+0

Entonces, ¿cree que la lógica matemática es el sector matemático más relevante para la programación? –

2

algunos libros más vale la pena leer (en ningún orden particular):

  • Aha! Insight (Martin Gardner)
  • Cualquiera de los Perlas de programación libros (Jon Bentley)
  • hormigón Matemáticas (Graham, Knuth, y Patashnik)
  • A Mathematical Theory of Communication (Claude Shannon)

por supuesto, la mayoría de ellos son sólo muestras - otros libros y trabajos de los mismos autores suelen ser bastante bueno también (por ejemplo, Shannon escribió mucho vale la pena leerlo, y muy poca gente le da la atención que merece).

4

que sugeriría este camino para usted:

1.En primer lugar aprender piezas elementales de un idioma.

2. Luego aprenda sobre algunas matemáticas básicas.

3.Moda al topcoder div2 problemas sencillos.Usualmente si no puedes anotar 250 pts. en un día cualquiera, significa que necesitas mucha práctica, sigue practicando.

4. Ahora es el momento de aprender algunas herramientas de un programador, tome un buen libro como Algorithm Design Manual de Steven Skienna y aprenda sobre la programación dinámica y el enfoque codicioso.

5. Ahora muévase a maratones, no se desanime si no puede resolverlo rápidamente. La mejora no ocurrirá de la noche a la mañana, tendrá que seguir trabajando con paciencia.

6. Continúe con el paso 5 a partir de ahora y será un mejor programador.

+0

Topcoder es una buena idea :) –

1

Excelente ¿Qué tal si probamos los problemas en Project Euler? http://projecteuler.net

Hay un montón de problemas allí, y para cada uno puede practicar en el desarrollo de un algoritmo. Una vez que obtiene una implementación lo suficientemente buena, puede acceder a las soluciones de otras personas (para un problema en particular) y ver cómo otros lo han hecho. No pienses en ello como problemas matemáticos, sino más bien como problemas para crear algoritmos para resolver problemas matemáticos.

Cuestiones relacionadas