Programação Java: algoritmo de divisão e conquista

Introdução ao algoritmo de divisão e conquista

  1. Dividir para conquistar é um algoritmo muito importante. A explicação literal é "dividir e conquistar", ou seja, dividir um problema complexo em dois ou mais subproblemas idênticos ou semelhantes e, em seguida, dividir os subproblemas em subproblemas menores ... até que os subproblemas finais possam ser resolvidos de forma simples e direta , A solução do problema original é a combinação das soluções dos subproblemas. Esta técnica é a base de muitos algoritmos eficientes, como algoritmos de classificação (classificação rápida, classificação por mesclagem), transformada de Fourier (transformada rápida de Fourier) ...
  2. Alguns problemas clássicos que podem ser resolvidos pelo algoritmo de divisão e conquista
    ① Pesquisa binária
    ② Multiplicação de números inteiros grandes
    ③ Cobertura
    quadriculada ④ Classificação de mesclagem
    ⑤ Classificação rápida ⑤
    Seleção de tempo linear
    ⑦ Problema de par de pontos mais próximos
    ⑧ Cronograma de rodízio
    ⑨ Torre de Hanói

Etapas básicas do algoritmo de divisão e conquista

O método de divisão para conquistar tem três etapas em cada nível de recursão:

  1. Decomposição: Decompor o problema original em vários subproblemas menores e independentes da mesma forma que o problema original
  2. Resolva: se o subproblema for pequeno e fácil de resolver, resolva diretamente, caso contrário, resolva cada subproblema recursivamente
  3. Combine: Combine as soluções de cada subproblema na solução do problema original.

O padrão de design do algoritmo de dividir e conquistar (Dividir e Conquistar§) é o seguinte:

Insira a descrição da imagem aqui
Onde | P | representa a escala do problema P; n0 é um limite, o que significa que quando a escala do problema P não excede n0, o problema pode ser resolvido diretamente sem decomposição posterior. ADHOC§ é o sub-algoritmo básico do método de dividir para conquistar, usado para resolver diretamente problemas de pequena escala P. Portanto, quando a escala de P não ultrapassa n0, é resolvido diretamente pelo algoritmo ADHOC§. O algoritmo MERGE (y1, y2, ..., yk) é o sub-algoritmo de mesclagem no método de divisão e conquista, usado para mesclar as soluções correspondentes y1, y2, ..., yk dos subproblemas P1, P2, ..., Pk em P Solução.

Melhor prática de divisão e conquista do algoritmo Torre de Hanói

A lenda da Torre de Hanói

Torre de Hanói: A Torre de Hanói (também conhecida como Torre de Hanói) é um brinquedo educacional derivado de uma antiga lenda indiana. Quando o Brahma criou o mundo, ele fez três pilares de diamante Em um pilar, 64 discos de ouro foram empilhados em ordem de tamanho de baixo para cima. O Grande Brahma ordenou que o Brahmin recolocasse o disco em outro pilar em ordem de tamanho, de baixo para cima. Também é estipulado que o disco não pode ser ampliado no disco pequeno, e apenas um disco pode ser movido entre os três pilares de cada vez.
Se uma vez a cada segundo, quanto tempo leva? Leva mais de 584,554 bilhões de anos para mover essas peças de ouro, e a expectativa de vida do sistema solar é de dezenas de bilhões de anos. Depois de 584,554 bilhões de anos, toda a vida na Terra, incluindo os pagodes e templos do Vaticano, há muito desapareceu.

Demonstração e análise do jogo Torre de Hanói:

  1. Se houver um disco, A-> C
  2. Se tivermos n> = 2, podemos sempre considerá- lo como dois discos 1. O disco inferior 2. O disco superior
    ① Primeiro coloque o disco superior A-> B
    ② Coloque o disco inferior A-> C
    ③ Mude todos os discos da Torre B de B-> C

Código

package dac;

public class Hanoitower {
    
    
    public static void main(String[] args) {
    
    
        hanoiTower(5,'A','B','C');
    }

    // 汉诺塔移动方案——分治算法
    public static void hanoiTower(int num, char a, char b, char c) {
    
    
        // 如果只有一个盘,直接从a移动到c
        if (num == 1) {
    
    
            System.out.println("第1个盘从 " + a + "->" + c);
        } else {
    
    
            // 如果我们有n>=2情况,我们总是可以看做是两个盘 1)最下边的一个盘 2)上面的盘
            // 1. 先把最上面的盘A->B,中间的移动过程会使用到c塔
            hanoiTower(num - 1, a, c, b);
            // 2. 把最下面的盘A->C
            System.out.println("第" + num + "个盘从 " + a + "->" + c);
            // 3. 把B塔所有的盘从B->C,中间的移动过程使用到a塔
            hanoiTower(num - 1, b, a, c);
        }
    }
}

Acho que você gosta

Origin blog.csdn.net/KaiSarH/article/details/109064937
Recomendado
Clasificación