Bloque 2: Divide y Vencer - PowerPoint PPT Presentation

1 / 19
About This Presentation
Title:

Bloque 2: Divide y Vencer

Description:

Ejemplos del modo de confeccionar algoritmos DyV ... de enteros largos, consistente en dividir las matrices en submatrices y realizar ... – PowerPoint PPT presentation

Number of Views:121
Avg rating:3.0/5.0
Slides: 20
Provided by: fdi7
Category:

less

Transcript and Presenter's Notes

Title: Bloque 2: Divide y Vencer


1
Bloque 2 Divide y Vencerás
  • Unidad 2 Aplicaciones

2
Aplicaciones típicas DyV
  • Aplicaciones típicas
  • Multiplicación entera y matricial
  • Búsqueda y ordenación
  • Selección y determinación de la media
  • Exponenciación
  • Las aplicaciones típicas son importantes porque
    pueden utilizarse como
  • Ejemplos del modo de confeccionar algoritmos DyV
  • Bloques constructores de algoritmos específicos

3
Multiplicación de enteros largos
  • El algoritmo clásico de multiplicación es O(n2)
  • Es posible aplicar la técnica divide y vencerás a
    este problema, conforme a la siguiente
    estrategia
  • Sean 2 números, a y b, de tamaño n
  • Descompongamos los números a y b en 2 números de
    longitud n/2
  • El producto es

4
Multiplicación de enteros largos
  • Si n es par, las ecuaciones anteriores se
    simplifican
  • Cuatro multiplicaciones de números con tamaño n/2
    es similar a una multiplicación de números de
    tamaño n. No obstante, considerando

5
Multiplicación de enteros largos
  • Se obtiene que
  • Esta estrategia permite reducir de 4 a 3
    multiplicaciones, de números de longitud n/2, a
    costa de aumentar el número de sumas y
    desplazamientos (multiplicación por potencias de
    10)
  • La complejidad de este algoritmo es ?(nlog 3),
    aunque sólo es eficiente para n grandes, debido a
    la existencia de constantes ocultas con un valor
    elevado

6
Multiplicación de matrices
  • Consiste multiplicar dos matrices cuadradas A, B
    de tamaños n x n, en un orden inferior a O(n3)
  • Es una variación del problema de la
    multiplicación de enteros largos, consistente en
    dividir las matrices en submatrices y realizar
    los productos parciales
  • En su formulación más evidente, es necesario
    resolver 8 subproblemas de tamaño n/2, siendo
    interesante la estrategia DyV únicamente cuando
    se resuelven 7 o menos subproblemas

x

7
Multiplicación de matrices
  • La solución consiste en
  • P (A11A22)(B11B22)
  • Q (A12A22) B11 C11 P S - T U
  • R A11 (B12-B22) C12 R T
  • S A22(B21-B11) C21 Q S
  • T (A11A12)B22 C22 P R - Q U
  • U (A21-A11)(B11B12)
  • V (A12-A22)(B21B22)
  • Este algoritmo posee un O(nlog7) ? O(n2.81). Al
    igual que para el caso de la multiplicación de
    enteros, las constantes ocultas son muy altas y
    el algoritmo es útil solo para valores de n
    grandes

8
Búsqueda
  • La búsqueda binaria probablemente el algoritmo
    DyV más conocido, con O(log n)
  • Dado que se trata realmente de un algoritmo de
    simplificación, en lugar de DyV, puede
    programarse fácilmente de forma iterativa, la
    cual es su implementación más frecuente

FUNCTION busquedaBinaria(T1..n, x)1..n
BEGIN i 1 j n repeat m(ij)
div 2 if Tm gt x then j m-1 else i m1
until igtj or Tmx busquedaBinaria
m END
9
Ordenación
  • Dos algoritmos de ordenación bien conocidos son
    DyV
  • Mergesort
  • Quicksort
  • Para ordenar mediante mergesort (ordenación por
    mezcla) los elementos de un array de tamaño n se
  • Divide el array original es dividido en dos
    trozos de tamaño igual (o lo más parecido
    posible), es decir ?n/2? y ?n/2?.
  • Resuelven recursivamente los subproblemas
  • Llega al caso base cuando se obtiene un subarray
    de un solo elemento (versión pura) o cuando se
    obtiene un subarray de tamaño reducido (versión
    con umbral)
  • Combinan los dos subarrays (lo cual se puede
    realizar en O(n))
  • Se obtiene una función de complejidad O(n log n),
    frente al O(n2) típico de los algoritmos no DyV
    de ordenación

