Diseño y análisis de algoritmos: Capítulo 3 Recursión y división y conquista

La idea de diseño del método de
divide y vencerás divide un gran problema que es difícil de resolver directamente en algunos subproblemas de menor escala, de modo que cada uno puede desglosarse, dividirse y regirse. En términos más generales, el problema original a resolver se divide en k subproblemas a menor escala, y estos k subproblemas se resuelven por separado. Si la escala del subproblema aún no es lo suficientemente pequeña, divida cada subproblema en k subproblemas más pequeños y descomponga de esta manera hasta que la escala del problema sea lo suficientemente pequeña como para encontrar fácilmente su solución, y luego resuelva el subproblema Combinado en una solución a un problema mayor, la solución al problema original se encuentra gradualmente de abajo hacia arriba.
Reglas heurísticas:
1. Subproblemas de equilibrio : es mejor hacer que los subproblemas tengan aproximadamente el mismo tamaño. Es decir, dividir un problema en k subproblemas de igual tamaño (generalmente k = 2). Este enfoque de hacer subproblemas aproximadamente iguales se deriva de la idea de un equilibrio (subproblema), que casi siempre es mejor que los subproblemas. La práctica de la escala desigual es mejor.
2. Subproblemas independientes : cada subproblema es independiente el uno del otro, lo que implica la eficiencia del método de divide y vencerás. Si cada subproblema no es independiente, el método de dividir y vencer necesita resolver repetidamente subproblemas comunes.
El proceso de solución de divide y vencerás

  1. División : como se trata de dividir y conquistar, por supuesto, el problema original de tamaño n debe dividirse en k subproblemas más pequeños, y tratar de hacer que estos k subproblemas tengan aproximadamente el mismo tamaño.
  2. Solución de subproblemas : la solución de cada subproblema suele ser la misma que la del problema original. Se pueden utilizar métodos recursivos para resolver cada subproblema y, a veces, el procesamiento recursivo también se puede lograr con un bucle.
  3. Fusión : se fusionan las soluciones de los diversos subproblemas. El costo de la fusión varía mucho según la situación. La efectividad del algoritmo de divide y vencerás depende en gran medida de la implementación de la fusión.

No todos los métodos de divide y vencerás son más efectivos que los simples métodos de fuerza bruta.

Recursiva
recursiva Hay dos elementos básicos :
condiciones de contorno : la recursividad para determinar cuándo terminar;
modo recursivo : La gran pregunta es cómo romper en un pequeño problema.

El subsegmento máximo y el problema
reciben una secuencia de n enteros (a1, a2, ..., an). El subsegmento máximo y el problema encuentran el valor máximo de la secuencia. Cuando todos los enteros en la secuencia son enteros negativos, el subsegmento máximo La suma del segmento es 0. Por ejemplo, la suma de los subsegmentos más grandes de la secuencia (-20, 11, -4, 13, -5, -2) es: 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; 
}                                                

La complejidad temporal del algoritmo es O (nlog2n)

48 artículos originales publicados · Me gusta 25 · Visita 2453

Supongo que te gusta

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