A idéia de design do método de dividir e conquistar
divide um grande problema que é difícil de resolver diretamente em alguns subproblemas de menor escala, para que cada um possa ser dividido, dividido e governado. De maneira mais geral, o problema original a ser resolvido é dividido em k subproblemas em menor escala e esses k subproblemas são resolvidos separadamente. Se a escala do subproblema ainda não for pequena o suficiente, divida cada subproblema em k subproblemas menores e decomponha-se dessa maneira até que a escala do problema seja pequena o suficiente para encontrar facilmente sua solução e resolva o subproblema Combinada em uma solução para um problema maior, a solução para o problema original é encontrada gradualmente de baixo para cima.
Regras heurísticas:
1. Equilibre os subproblemas : é melhor criar os subproblemas do mesmo tamanho. Isso é dividir um problema em k subproblemas de tamanho igual (geralmente k = 2) .Esta abordagem de tornar os subproblemas aproximadamente iguais é derivada da idéia de um balanceamento (subproblema), quase sempre melhor do que os subproblemas. A prática de escala desigual é melhor.
2. Subproblemas independentes : cada subproblema é independente um do outro, o que envolve a eficiência do método de dividir e conquistar Se cada subproblema não é independente, o método de dividir e conquistar precisa resolver repetidamente subproblemas comuns.
O processo de solução de dividir e conquistar
- Divisão : Como é uma divisão e conquista, é claro, o problema original do tamanho n precisa ser dividido em k sub-problemas menores, e tente fazer com que esses k sub-problemas sejam aproximadamente do mesmo tamanho.
- Solução de subproblemas : A solução de cada subproblema é geralmente a mesma que a do problema original. Métodos recursivos podem ser usados para resolver cada subproblema e, algumas vezes, o processamento recursivo também pode ser alcançado com um loop.
- Fusão : as soluções dos vários subproblemas são mescladas.O custo da fusão varia muito dependendo da situação.A eficácia do algoritmo de divisão e conquista depende em grande parte da implementação da fusão.
Nem todos os métodos de divisão e conquista são mais eficazes que os métodos simples de força bruta.
Recursiva
recursiva Há dois elementos básicos :
⑴ condições de contorno : recursão para determinar quando terminar;
⑵ modo recursivo : A grande questão é como invadir um pequeno problema.
O sub-segmento máximo e o problema
recebem uma sequência de n números inteiros (a1, a2,…, an) O sub-segmento máximo e o problema encontram o valor máximo da sequência.Quando todos os números inteiros na sequência são números inteiros negativos, o sub-segmento máximo A soma do segmento é 0. Por exemplo, a soma dos maiores subsegmentos da sequência (-20, 11, -4, 13, -5, -2) é: 20
int MaxSum(int a[ ], int left, int right)
{
sum=0;
if (left= =right)
{
if (a[left]>0) sum=a[left];
else sum=0;
}
else
{
center=(left+right)/2;
leftsum=MaxSum(a, left, center);
rightsum=MaxSum(a, center+1, right);
s1=0;
lefts=0;
for (i=center; i>=left; i--)
{
lefts+=a[i];
if (lefts>s1) s1=lefts;
}
s2=0;
rights=0;
for (j=center+1; j<=right; j++)
{
rights+=a[j];
if (rights>s2) s2=rights;
}
sum=s1+s2;
if (sum<leftsum) sum=leftsum;
if (sum<rightsum) sum=rightsum;
}
return sum;
}
A complexidade de tempo do algoritmo é O (nlog2n)