Projeto e Análise de Algoritmos - Capítulo 3 - Recursão, Divisão e Conquista

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

  1. 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.
  2. 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.
  3. 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)

Publicado 48 artigos originais · Gosto 25 · Visita 2453

Acho que você gosta

Origin blog.csdn.net/qq_43628959/article/details/105500426
Recomendado
Clasificación