Dividir para conquistar, programação dinâmica e sentimento algoritmo iterativo ganancioso

Dividir para conquistar, programação dinâmica, algoritmos ávidos foram semelhantes entre os três, por exemplo, necessidade de dividir um problema em sub-problemas, e em seguida, finalmente, para resolver o problema por abordar estas sub-problemas. Mas, na verdade a diferença entre os três ainda é bastante grande.

 

1. dividir para conquistar

    Método partição (dividir para conquistar): problema original em escala n menor semelhante à estrutura das sub-problemas problema original; recursivamente resolver subproblems, então recombinadas como resultado, a obtenção de uma solução do problema original .

   modelo de partição tem três etapas em cada recursão camada:

  • Decomposição (Dividir): problema original é decomposto em uma série de sub-problemas;

  • Resolver (conquista): solução de vários sub-problemas recursivamente. Se a criança é problema pequeno o suficiente, o solver direta;

  • Fundir (Combinar): Os resultados de sub-problemas combinados em solução do problema original.

 

   Fundir tipo (tipo intercalação) é um exemplo típico do método de partição. Operação intuitiva correspondente segue:

  • Decomposição: Os elementos n é dividido em subsequências n / 2 elementos cada uma compreendendo;

  • Solução: O tipo combinado de duas subsequências recursivamente de triagem;

  • Mesclar: mesclar duas seqüências classificadas para obter o resultado ranking.

 

2. Programação Dinâmica

   projeto de algoritmos de programação dinâmica pode ser dividido em quatro etapas seguintes:

  • Soluções óptimas estrutura descrita

  • recursiva definição do valor da solução óptima

  • Por de baixo para cima o cálculo da solução óptima em termos de valor

  • Uma solução óptima calculada pela configuração dos resultados

     Dividir para conquistar meios para dividir o problema em um número de sub-problemas independentes recursivamente resolver cada uma das soluções de sub-problema do problema original e solução de problemas de sub-fundiram-se para se obter. Em contraste, a programação dinâmica adequada para a criança independente e caso sobreposição , isto é, as sub-sub-sub-problemas incluem um problema comum. Neste caso, se um governo sub-regra vai fazer um monte de trabalho desnecessário, ou seja, várias vezes resolver o problema comum de criança. algoritmo de programação dinâmica para resolver um problema só para cada sub-sub, o resultado é armazenado em uma tabela para evitar recalculando cada encontro cada resposta sub-questão.

   Dois elementos do problema de optimização para o método de programação dinâmico de: subestrutura óptima e sobrepostos sub-problemas. 

   subestrutura óptima: se uma solução óptima contém solução sub-óptima do problema, o problema com subestrutura óptima.

       Sobreposição de sub-problemas: para otimização dinâmica solucionador de problemas deve ter um segundo elemento é o espaço sub-problemas de ser pequeno, que é usado para resolver o problema original de solução sub-classe algoritmo recursivo do mesmo problema repetidamente ao invés de os geradores total de novos sub-problemas. Dois sub-problemas, se eles são realmente as mesmas sub-problemas, mas os problemas surgem como filhos de questões diferentes, então eles estão sobrepostos.

    "Divide and Conquer: cada programação sub-Independent Dinâmico: cada sobreposição sub-tema"

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

     Introdução aos Algoritmos:  programação dinâmica exige que seus sub-problemas não só para ser independente, mas também se sobrepõem , parece um pouco estranho. Enquanto estes dois requisitos pode parecer contraditório, mas eles descrevem dois conceitos diferentes, ao invés de dois lados do mesmo problema. Se você não compartilhar recursos com dois sub-problemas é um problema, então eles são independentes. Ambos disseram dois sub-problemas, se eles são realmente as mesmas sub-problemas, mas os problemas surgem como diferentes sub-problemas, sobreposição, que são sobrepostos.

O algoritmo final é um algoritmo recursivo para resolver um grande problema por um exemplo menor do mesmo problema um ou mais. Para atingir algoritmo recursivo em linguagem C, muitas vezes usando função recursiva, essa função pode chamar a si mesma. As características básicas do processo recursivo: ele chama a si mesmo (o valor do parâmetro é menor), com a condição de término, o resultado pode ser calculado diretamente.

      Quando utilizar um procedimento recursiva, é preciso considerar um ambiente de programação deve ser capaz de manter seu tamanho e profundidade de recursão é proporcional à pilha push-down. Para grandes problemas, este espaço de pilha necessário pode interferir com a forma como usamos a recursão.

     Modelo é uma divisão recursiva e conquistar, a maioria dos recursos essenciais é: colocar um problema em sub-problemas independentes. Se a criança não é independente do problema, o problema será mais complexo, a razão principal é que mesmo o mais simples e direta algoritmo recursivo para conseguir isso, ele pode exigir tempo inimaginável, utilizando técnicas de programação dinâmica pode evitar este defeito.

     Por exemplo, a sequência recursiva número de Fibonacci escritura para conseguir o seguinte:

    F-lo (você i)

    {

             if (i <1) return 0;

             if (i == 1) retornar 1;

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

    }

    Nunca use um programa desse tipo, porque a sua eficiência é muito baixa, precisamos de tempo exponencial. Em contraste, se o primeiro calculado antes dos números de Fibonacci N, e armazena-os em uma matriz, pode ser usado um tempo linear (proporcional a N) é calculado F.

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

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

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

     Esta tecnologia dá-nos uma solução numérica de qualquer maneira rápida de obter uma relação recursiva, no exemplo de números de Fibonacci ação, podemos até desistir da matriz, você precisa salvar apenas os dois primeiros valores.

     A partir da discussão acima, podemos concluir que: podemos calcular o valor de todas as funções na ordem a partir do menor valor para encontrar qualquer função semelhante em cada etapa usando o valor previamente calculado para calcular o valor atual, nós chamamos isso de termo técnico para a programação dinâmica de baixo para cima. Enquanto não há valores de espaço de armazenamento foram calculados, esta tecnologia pode ser aplicada a qualquer da computação recursiva, o algoritmo melhorado será capaz de correr a partir do momento ao linear exponencial uptime.

    Top-down programação dinâmica é ainda uma tecnologia mais simples, o que nos permite executar uma função de custo com dinâmica de baixo para cima a programação da mesma (ou menos), mas o seu cálculo é automático. Sabemos que procedimento recursivo para armazenar cada valor calculado (como é o último passo), e verificando o valor armazenado para evitar qualquer re-calcular a sua duração (como seu primeiro passo). Este método é também por vezes referido como um memorando de lei.

                       Fibonacci (programação dinâmica)

