algorithm - puede - relacion entre matematicas y programacion
¿Cuáles son los conceptos matemáticos centrales que un buen desarrollador debería saber? (27)
"Prueba por inducción" es un concepto matemático esencial para que los programadores lo sepan.
Desde que me gradué de una escuela muy pequeña en 2006 con un programa mal formado y desactualizado (soy extranjero y no conocía ninguna escuela mejor en ese momento) me he dado cuenta de que extrañaba muchos conceptos básicos de una la perspectiva matemática y de software que son principalmente los fundamentos de otros conceptos superiores.
Es decir, traté de escuchar / ver el material abierto del MIT sobre Introducción a los algoritmos, pero rápidamente me di cuenta de que me faltaban varios conceptos matemáticos para comprender mejor el curso.
Entonces, ¿cuáles son los conceptos matemáticos centrales que un buen ingeniero de software debería saber? ¿Y cuáles son los posibles libros / sitios que me recomendarás?
¿Por qué todos incluyen la probabilidad y las estadísticas en la lista de oro sin mencionar el cálculo? No se puede entender de qué se tratan las probabilidades y las estadísticas sin al menos un conocimiento práctico de los límites, los derivados, las integrales y las series. Y, en general, el cálculo (junto con el álgebra lineal) es el caballo de batalla de todas las matemáticas.
Aquí hay uno simple que me desconcierta cuando veo desarrolladores que no lo entienden:
- Orden de operaciones
Bueno, eso depende de lo que tu objetivo sea. Como alguien dijo, Linear Algebra, Combinatorics, Probability and Statistics y Graph Theory son importantes para resolver problemas difíciles. El crecimiento asintótico de funciones (notación bit-Oh) es muy importante. También necesitará dominar las sumas y las series si necesita trabajar en el análisis de algunos algoritmos más complejos (consulte el apéndice sobre Cormen y otros Intro to Algorithms).
Incluso si te interesa "Java para la empresa" o "PHP del lado del servidor", encontrarás algunas estadísticas y complejidad de algoritmos (por lo tanto combinatorics, inducción, sumas, series, etc.) útiles cuando tu jefe quiere que obtengas el servidor para trabajar más rápido, y agregar nuevo hardware no parece ayudar. :-) He pasado por eso una vez.
Comience con lo que nosotros, los CS, llamamos "matemáticas discretas". El cálculo y el álgebra lineal también pueden ser muy útiles porque te permiten acceder a muchos dominios de aplicaciones. Una vez que hayas dominado esos tres, ve a la teoría de la probabilidad. Esos 4 lo pondrán a la competencia en el 95% (lo inventé) de los dominios de aplicación.
Consulte el libro Fundamentos de la informática
Este libro está escrito por: Al Aho y Jeff Ullman y todo el libro está disponible en línea.
Esto es lo que dicen los autores en su Prefacio sobre el objetivo de este libro:
" Fundamentos de la informática cubre temas que a menudo se encuentran divididos
entre un curso de matemáticas discreto y una secuencia de nivel de segundo año en la computadora
ciencia en estructuras de datos. Nuestra intención ha sido seleccionar la matemática
fundaciones con un ojo hacia lo que el usuario de la computadora realmente necesita, en lugar de
lo que un matemático podría elegir ".
Creo que depende de tu enfoque. Hace unos años, compré el set de Arte de programación por computadora de Donald Knuth. Después de mirar los libros, me di cuenta de que prácticamente todo es prueba de cálculo. Si estás interesado en desarrollar tus propios algoritmos genéricos y pruebas para ellos, te recomiendo que puedas entender los libros anteriores, ya que es con lo que estarías lidiando en ese mundo. Por otro lado, si solo quiere / necesita usar varias rutinas de ordenación / búsqueda / árbol / etc ... entonces la notación de O grande como mínimo, las matemáticas booleanas y el álgebra general estarán bien. Si se trata de 3D, también geometría y trigonometría.
Tiendo a ser más del lado de usar que de hacer pruebas, y aunque me gustaría pensar que he hecho algunas cosas inteligentes a lo largo de los años, nunca me he sentado y desarrollado una nueva rutina de clasificación. El mejor consejo que puedo darte es aprender lo que necesitas para tu campo, pero exponerte a niveles más altos para que sepas que existe y cuánto más hay para aprender, de lo contrario no obtendrás mucho crecimiento.
Creo que los algoritmos y la teoría son de gran importancia. Poder encontrar una solución rápida y correcta es lo que diferencia a los buenos programadores del resto. Además, ser capaz de demostrar su algoritmo (usando técnicas de prueba estándar, inducción, contradicción, etc.) es igualmente importante.
De vuelta a la escuela, uno de mis instructores dijo que para aplicaciones comerciales, todo lo que necesita saber es sumar, restar, multiplicar y dividir. Todas las otras fórmulas que el solicitante conocerá y le informarán qué se necesita. Ahora date cuenta de que esto es para la financiación de los informes y la escuela centrada en la aplicación. Hasta el día de hoy, esto ha sido cierto para mí. Nunca una vez necesité saber más que eso.
El álgebra básica y las estadísticas son buenos puntos de partida y la base para muchos otros campos.
El álgebra de Boole es fundamental para entender las estructuras de control y la refactorización. Por ejemplo, he visto muchos errores causados por programadores que no sabían (o no podían usar) la ley de DeMorgan. Como otro ejemplo, ¿cuántos programadores reconocen inmediatamente que
if (condition-1) {
if (condition-2) {
action-1
} else {
action-2
} else {
action-2
}
puede ser reescrito como
if (condition-1 and condition-2) {
action-1
} else {
action-2
}
Las matemáticas discretas y la combinatoria son tremendamente útiles para comprender el rendimiento de varios algoritmos y estructuras de datos.
Como lo menciona Baltimark, la inducción matemática es muy útil para razonar sobre bucles y recursión.
La teoría de conjuntos es la base de las bases de datos relacionales y SQL.
A modo de analogía, permítanme señalar que los carpinteros rutinariamente usan una variedad de técnicas de regla general para construir cosas como techos y escaleras. Sin embargo, un conocimiento de geometría le permite resolver problemas para los cuales no tiene una regla de oro "enlatada". Es como aprender a leer mediante la fonética frente al reconocimiento visual de un vocabulario básico. 90 +% de las veces no hay mucha diferencia. Pero cuando se encuentra en una situación desconocida, es MUY bueno tener las herramientas para resolver la solución usted mismo.
Finalmente, el rigor / precisión requerido por las matemáticas es una preparación muy útil para la programación, independientemente de la técnica específica. Una vez más, muchos de los errores en la programación (o incluso las especificaciones) que he visto en mi carrera tienen un pensamiento descuidado en su causa raíz.
El Capítulo 1 de "El arte de la programación de computadoras" tiene como objetivo proporcionar exactamente esto.
En orden de importancia:
- Contando (necesario para bucles)
- Suma, resta, multiplicación, división.
- Álgebra (solo se requiere realmente para entender el uso de variables).
- Álgebra booleana, lógica booleana y binario.
- Exponentes y logaritmos (es decir, entienden la notación O (n)).
Cualquier cosa más avanzada que eso suele ser específica de un algoritmo o específica de un dominio. Dependiendo de las áreas que le interesan, las siguientes también pueden ser relevantes:
- Álgebra lineal y trigonometría (visualización 3D)
- Matemáticas discretas y teoría de conjuntos (diseño de bases de datos, diseño de algoritmos, diseño de compiladores).
- Estadísticas (bueno, para aplicaciones estadísticas y / o científicas / económicas, posiblemente también útiles para el diseño de algoritmos).
- Física (para simulaciones).
La comprensión de las funciones también es útil (no recuerdo cuál es el término matemático para esa área), pero si sabe cómo programarlo probablemente ya lo haga.
Mi punto es: un niño de diez años debe saber suficientes matemáticas para poder entender la programación. No se requieren realmente muchas matemáticas para la comprensión básica de las cosas. Todo se trata de la lógica, realmente.
Había un libro recomendado ... el título era algo así como Concrete Mathematics. Fue recomendado en algunas preguntas.
Matemáticas discretas
Álgebra lineal
Combinatorios
Probabilidades y estadísticas
Teoría de grafos
Me gustaría ir con los campos que Landon declaró:
Matemáticas discretas, Álgebra lineal, Combinatoria, Probabilidad y estadística, Teoría de grafos
y agrega lógica matemática.
Esto le daría un control sobre la mayoría de los campos de CS. Si quieres entrar en campos especiales, debes sumergirte en algunas áreas especialmente:
Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
Mi formación en matemáticas es realmente deficiente (geólogo por formación), pero tomé una clase de matemática discreta en la escuela secundaria y utilizo los conceptos todos los días como programador. Es probablemente la clase más valiosa que tomé en toda mi educación en lo que respecta a mi profesión actual.
Para matemática discreta, here hay un increíble conjunto de 20 conferencias de la Universidad Arsdigita. Cada uno dura alrededor de una hora y veinte minutos.
Sí, diría que una comprensión básica de la inducción ayuda a comprender lo que n representa en los algoritmos. También algunas estructuras lógicas y discretas son útiles.
Yo diría lógica booleana. Y, O, XOR, NO. Encontré como programador que utilizamos esto más a menudo que el resto de conceptos matemáticos.
un sitio para repasar las matemáticas: http://www.khanacademy.org/
La notación de Big O en el análisis de algoritmos generales, y en relación con las colecciones estándar (clasificación, inserción y eliminación de recuperación)
Matemáticas para programadores . Una buena lectura.
Concrete Mathematics cubre la mayoría de los temas principales. Un buen libro sobre Matemáticas Discretas, como las Matemáticas Discretas de Rosen y sus Aplicaciones , llenará cualquier vacío.
La probabilidad y la estadística son muy útiles si alguna vez tiene que hacer algo parecido al aprendizaje automático.
Cubro los conceptos básicos en mi blog " Computing Your Skill " donde analizo cómo funciona el algoritmo de clasificación y emparejamiento TrueSkill de Xbox Live.
- Álgebra de Boole
- Teoría de conjuntos
- Álgebra de Boole
- Teoría de conjuntos
- Matemáticas discretas