algorithm - primaria - pensamiento algoritmico que es
Mejorar el pensamiento algorÃtmico (13)
Estaba pensando en formas de mejorar mi capacidad para encontrar soluciones algorítmicas a un problema. He pensado en resolver problemas matemáticos de varios sectores matemáticos, como las matemáticas discretas o el álgebra lineal. Después de "buscar en Google" un poco, he leído un artículo que afirmaba que Necesito aprender programación de juegos para lograr esto y me parece lógico.
¿Tiene / tuvo las mismas preocupaciones que yo o tiene alguna idea al respecto? Estoy deseando escucharlas.
Gracias a todos de antemano.
PS1: Quiero decir que ya sé sobre programación y cómo programar (aunque estoy en nivel amateur :-)) y solo quiero mejorar el tema específico, NO comenzar a aprenderlo
PS2: Creo que es un tema útil para futuras referencias, así que revisé el cuadro wiki de la comunidad.
¿Qué tal si probamos los problemas en Project Euler? http://projecteuler.net
Hay un montón de problemas allí, y para cada uno podrías practicar 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 esto como problemas matemáticos, sino como problemas para crear algoritmos para resolver problemas matemáticos
Algunos libros más que vale la pena leer (sin ningún orden en particular):
- Aha! Insight (Martin Gardner)
- Cualquiera de los libros de Programming Pearls (Jon Bentley)
- Concrete Mathematics (Graham, Knuth y Patashnik)
- Una teoría matemática de la comunicación (Claude Shannon)
Por supuesto, la mayoría de ellos son simplemente muestras; otros libros y documentos de los mismos autores suelen ser también bastante buenos (por ejemplo, Shannon escribió mucho que bien vale la pena leer y muy poca gente le presta la atención que merece).
Aprender sobre la programación de juegos probablemente te lleve 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 conocimiento algorítmico es
- Conozca los buenos algoritmos que existen actualmente para su área de interés
- Expande tu conocimiento al ver otras áreas; por ejemplo, ¿qué tipos de algoritmos se requieren al trabajar en el análisis genético? ¿Cuál es el mejor enfoque para determinar el potencial de fuga en relación con las inundaciones?
- Lea sobre problemas en otros dominios e intente utilizar los algoritmos con los que está familiarizado para ver si encajan. Si no intentan resolver el problema y ver si puede encontrar su propio algoritmo.
Consulte algunos jueces en línea , TopCoder ( tutoriales de algoritmo ). Tome algunos algoritmos libro ( CLRS , Skiena ) y haga ejercicios más duros. Practica mucho.
Debería echarle un vistazo a Matemáticas y razonamiento plausible 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.
El "Cómo resolverlo" de Polya es un excelente 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 leer todo eso, por supuesto practicar práctica práctica .
El dicho "la práctica hace la perfección" definitivamente se aplica. 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é tal probar los problemas en Project Euler? http://projecteuler.net
Hay un montón de problemas allí, y para cada uno podrías practicar 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 como problemas para crear algoritmos para resolver problemas matemáticos.
En la universidad, tomé una clase sobre 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.
Lea SICP / Estructura e Interpretación de Programas de Computadora y trabaje todos los problemas; luego lea El arte de la programación de computadoras (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!
PS SICP está disponible de forma gratuita en línea, pero tiene que comprar AoCP (obtenga la edición internacional, no para publicación en norteamérica, utilizada por 30 USD). Y aún no he hecho esto yo mismo (lo intento cuando tengo tiempo libre).
Ok, entonces, para resumir las sugerencias:
La forma más efectiva de mejorar esta habilidad es resolver el problema con la mayor frecuencia posible. Ya sea problemas del mundo real (como el algoritmo de ascensores que ya se sugirió) 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.
Primero 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?
Use las bases de datos problemáticas y los 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 algoritmos ayuda, pero no pierdas demasiado tiempo en ello ... Leer no ayudará tanto como tratar de resolver los problemas tú solo. 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.
Puedo recomendar el libro "Introducción a la lógica y los conjuntos para científicos 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
Resuelve 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?".
Intenta 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í. Cada día. Todo el tiempo.
La idea es que casi todo se puede ver como un algoritmo (un objetivo que tiene algún tipo de significado para alguien y un método 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?".
Se puede confundir fácilmente con el pensamiento crítico, pero se trata más bien de cuestionar sus propias soluciones que las soluciones que intenta comprender y mejorar.
Sugeriría este camino para ti:
1.Primero aprenda partes elementales de un idioma.
2. Luego aprende sobre algunas matemáticas básicas.
3. Cambie a topcoder div2 easy problems.Por lo general, si no puede 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 el 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úa con el paso 5 a partir de ahora y serás un mejor programador.