10
Ordenación
PROCEDURE mergeSort (VAR T1..n) BEGIN se
podría evitar la utilización de un algoritmo
básico if T es pequeño then
OrdenaciónDirecta(T1..n) else begin
s n div 2 mergeSort(T1..s)
mergeSort(Ts1..n) merge(T1..n,
T1..s, Ts1..n) end END
11
Ordenación
  • Para ordenar mediante quicksort los elementos de
    un array de tamaño n se
  • Divide el array utilizando un procedimiento
    Pivote, que devuelve un entero l tal que Ak ?
    Al ? Am, para k 1..l-1, ml1..n
  • Resuelven recursivamente los subproblemas
  • Llega al caso base cuando se obtiene un subarray
    de un solo elemento (versión pura) o cuando se
    obtiene un subarray de tamaño reducido (versión
    con umbral)
  • No es necesario combinar los subarrays

12
Ordenación
PROCEDURE quickSort (VAR T1..n) BEGIN
Puede no utilizarse un algoritmo básico if
n es pequeño then OrdenaciónDirecta(T1..n)
else begin pivote(T1..n, l)
quickSort(T1..l-1) quickSort(Tl1..n)
end END
13
Ordenación
PROCEDURE pivote(Ti..j var l integer) en l
se devuelve la posición del pivote BEGIN
p Ti k i l j1 repeat k k1
until (Tk gt p) or (k ? j) repeat l l-1
until (Tl ? p) while k lt l do
begin intercambiar (Tk, Tl) repeat k k1
until (Tk gt p) repeat l l-1 until (Tl ?
p) end Intercambiar (Ti, Tl) END
14
Ordenación
  • Quicksort posee una función de complejidad O(n
    log n) en el caso medio
  • No obstante, en el caso peor la complejidad de
    quicksort es O(n2)
  • Ocurre, dada la función pivote, vista
    anteriormente, cuando el array está ordenado de
    modo decreciente o todos los elementos son
    iguales
  • La clave para conseguir un algoritmo O(n log n)
    es seleccionar adecuadamente la mediana (ver a
    continuación)
  • Aun así, si todos los elementos del array son
    iguales, el comportamiento del algoritmo sigue
    siendo O(n2)
  • Se soluciona utilizando un pivote modificado
    pivoteBis(Ti..j media, var k, l integer)

3.3.5. El problema de selección.
15
Selección
  • Se denomina Problema de Selección a
  • Dado un array T1..n y
  • Un entero s tal que 1lt s lt n
  • Identificar el elemento que, una vez ordenado T
    de modo no decreciente, ocuparía la posición
    s-ésima
  • Solucionar el problema de selección es sencillo
    en O(n log n)
  • Basta ordenar el array T y acceder a la s-ésima
    posición
  • No obstante, puede realizarse en O(n), habida
    cuenta de que exista un procedimiento eficiente
    para calcular la media de un conjunto de datos
  • De hecho, el problema de selección es equivalente
    al cálculo de la mediana, mínimo y máximo

16
Selección
  • Suponiendo la existencia de una función mediana,
    el problema se resolvería siguiendo los pasos
  • Identificar la mediana del array
  • Utilizando un procedimiento como pivoteBis,
    reordenar el array
  • Si 1 lt s lt k, repetir con el subarray T1..k-1
  • Si k lt s lt l, se ha terminado
  • Si l lt s lt n, repetir con el subarray Tl1..n,
    buscando el s-l1 elemento
  • Varias notas
  • El algoritmo depende del cálculo de la mediana.
    Si la mediana calculada difiere mucho de la media
    real, la función de complejidad se torna O(n2),
    al igual que en el quicksort
  • Se utiliza pivoteBis, y no pivote, para evitar el
    caso patológico de que todos los elementos del
    array sean iguales

17
Selección
  • El algoritmo sería de la forma siguiente

FUNCTION seleccion(T1..n, s)tipo BEGIN
p mediana(T1..n) pivoteBis(T1..n, p,
k, l) if s lt k then selección
seleccion(T1..k-1, s) else if s gt l then
selección seleccion(Tl1..n, s-l1)
else selección p END
18
Selección
  • La mediana puede calcularse (en realidad, se
    calcula un valor relativamente similar) mediante
    el siguiente procedimiento de mediana a 5

FUNCTION pseudoMediana(T1..n)tipo BEGIN
Es de nuevo un algoritmo de DyV if n lt 5
then pseudoMediana medianaAdHoc(T1..n)
else begin z n div 5 array
Z1..z for i 1 to z do Zi
medianaAdHoc(T5i-4..5i) pseudoMediana
selección(Z, z div 2 1) end END
19
Exponenciación
  • Realizar la operación an implica, en su
    formulación más simple, una complejidad O(n)
  • Es posible, utilizando DyV, utilizar la siguiente
    estrategia
  • El número de multiplicaciones utilizando la
    versión DyV es O(log n). No obstante, teniendo en
    cuenta el tamaño de los números implicados en la
    multiplicación, éste algoritmo sólo es eficiente
    cuando se utilizan productos DyV
Write a Comment
User Comments (0)
About PowerShow.com