Divide y vencerás, programación dinámica y codicioso sentimiento algoritmo iterativo

Divide y vencerás, programación dinámica, algoritmos codiciosos fueron similares entre los tres, por ejemplo, la necesidad de dividir un problema en sub-problemas, y, finalmente, para resolver el problema por abordar estos problemas parciales. Pero, de hecho, la diferencia entre los tres es aún muy grande.

 

1. Divide y vencerás

    partición Método (divide y vencerás): problema original en escala n más pequeño similar a la estructura de los subproblemas problema original; resolver de forma recursiva subproblemas, luego recombinados como resultado, para obtener una solución del problema original .

   modelo de partición tiene tres pasos en cada recursión capa:

  • Descomposición (Dividir): problema original se descompone en una serie de sub-problemas;

  • Resolver (conquista): solución de varios sub-problemas de forma recursiva. Si el niño es lo suficientemente pequeño problema, el solucionador directo;

  • Merge (Combine): Los resultados de sub-problemas combinados en solución del problema original.

 

   Merge sort (ordenamiento por mezcla) es un ejemplo típico del método de partición. Manejo intuitivo correspondiente sigue:

  • Descomposición: los n elementos se divide en subsecuencias n / 2 elementos que comprenden cada uno;

  • Solución: El tipo combinado de dos subsecuencias de forma recursiva de clasificación;

  • Merge: combinación de dos secuencias ordenadas para obtener el resultado de clasificación.

 

2. Programación Dinámica

   el diseño de algoritmos de programación dinámica se puede dividir en los siguientes cuatro pasos:

  • Soluciones Óptimas describen estructura

  • definición recursiva del valor de la solución óptima

  • Por abajo hacia arriba cálculo de la solución óptima por valor

  • Una solución óptima calculada por la configuración de los resultados

     Divide y vencerás medios para dividir el problema en una serie de sub-problemas independientes de forma recursiva para resolver cada subproblema solución del problema y la solución de los problemas de originales sub-fusionaron para obtener. En contraste, la programación adecuada para dinámico la independiente niño y caso la superposición , es decir, las sub-sub-sub-problemas incluyen un problema común. En este caso, si un gobierno sub-regla va a hacer una gran cantidad de trabajo innecesario, es decir, la solución repetidamente el problema común de niño. algoritmo de programación dinámica para resolver un problema sólo para cada sub-sub, el resultado se almacena en una tabla para evitar volver a calcular cada encuentro cada sub-pregunta de respuesta.

   Dos elementos del problema de optimización para el método de programación dinámica de: subestructura óptima y la superposición de sub-problemas. 

   subestructura óptima: si una solución óptima contiene solución sub-óptima del problema, el problema con subestructura óptima.

       La superposición de sub-problemas: para la optimización dinámica solucionador de problemas debe tener un segundo elemento es el espacio sub-problemas a ser pequeñas, que se utiliza para resolver el problema original de la solución de sub-clase algoritmo recursivo del mismo problema repetidamente en lugar de los de generación total nuevas sub-problemas. Dos sub-problemas, si son realmente los mismos sub-problemas, pero los problemas surgen cuando los niños de diferentes temas, entonces ellos se superponen.

    "Divide y vencerás: Programación cada sub-Independiente dinámica: cada solapamiento sub-tema"

https://my.oschina.net/feistel/blog/1633592

     Introducción a los algoritmos:  programación dinámica requiere que sus sub-problemas , no sólo para ser independientes, sino también la superposición , que parece un poco extraño. Si bien estos dos requisitos pueden parecer contradictorios, pero describir dos conceptos diferentes, en lugar de las dos caras de un mismo problema. Si usted no comparte recursos con dos sub-problemas es un problema, entonces ellos son independientes. Ambos dijeron dos sub-problemas, si son realmente los mismos sub-problemas, pero los problemas surgen como diferentes sub-problemas, se superponen, que se superponen.