Ao armazenar os valores calculados na matriz fora do processo recursivo, especificamente para evitar a dupla contagem. Este programa calcula um tempo proporcional a N.

                  F-lo (você i)

                  {

                          if (knownF [i]! = desconhecido)

                                 retorno knownF [i];

                          if (i == 0) t = 0;

                          if (i == 1) t = 1;

                          se (i> 1) t = M (i - 1) + F (I - 2);

                          retorno knownF [i] = t;

                  }

       Propriedades: programação dinâmica reduz o tempo de execução de uma função recursiva , isto é, reduzir o computacional todos menos do que ou igual a uma chamada recursiva para o tempo necessário dado parâmetro, em que o tempo de processamento é chamada recursiva constante.

       Nós não precisa ser limitado ao caso de uma única parâmetros de iteração moldar parâmetros. Quando existe uma função de uma pluralidade de parâmetros de moldagem, é possível armazenar soluções subproblemas menores em uma matriz multi-dimensional, um parâmetro que corresponde à matriz unidimensional. Outras circunstâncias que não envolvam moldar parâmetros sobre o uso da formulação do problema discreto resumo, nos permite dividir o problema em um pequeno problema.

      Na programação dinâmica de cima para baixo, nós armazenamos valores conhecidos; na programação dinâmica de baixo para cima, nós pré-calcular esses valores. Nós muitas vezes escolhem top-down programação dinâmica de baixo para cima, sem programação dinâmica selecionada pelas seguintes razões:

     1 programação dinâmica top-down é uma transformação natural da resolução de problemas mecânicos.

     Calculando sub-sequência de 2 pode-se lidar com o problema.

     3 soluções possíveis precisamos calcular todos os sub-temas.

     Não podemos ignorar o ponto crucial é que, quando o número de valores possíveis da necessidade função que é muito grande para loja (top-down) ou pré-calculada (bottom-up), todos os valores, programação dinâmica torna-se ineficiente. Desde a tecnologia básica é de fato uma dinâmica de cima para baixo de programação para desenvolver eficiente algoritmo recursivo implementado , estes algoritmos devem ser incluídos em qualquer kit exigido no algoritmo de concepção e implementação.

3. algoritmo guloso

    Para muitos problemas de otimização, o método de programação dinâmica para determinar a melhor escolha para um pouco "um exagero", enquanto o uso de outro algoritmo mais simples e eficaz na linha. algoritmo guloso é selecionar o atual melhor aparência são feitas, é desejável para produzir uma solução óptima global, uma seleção ideal local. Para a maioria algoritmo guloso para problemas de otimização pode produzir a solução ideal, mas não necessariamente sempre o caso.

    Basta considerar uma seleção gananciosos algoritmo (ou seja, a escolha ganancioso); ganancioso quando fazer escolhas, uma das sub-problemas deve estar vazia, deixando apenas uma pergunta não-ocioso.

    algoritmos gulosos e programação dinâmica e uma série de semelhanças. Em particular, o problema também é aplicável algoritmo guloso ideal subestrutura. algoritmos gulosos e programação dinâmica, há uma diferença significativa é o algoritmo guloso é baseado em uma abordagem top-down de usar ideal subestrutura. algoritmo guloso faria primeira escolha, nesse momento parece ser a melhor escolha, em seguida, para resolver o problema de uma fruta, não é a primeira criança a encontrar a solução ideal do problema, e em seguida, fazer escolhas.

        algoritmo guloso é dada a uma pergunta, fazendo uma série de seleto solução ideal. Para cada ponto de decisão no algoritmo, fazer um tempo parece ser a melhor opção. Isso é diferente do algoritmo guloso de programação dinâmica. Na programação dinâmica, cada passo tem de fazer escolhas, mas essas escolhas dependem da solução sub-problema. Portanto, a solução é geralmente problema de programação dinâmica do-se inferior, lidar com o problema problema Tai sub-kid. algoritmo guloso feita na seleção atual pode depender de todas as opções que foram feitas, mas não precisa ser dependente das soluções seleção feita ou sub-problemas. Portanto, o algoritmo guloso é geralmente de cima para baixo para fazer a escolha ganancioso, constantemente dada instância do problema ir sobre questões menores. Os resultados em sub-problemas algoritmo mais, normalmente há apenas um não vazios sub-problemas.

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

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

Publicado 101 artigos originais · Louvor obteve 73 · vista 120 000 +

Acho que você gosta

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