Академический Документы
Профессиональный Документы
Культура Документы
1. Mtodo general.
2. Anlisis de tiempos de ejecucin.
2.1. Anlisis general.
2.2. Caso recursivo.
3. Ejemplos.
3.1. Bsqueda del mximo y el mnimo.
3.2. Ordenacin por mezcla y ordenacin
rpida.
3.3. El problema de seleccin.
3.4. Multiplicacin rpida de enteros largos.
3.5. Multiplicacin rpida de matrices.
1
Mtodo general
La tcnica divide y vencers consiste en descomponer el problema en
un conjunto de subproblemas ms pequeos. Despus se resuelven
estos subproblemas y se combinan las soluciones para obtener la
solucin para el problema original.
Esquema general:
divide_venceras (p: problema)
dividir (p, p1, p2, ..., pk)
para i = 1, 2, ..., k
si = resolver (pi)
solucion = combinar (s1, s2, ..., sk)
Puede ser recursivo siendo resolver una nueva llamada a
divide_venceras
Si el problema es pequeo, entonces se puede resolver de forma directa.
Ejemplo: Torres de Hanoi
2
Mtodo general
Para que pueda aplicarse la tcnica divide y vencers
necesitamos:
El problema original debe poder dividirse fcilmente en un
conjunto de subproblemas, del mismo tipo que el problema
original pero con una resolucin ms sencilla (menos costosa).
La solucin de un subproblema debe obtenerse
independientemente de los otros.
Normalmente los subproblemas deben ser de tamaos
parecidos. Como mnimo necesitamos que haya dos
subproblemas. Si slo tenemos un subproblema hablamos de
tcnicas de reduccin (o simplificacin).
Necesitamos un mtodo (ms o menos directo) de resolver
los problemas de tamao pequeo.
Es necesario tener un mtodo de combinar los resultados de
los subproblemas.
3
Desarrollando tenemos:
Suponiendo que n es potencia de 2, n = 2k, y n0 = n/2m.
m 1
t (n) 2 m g (n / 2 m ) (2 i f (n / 2i ))
i 0
k 1
i 0
i 0
k 1
i 0
i 0
k 1
k 1
t (n) n g(1) (2 f (2 )) n c (2 d 2 ) n c d 2
i
i 0
k i
i 0
k i
i 0
Peor caso
2(n - 1) O(n)
n + 1 O(n)
2 + 2ln n O(log n)
9
10
12
Ordenacin rpida
QuickSort (i, j: integer)
/* Es pequeo si el tamao es menor que un caso base */
si pequeo(i, j)
OrdenacinDirecta(i, j)
en otro caso
/* El array (i..j) es dividido usando un procedimiento Pivote,
que devuelve un entero l entre (i, j), tal que A[ia] A[l] A[ja],
para ia = i..l-1, ja=l+1..j */
Pivote(i,j,l)
/* Resolver recursivamente los subproblemas, sin incluir el
pivote */
QuickSort(i, l-1)
QuickSort(l+1, j)
/* No es necesario combinar */
Aunque no hay coste de combinar los resultados, la llamada a
Pivote tiene un coste O(n).
Las particiones no tienen porqu ser de tamao n/2.
14
Ordenacin rpida
Pivote (i, j: integer; var l: integer)
p = A[i]
k=i
l = j+1
repetir
k:= k+1
hasta (A[k] > p) o (k j)
repetir
l = l-1
hasta (A[l] p)
mientras k < l
intercambiar (k, l)
repetir
k = k+1
hasta (A[k] > p)
repetir
l = l-1
hasta (A[l] p)
Intercambiar (i, l)
15
Caso promedio.
Se puede comprobar que tp(n) (nlog n).
16
El problema de seleccin
Sea T[1..n] un array (no ordenado) de enteros, y sea s un
entero entre 1 y n. El problema de seleccin consiste en
encontrar el elemento que se encontrara en la posicin s si
el array estuviera ordenado.
Si s = n/2, entonces tenemos el problema de encontrar la
mediana de T, es decir el valor que es mayor que la mitad
de los elementos de T y menor que la otra mitad.
Forma sencilla de resolver el problema de seleccin:
Ordenar T y devolver el valor T[s]. Esto requerira (nlog n)
17
El problema de seleccin
u = w10S + x
v = y10S + z
n/2
n/2=S
21
A12
B11
B12
x
A21
A22
C11
C12
C21
C22
=
B21
B22