El algoritmo final es un algoritmo recursivo para resolver un gran problema con un ejemplo más pequeña del mismo problema de uno o más. Con el fin de lograr algoritmo recursivo en lenguaje C, a menudo utilizando la función recursiva, esa función puede llamarse a sí misma. Las características básicas del procedimiento recursivo: se llama a sí mismo (el valor del parámetro es menor), con la condición de terminación, el resultado pueden calcularse directamente.

      Al utilizar un procedimiento recursivo, debemos tener en cuenta un entorno de programación debe ser capaz de mantener su tamaño y nivel de recursividad es proporcional a la pila de empujar hacia abajo. Para los grandes problemas, este espacio de pila requerido puede interferir con la forma en que usamos la recursividad.

     Modelo es una división recursiva y la conquista, las características más esenciales es: poner un problema en sub-problemas independientes. Si el niño no es independiente del problema, el problema será más compleja, la razón principal es que incluso el más simple y directa algoritmo recursivo para lograr esto, se pueden requerir un tiempo inimaginable, utilizando técnicas de programación dinámica puede evitar este defecto.

     Por ejemplo, secuencia de números Fibonacci recursiva escritura para lograr los siguientes:

    F usted (i)

    {

             si (i <1) return 0;

             si (i == 1) volver 1;

              retorno F (i-1) + F (i - 2);

    }

    Nunca utilice un programa de este tipo, ya que su eficacia es muy baja, necesitamos tiempo exponencial. Por el contrario, si el calculado primero antes de los números N de Fibonacci, y los almacena en una matriz, se puede utilizar un tiempo lineal (proporcional a N) se calcula F.

      F [0] = 0; F [1] = 1;

      for (i = 2; i <= N; i ++)

            F [i] = F [i-1] + F [i-2];

     Esta tecnología nos da una solución numérica de cualquier forma rápida de obtener una relación recursiva, en el ejemplo de los números de Fibonacci hecho, incluso podemos renunciar a la matriz, es necesario guardar sólo los dos primeros valores.

     De la discusión anterior se puede concluir que: podemos calcular el valor de todas las funciones en el orden de salida desde el valor más pequeño de encontrar cualquier función similar en cada paso usando valor previamente han calculado para calcular el valor actual, llamamos a esto término técnico para la programación dinámica de abajo hacia arriba. Mientras hay valores de espacio de almacenamiento se han calculado, esta tecnología se puede aplicar a cualquiera de los cálculo recursivo, el algoritmo mejorado será capaz de ejecutar desde el momento de la lineal exponencial tiempo de actividad.

    De arriba hacia abajo programación dinámica es aún una tecnología más simple, lo que nos permite realizar una función de costos con dinámica de abajo hacia arriba la programación de la misma (o menos), pero su cálculo es automático. Nos damos cuenta de que el procedimiento recursivo para almacenar cada valor calculado (ya que es el último paso en), y comprobando el valor almacenado para evitar cualquier re-calcular su término (como primer paso). Este método también se conoce a veces como un memorando de ley.

                       Fibonacci (programación dinámica)

