www.codingeek.org
1. Divide y vencerás: un algoritmo de dividir y vencerás funciona dividiendo recursivamente un problema en dos o más subproblemas del mismo tipo (o relacionado) ( división ), hasta que estos se vuelvan lo suficientemente simples como para ser resueltos directamente ( conquistar ). Las soluciones a los subproblemas se combinan para dar una solución al problema original.
Esta técnica de divide y vencerás es la base de algoritmos eficientes para todo tipo de problemas, como (por ejemplo, QuickSort, Merge Sort), multiplicar grandes números (por ejemplo, Karatsuba), análisis sintáctico (por ejemplo, analizadores de arriba hacia abajo) y calcular el transformada discreta de Fourier (FFT).
- ¿Cuál es la tarifa promedio por hora para un desarrollador independiente de aplicaciones móviles con experiencia en iOS en varias ciudades de los EE. UU., Como Austin, Atlanta, Boston, Nueva York y San Francisco?
- Si los SSD fueran tan baratos como el disco, ¿cómo afectaría a toda la industria de software y hardware?
- ¿Agile, en desarrollo de software, soporte o innovación de cortina?
- ¿Por qué es importante el aseguramiento de la calidad del software?
- Estaba ganando más de 30 LPA en la industria del software. Lo dejé por falta de algo que amo. Y no sé qué es eso. ¿Qué tengo que hacer?
2. Programación dinámica : es un método para resolver un problema complejo dividiéndolo en una colección de subproblemas más simples, resolviendo cada uno de esos subproblemas una sola vez y almacenando sus soluciones, idealmente, utilizando una estructura de datos basada en memoria. La próxima vez que ocurra el mismo subproblema, en lugar de volver a calcular su solución, uno simplemente busca la solución previamente calculada, ahorrando así el tiempo de cálculo a expensas de un gasto (con suerte) modesto en espacio de almacenamiento. (Cada una de las soluciones de subproblemas está indexada de alguna manera, típicamente basada en los valores de sus parámetros de entrada, para facilitar su búsqueda.) La técnica de almacenar soluciones a subproblemas en lugar de volver a calcularlas se llama “memorización”.
Los algoritmos de programación dinámica se utilizan para la optimización (por ejemplo, encontrar la ruta más corta entre dos puntos o la forma más rápida de multiplicar muchas matrices). Un algoritmo de programación dinámica examinará los subproblemas resueltos previamente y combinará sus soluciones para dar la mejor solución para el problema dado. Las alternativas son muchas, como el uso de un Algoritmo codicioso, que elige la opción óptima local en cada rama en el camino. La elección óptima local puede ser una mala elección para la solución general. Si bien un algoritmo codicioso no garantiza una solución óptima, a menudo es más rápido de calcular. Afortunadamente, se ha demostrado que algunos algoritmos codiciosos (como el árbol de expansión mínimo) conducen a la solución óptima.
3) Algoritmos de gráficos: los gráficos se pueden usar para modelar muchos tipos de relaciones y procesos en sistemas físicos, biológicos, sociales y de información. Muchos problemas prácticos se pueden representar mediante gráficos.
En informática, los gráficos se utilizan para representar redes de comunicación, organización de datos, dispositivos computacionales, el flujo de cómputo, etc. Por ejemplo, la estructura de enlaces de un sitio web se puede representar mediante un gráfico dirigido, en el que los vértices representan páginas web y los bordes dirigidos representan enlaces de una página a otra. Se puede adoptar un enfoque similar para los problemas en viajes, biología, diseño de chips de computadora y muchos otros campos. Por lo tanto, el desarrollo de algoritmos para manejar gráficos es de gran interés en informática. La transformación de gráficos a menudo se formaliza y se representa mediante sistemas de reescritura de gráficos. Complementarios a los sistemas de transformación de gráficos que se centran en la manipulación de gráficos en memoria basada en reglas, hay bases de datos de gráficos orientadas al almacenamiento y consulta persistentes y seguros de transacciones de datos estructurados con gráficos.
4. Algoritmo codicioso : es un algoritmo que sigue la heurística de resolución de problemas de hacer la elección óptima local en cada etapa con la esperanza de encontrar un óptimo global. En muchos problemas, una estrategia codiciosa en general no produce una solución óptima, pero, sin embargo, una heurística codiciosa puede producir soluciones óptimas a nivel local que se aproximan a una solución óptima global en un tiempo razonable.
Por ejemplo, una estrategia codiciosa para el problema del vendedor ambulante (que es de alta complejidad computacional) es la siguiente heurística: “En cada etapa, visite una ciudad no visitada más cercana a la ciudad actual”. Esta heurística no necesita encontrar la mejor solución, sino que termina en un número razonable de pasos; encontrar una solución óptima generalmente requiere irrazonablemente muchos pasos. En la optimización matemática, los algoritmos codiciosos resuelven problemas combinatorios que tienen las propiedades de los matroides.
5. Retroceso : es un algoritmo general para encontrar todas (o algunas) soluciones a algunos problemas computacionales, en particular los problemas de satisfacción de restricciones, que aumenta gradualmente los candidatos a las soluciones y abandona a cada candidato parcial c (“retrocesos”) tan pronto como determina que c no se puede completar con una solución válida.
El ejemplo clásico de libros de texto del uso del retroceso es el rompecabezas de las ocho reinas, que pide todos los arreglos de ocho reinas de ajedrez en un tablero de ajedrez estándar para que ninguna reina ataque a ningún otro. En el enfoque común de retroceso, los candidatos parciales son arreglos de k reinas en las primeras k filas del tablero, todas en diferentes filas y columnas. Cualquier solución parcial que contenga dos reinas que se ataquen mutuamente puede ser abandonada.
El retroceso se puede aplicar solo para problemas que admiten el concepto de una “solución candidata parcial” y una prueba relativamente rápida de si posiblemente se puede completar con una solución válida. Es inútil, por ejemplo, para localizar un valor dado en una tabla desordenada. Sin embargo, cuando es aplicable, el retroceso es a menudo mucho más rápido que la enumeración de la fuerza bruta de todos los candidatos completos, ya que puede eliminar una gran cantidad de candidatos con una sola prueba.