¿En qué subáreas de matemáticas debería centrarme para mejorar mis algoritmos en informática?

Esto es más de lo que necesita, pero tal vez también a veces menos de lo que desea, dependiendo.

Conceptos básicos: ¿Qué es un logaritmo, qué es un exponente? ¿Qué es el módulo? Aritmética de enteros: ¿truncar vs redondear? ¿Qué indicadores de CPU pueden establecer un conjunto aritmético entero y por qué? ¿Cómo se representa un flotador, por qué es impreciso para decimal, qué es desbordamiento y subflujo? Binario, octal, hexadecimal … bytes, palabras, palabras dobles … ¿cuál es la diferencia? Lógica booleana: ¿Y, O, XOR? La ley de De Morgan? ¿Qué es la paridad? ¿Qué es asintóticamente más rápido, O (n log (n ^ 2)) u O (n sqrt n)? ¿Por qué el tipo de burbuja es malo, pero también, cuándo podría ser bueno?

Álgebra: cómo escribir una ecuación (a partir de un ‘problema de palabras’) y manipularla correctamente para obtener la variable que desea. (Esta habilidad puede oxidarse). Cómo simplificar o cambiar las ecuaciones en el código sin cambiar su resultado.

Matemática aplicada (análisis numérico): ¿cómo encuentra una aproximación a una solución que sea lo suficientemente buena y cómo verifica que en realidad sea lo suficientemente buena (con el error vinculado que espera)? ¿Puedes encontrarlo sin una ecuación para la respuesta, acercándote hasta que la aproximación sea lo suficientemente buena?

Relevante para el hashing y la criptografía, especialmente: la teoría de números esenciales relacionada con los números primos, así como la aritmética modular. ¿Podría implementar el hash de cuco, por ejemplo, si no está en su biblioteca? ¿Podría hacerlo si tuviera que generar nuevas funciones hash en caso de que no se inserte un nuevo elemento? También hay muchas preguntas de rompecabezas relacionadas con los temas de los números primos, de una nota menos práctica.

Relacionado con la búsqueda exhaustiva y la optimización exhaustiva, o con posibles trucos para evitar hacer: combinatoria básica, suficiente para conocer al menos tus permutaciones de tus combinaciones.

Relacionado con las complejidades promedio del tiempo de ejecución y los algoritmos probabilísticos, o problemas que involucran probabilidad: suficiente de la teoría de probabilidad para conocer cosas como las distribuciones normales, poisson o binomiales. (En general, para ingeniería, conocer un PDF de un CDF, qué intervalo de confianza o valor p son). ¿Podría explicar la complejidad del tiempo de ejecución promedio de una lista de omisión?

Relacionado con todo: matemáticas discretas. Sepa cómo sumar los números del 1 al N, por ejemplo, y si desea ser un poco más peligroso, cómo encontrar fórmulas para las ‘relaciones de recurrencia’ en general (por ejemplo, inventando la forma cerrada para el Nth Fibonacci de rasguño u otra cosa).

En particular: teoría de grafos, tipos de gráficos, propiedades de gráficos, gráficos bipartitos, ciclos. Muchas cosas son reducibles a una representación gráfica, por lo que no es solo teórico.

Álgebra lineal: práctica, cuando surge el caso de uso. Diagonalizando matrices para exponenciación rápida, o invirtiendo o manipulando matrices para soluciones a sistemas de ecuaciones, o simplemente ejecutando matemáticas en paralelo con vectores. Comprender por qué ciertos problemas y sus datos pueden representarse en forma matricial.

Si solo tuvieras 6-10 horas y estuvieras mal: busca permutaciones (cómo contarlas), combinaciones (cómo contarlas), las fórmulas para la suma de un rango de enteros o enteros al cuadrado, las propiedades de logaritmos, algunas propiedades de la lógica booleana, algunas propiedades básicas de los primos, aritmética modular básica, cómo encontrar factores comunes o un ‘MCD’ o ‘MCM’, y eso es todo el tiempo que tiene.

Ah, y está el hecho divertido de que 2 ^ 10 es 1024. Eso puede ser útil para pensar en los poderes de 2 y relacionarlo con números familiares (2 ^ 10 es aproximadamente 10 ^ 3).

Me faltan algunas cosas; Hay libros sobre esto (principalmente bajo ‘matemáticas discretas’).

Para mayor claridad: en su mayor parte, estos no son problemas cotidianos en la vida de un programador. Prácticamente, el hecho de volverse muy, muy bueno pensando en errores ocasionales … evitaría muchos más errores (con mucho menos esfuerzo) que aprender todo lo anterior. Prácticamente, varias cosas anteriores surgen en aplicaciones que solo algunos programadores tocan, porque están construyendo las bibliotecas en las que confiamos (para que no tengamos que pasar años haciendo eso bien).

Entonces, a menos que su trabajo involucre tales cosas, mucho de esto sería para uso hobby o académico, principalmente, o para prepararse para la tendencia de la entrevista ‘algorítmica’. (Pero algunos de los conceptos básicos, sin duda, son muy importantes).

Las siguientes subáreas pueden mejorar la capacidad de diseñar algoritmos mejores y más eficientes:

  1. Teoría de gráficos: esta área incluye muchos problemas y algoritmos computacionales. La vasta área de las aplicaciones de gráficos no se puede describir.
  2. Álgebra lineal: esta área incluye el lenguaje de matrices y espacios, si está trabajando en estructuras paralelas como GPGPU, este campo puede ayudar a que sus algoritmos se ejecuten mucho más rápido. Además, creo que un informático debería tener una visión sobre la teoría de grafos algebraicos , así como la teoría de grafos y el álgebra lineal.
  3. Teoría de la complejidad: esta área es una de las áreas más importantes, en la que cualquier informático que se proponga diseñar algoritmos debe tener (al menos) un breve conocimiento. Este campo implica análisis de dureza para problemas, algoritmos de aproximación y temas basados ​​en la dureza de la aproximación. Vi a algunos investigadores, centrándose en diseñar algoritmos durante meses sin saber que su problema es NP-Hard y su tarea es demostrar la dureza para no encontrar un algoritmo polinomial.
  4. Ecuaciones diferenciales: en muchos problemas de simulación, existen algunos fenómenos como la difusión, las ondas o … En este caso, debe tener un breve conocimiento sobre PDE. Yo mismo los uso como recuadro negro y creo que no es necesario profundizar en este campo a menos que se den algunos casos especiales; Creo que hay muchos buenos solucionadores de PDE implementados, como resultado, no hay necesidad de estudiar profundamente en este campo.

Bueno, ese tipo de depende.

Si desea trabajar en algoritmos de procesamiento de señal digital, entonces quizás matemática discreta.

Si está haciendo un análisis topológico, entonces … topología.

Si estás calculando trayectorias, entonces cálculo.

Si está haciendo un análisis de big data, entonces estadísticas.

Los algoritmos no son sobre informática, sino sobre el problema en cuestión.

Ninguno, de verdad. Después de más de 40 años de diseño de todo tipo de sistemas, todavía soy terrible en cosas triviales como el cálculo. Casi la única vez que usé números extensamente fue cuando estaba escribiendo un programa de contabilidad, y eso fue solo aritmética.

La programación no es matemática, es lógica.