Mediante el almacenamiento de los valores calculados de la matriz fuera del proceso recursivo, específicamente para evitar el doble recuento. Este programa calcula un tiempo proporcional a N.

                  F usted (i)

                  {

                          si (knownF [i]! = desconocido)

                                 retorno knownF [i];

                          si (i == 0) t = 0;

                          si (i == 1) t = 1;

                          si (i> 1) t = F (i - 1) + F (i - 2);

                          retorno knownF [i] = t;

                  }

       Propiedades: programación dinámica reduce el tiempo de ejecución de una función recursiva , es decir, reducen la computacional todo menos de o igual a una llamada recursiva al tiempo requerido parámetro dado, en el que el tiempo de procesamiento es constante llamada recursiva.

       No necesitamos estar limitada al caso de una sola iteración parámetros que determinan parámetros. Cuando hay una función de una pluralidad de parámetros de conformación, es posible almacenar soluciones subproblema más pequeños en una matriz multi-dimensional, un parámetro correspondiente a la matriz unidimensional. Otras circunstancias que no implican la formación de parámetros en el uso de la formulación abstracta problema discreto, que nos permite romper el problema en un pequeño problema.

      En la programación dinámica de arriba hacia abajo, almacenamos valores conocidos; en la programación dinámica de abajo hacia arriba, que pre-calcular estos valores. Muchas veces elegimos arriba hacia abajo programación dinámica de abajo hacia arriba sin necesidad de programación dinámica seleccionada por las siguientes razones:

     1 programación dinámica de arriba hacia abajo es una transformación natural de la resolución de problemas mecánicos.

     Calcular sub-secuencia 2 puede manejar el problema por sí mismo.

     3 posibles soluciones que necesitan para el cálculo de todos los sub-temas.

     No podemos ignorar el punto crucial es que, cuando el número de posibles valores de la función que necesitamos es demasiado grande como para almacenar (de arriba hacia abajo) o pre-calculada (de abajo arriba) todos los valores, la programación dinámica se convierte ineficiente. Dado que la tecnología básica es de hecho una programación dinámica de arriba hacia abajo para desarrollar algoritmo recursivo eficiente implementado , estos algoritmos deben ser incluidos en cualquier kit requerido en el algoritmo de diseño e implementación.

3. algoritmo codicioso

    Para muchos problemas de optimización, el método de programación dinámica para determinar la mejor opción para un poco de "exceso", siempre y cuando el uso de otro algoritmo más simple y eficaz en la línea. algoritmo voraz es seleccionar la corriente se hacen mejor apariencia, es deseable producir una solución óptima global mediante una selección óptima local. Para la mayoría algoritmo voraz para problemas de optimización pueden producir la solución óptima, pero no necesariamente siempre el caso.

    Basta con contemplar una selección codiciosos algoritmo (es decir, la elección codiciosos); codicioso cuando la toma de decisiones, uno de los sub-problemas deben estar vacíos, lo que deja sólo una pregunta no inactivo.

    algoritmos codiciosos y programación dinámica y una gran cantidad de similitudes. En particular, el problema es también aplicable algoritmo codicioso óptima subestructura. algoritmos codiciosos y programación dinámica que hay una diferencia significativa es el algoritmo voraz se basa en un enfoque de arriba hacia abajo de la utilización óptima subestructura. algoritmo voraz haría primera opción, al parecer, el tiempo para ser la mejor opción, y luego de resolver el problema de una fruta, no es el primer hijo para encontrar la solución óptima del problema, y ​​luego tomar decisiones.

        algoritmo voraz se le da a una pregunta por hacer una serie de selecto solución óptima. Para cada punto de decisión en el algoritmo, hacer un momento parece ser la mejor opción. Esto es diferente del algoritmo voraz de programación dinámica. En la programación dinámica, cada paso debe tomar decisiones, pero estas opciones dependerá de la solución sub-problema. Por lo tanto, la solución es por lo general un problema de programación dinámica desde la parte inferior hacia arriba, trato con el problema problema Tai sub-niño. algoritmo voraz hecho a la selección actual puede depender de todas las opciones que se han hecho, pero no tiene que depender de la selección realizada o sub-problemas soluciones. Por lo tanto, el algoritmo codicioso es generalmente de arriba hacia abajo para hacer la elección codiciosos, constantemente dada instancia del problema va sobre cuestiones de menor importancia. Resultados en sub-problemas algoritmo voraz, por lo general sólo hay un no vacíos sub-problemas.

https://juejin.im/post/5d859087f265da03bd055832

Original: http: //hxrs.iteye.com/blog/1055478

Publicados 101 artículos originales · ganado elogios 73 · vistas 120 000 +

Supongo que te gusta

Origin blog.csdn.net/usstmiracle/article/details/104769710
Recomendado
Clasificación