Usted podría cerrar esta pregunta o voto "-1" para esto, pero simplemente no puedo dejar de mí mismo de esta pregunta de los expertos de la matemática que resuelve los miles de problemas relacionados con las matemáticas y por lo tanto ayudar a los demás.Soy un C++/C programador que quiera mejorar sus habilidades de codificación.He aprendido muchos algos y varios conceptos, pero creo que esto no es suficiente.Por otra parte, desde el último par de meses estoy compitiendo en varios de codificación de competencias en donde he observado que existe una fuerte relación entre los programadores y las matemáticas.Las personas que son buenas en matemáticas son capaces de resolver problemas más fácilmente en comparación con los demás.Yo sé que es la capacidad mental de la persona, que le permite hacer las cosas de una mejor manera, pero al mismo tiempo,en mi opinión, el trabajo duro puede llenar ese hueco en cierta medida.Estoy listo para hacer un montón de trabajar duro para convertirse en un buen programador, pero carece de la debida orientación.Así que voy a postear esta pregunta esperando que alguien venga y me ayude, por dar algunos consejos y sugerencias de cómo mejorar matemáticas para la codificación de las competiciones, ¿cuál es la mejor manera de hacerlo y hay buenos libros que me pueda ayudar ? Gracias de antemano.
Respuestas
¿Demasiados anuncios?Me gustaría dividir las habilidades necesarias para la programación de competiciones de la siguiente manera:
- La capacidad para pensar de manera abstracta.
- La capacidad para emplear bien conocidos algoritmos y técnicas algorítmicas.
- El conocimiento de las anteriores competiciones tareas.
- La flexibilidad del punto de vista que permite encontrar fácil implementaciones.
- General de las técnicas de solución de problemas.
Habilidad (5) consiste en ideas tales como "razonamiento hacia atrás" y "revertir una tarea" (estos no son específicas a las ciencias exactas). Habilidad (4) es un arte que es obtenido principalmente por la experiencia y también por mirar el trabajo realizado por los otros concursantes. Habilidad (3) es, obviamente, una cuestión de experiencia. Habilidad (2) es alcanzado por una minuciosa preparación, incluyendo tanto la resolución de problemas y algoritmos de lectura de libros. Habilidad (1) es de nuevo un arte, pero esta vez es un arte que tiene mucho en común con las otras ramas de las matemáticas.
Permítanme darles algunos ejemplos de los últimos International Olympiad in Informatics (IOI2011, http://www.ioi2011.or.th/tasks):
Tarea RICEHUB (relativamente fácil) requiere una visión similar a la tarea POSTERIOR de IOI2000, que es un ejemplo de habilidad (3).
La tarea de la CARRERA (relativamente duro) es principalmente una cuestión de la aplicación de una técnica conocida. La forma más sencilla de resolver esto es para probar las técnicas conocidas, uno tras otro, hasta que te das cuenta de que uno le da un algoritmo eficiente. Creo que es muy duro para resolver este si te acercas a ella de ninguna otra forma (no voy a dar detalles de la solución para evitar estropearlo para usted. No hay una solución en el sitio web). Así que este es un ejemplo de habilidad (2).
Tarea PARROT (relativamente fácil, pero conceptualmente nuevo en IOI) puede ser utilizado como un ejemplo de la habilidad (4). La "matemática" la solución no es demasiado difícil, pero hay cuestiones de aplicación. De nuevo, para no estropear la pregunta, me acaba de sugerir teniendo en cuenta la tarea de los CUADRADOS MÁGICOS de IOI1996 y la tarea TWOFIVE de IOI2001 que implican los detalles de implementación similares a los de PARROT (los CUADRADOS MÁGICOS es más fácil que PARROT y TWOFIVE es más difícil con respecto a los problemas de implementación).
Como para la habilidad (1), la tarea de COCODRILO de IOI2011 puede servir como un ejemplo, pero yo prefiero darle un limpiador, que también sirve como un ejemplo de la habilidad (5):
Considerar el conocido huevo-droping problema (ver http://www.ocf.berkeley.edu/~wwu/enigmas/duro.shtml).
Para resolver este problema, primero hay que invertir y preguntar "¿cuál es el edificio más alto puedo resolver con a $t$ lanza?". Para resolver la inversa de problema, se debe emplear razonamiento hacia atrás (reversa y hacia atrás razonamiento son ejemplos de la habilidad (5)), y decir: Vamos a tratar de esbozar una estrategia de solución: El primer lanzamiento sería a partir de... bueno.. no sé de donde. Así que vamos a denotar el piso de la primera tirada por "t_1" y continuar desde allí. No voy a seguir describiendo la solución, pero tenga en cuenta que "vamos a denotar el piso por una variable y continuar" es un ejemplo de la abstracción. En lugar de un número de una fórmula, que acaba de aceptar el hecho de que no sabemos lo que esta planta es sin embargo, constituyen una variable para indicar, y continuar.
(usted puede encontrar tareas de IOI hasta IOI2008 en http://ioinformatics.org/history.shtml).
Desde mi experiencia con los estudiantes que participan en IOI, yo diría que el que también participan en la OMI (o de lo contrario muy orientado hacia las matemáticas y no sólo de la informática) son:
- Siempre en la parte superior en lo que respecta a la habilidad (1)
- Tienden a ser mejores que otros en habilidad (5)
- Tiene un potencial para llegar a ser excepcionalmente bueno en la habilidad (4) después de un duro entrenamiento
EDITAR: Como un último consejo: Intenta resolver muchas tareas. Código de cualquier tarea que resolver para asegurarse de que entiende todos los detalles. Después de resolver (o tratando de largo suficiente), lea siempre una solución oficial o discutir la solución con alguien más. En una etapa más avanzada de su formación, de leer los tutoriales que puedes encontrar en el web sobre todo sobre las estructuras de datos. Usted puede encontrar algunos de estos en TopCoder del sitio web.
Como temas que tradicionalmente son consideradas como las matemáticas y no de ciencias de la computación:
- Juegos matemáticos pueden ser relevantes para la programación de las competiciones.
- En muchos geometría computacional tareas puede ser vale la pena sentirse cómodo con conjuntos convexos como los matemáticos piensan de ellos (tal vez esto es un poco avanzado).
- Matemática General de la experiencia y el rigor que puede ayudarle a evitar el mal soluciones que intuitivamente parece correcto.
En general, yo diría que el mejor camino para llegar a ser mejor en la programación de los concursos es para entrenar específicamente para ellos, mientras que llegar generales de la educación matemática. No hay muchos "tradicional de las matemáticas" de los temas que pueden ayudar a usted directamente con los concursos.
(probablemente la mejor y más relevante, para obtener el general básica de la educación matemática es tomar el "Álgebra Lineal" en la universidad o para aprender el mismo material que en otros lugares. De nuevo, esto no es directamente relevante, pero finalmente sus habilidades de resolución de problemas se beneficiarían con el rigor que usted aprenderá en este curso).
Como un leve contrapunto, voy a hacer la afirmación de que si su objetivo es convertirse en un mejor programador, entonces las habilidades matemáticas que usted está buscando para el concurso de los problemas probablemente no es lo que realmente quieres.
No me malinterpreten, yo soy un gran fan de 'programador de matemáticas' (matemáticas discretas, la combinatoria, los algoritmos de análisis, etc) y creo que es una tremenda herramienta útil para tener en su repertorio; y yo lo adoro 'recreativo' de las matemáticas y de algunas de las ramas de la teoría de los números que a menudo acaban en una parte de concursos de programación. Pero esas habilidades no tienen prácticamente nunca ha sido parte de mi día a día trabaja como programador (y yo estoy en uno de los campos donde está más probabilidades de llegar), y en mi opinión, mi conocimiento de ellos es casi ortogonal a mi programador de habilidades.
Todavía hay un amplio uso, sin duda, para algunos de los conceptos básicos - ser capaz de simplificar un problema en primer lugar, ser capaz de analizar los algoritmos que utiliza, todas son útiles habilidades; pero los principios básicos de programación (organización de código, abstracción, etc.) en mi humilde opinión se llevará mucho más lejos. Concursos de programación son un montón de diversión, y son sin duda anima, pero no es realmente un reflejo de "mundo real" de la programación, en mi experiencia, y me gustaría ser un poco recelosos de poner demasiado esfuerzo en las habilidades que se aplican principalmente a los problemas de las pruebas.