Tema 3. Algoritmos Divide y Vencerás
Tema 3. Algoritmos Divide y Vencerás
Tema 3. Algoritmos Divide y Vencerás
3 5 8 10 13 14 29 34
3 5 8 10 13 14 29 34
Primera solución: Recorrer el vector hasta localizar el elemento o hasta el final O(n)
Búsqueda binaria.
3.2 Búsqueda binaria.
Dado un vector ordenado de números enteros, queremos conocer si un elemento x
está en él y queremos conocer su posición.
Encontrar un i tal que 0 ≤ i ≤ n que cumpla T[i] ≤ x < T[i+1], con el convenio implícito
de que T[0] = −∞ y T[n+1] =+∞.
3 5 8 10 13 14 29 34
Búsqueda binaria
• Dividir el problema en subproblemas: 2 en este caso.
• Quedarnos con una de las mitades: Si el elemento a buscar es menor que el
central, buscar en la primera mitad y, si no, en la segunda (reducción).
• Caso base: Tabla con un elemento.
3.2 Búsqueda binaria.
x=13
3 5 8 10 13 14 29 34
3 5 8 10 13 14 29 34
3 5 8 10 13 14 29 34
3 5 8 10 13 14 29 34
3.2 Búsqueda binaria.
algoritmo búsqueda binaria (ENT T:tabla[1..n] de elementos, x:elemento; SAL i:entero)
variables j: entero
principio {búsqueda binaria}
i 1; j n
mientras i<j hacer
k (i + j)/2
si x < T[k] entonces j k –1
sino si x = T[k] entonces i, j k
sino i k + 1
fin si
fin si
fin mientras
fin {búsqueda binaria}
Complejidad: O(log2 n)
3.2 Búsqueda binaria.
algoritmo búsqueda binaria 2 (ENT T:tabla[1..n] de elementos, i, j:1..n, x:elemento; SAL
posición:1..n)
{Busca x en el subvector T[i..j]. Se verifica que T[i] ≤ x < T[j + 1] y i ≤ j}
variables j: entero
principio {búsqueda binaria 2}
si i=j entonces posición i
si no
k (i + j + 1) div 2
si x < T[k] entonces búsqueda binaria 2 (T, i, k - 1, x, posición)
si no búsqueda binaria 2 (T, k, j, x, posición)
fin si
fin si
fin {búsqueda binaria 2}
Complejidad: O(log2 n)
3.3 Multiplicación de grandes enteros.
En algunas aplicaciones se necesita trabajar con enteros muy grandes y no es
recomendable representarlos en coma flotante ya que sólo se conservarían sus cifras
más representativas.
Representaremos los números mediante vectores
Hasta este momento, siempre hemos dicho que la suma y la multiplicación de dos
enteros eran operaciones elementales cuyo tiempo de ejecución estaba acotado por
una constante.
Los algoritmos de multiplicación clásicos utilizan un tiempo cuadrático O(n2).
3.3 Multiplicación de grandes enteros.
Vamos ahora a utilizar divide y vencerás:
Dividimos cada número en dos mitades:
X = a10n/2 + b Y = c10n/2 + d
Entonces: X.Y = ac10n + (ad + bc)10n/2 + bd
Para calcular X.Y tendremos que calcular ac, ad+bc y bd, para lo que sólamente
serán necesarios tres productos: v = ac, u = (a + b)(c + d) y w = bd puesto que
ad + bc = u − v − w.
7 5 8 10 2 14 3 4
5 7 8 10 2 3 4 14
Se utiliza un algoritmo de mezcla para obtener una única tabla a partir de las dos
ordenadas.
2 3 4 5 7 8 10 14
7 5 8 10 2 14 3 4
7 5 4 10 2 14 3 8
3.6 Ordenación rápida de Hoare (quicksort).
7 5 4 3 2 14 10 8
7 5 4 3 2 14 10 8
2 5 4 3 7 14 10 8