Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


transparecnias tema 4, Apuntes de Representación de Datos y Diseño de Algoritmos

Asignatura: Analisis y diseño de algoritmos I, Profesor: , Carrera: I. T. Infor. Sistemas, Universidad: UCA

Tipo: Apuntes

Antes del 2010

Subido el 22/12/2008

josellle
josellle 🇪🇸

4.4

(60)

148 documentos

1 / 22

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Dpto. de Lenguajes y Sistemas Informáticos
UNIVERSIDAD DE CÁDIZ
Tema 4
Algunos Algoritmos Clásicos
y su Análisis
Francisco Palomo Lozano
Inmaculada Medina Bulo
Análisis y Diseño de Algoritmos I. 2006-07.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16

Vista previa parcial del texto

¡Descarga transparecnias tema 4 y más Apuntes en PDF de Representación de Datos y Diseño de Algoritmos solo en Docsity!

Dpto. de Lenguajes y Sistemas Informáticos UNIVERSIDAD DE CÁDIZ

Tema 4

Algunos Algoritmos Clásicos

y su Análisis

Francisco Palomo Lozano Inmaculada Medina Bulo Análisis y Diseño de Algoritmos I. 2006-07.

Pág. 4.1 Búsqueda secuencial

π

Búsqueda secuencial Sea V un conjunto, x ∈ V y v ∈ Vn. Se desea la posición de la primera aparición de x en v, si éste aparece, o bien n + 1 en caso contrario. búsqueda : x × v × n → p p ← 1 b ← > mientras p ≤ n ∧ b b ← x 6 = v[p] si b p ← p + 1 Se puede obtener un algoritmo equivalente con operaciones lógicas condicionales. búsqueda : x × v × n → p p ← 1 mientras p ≤ n ∧ x 6 = v[p] p ← p + 1

Pág. 4.3 Búsqueda secuencial

π

El mejor caso se produce si p = 1. Sólo se realiza una comparación.

tm´ın(n) = 1 ∈ Θ( 1 ) t(n) ∈ Ω( 1 )

El peor caso se produce si p = n o p = n+ 1. En ambos casos se realizan n comparaciones.

tm ´ax(n) = n ∈ Θ(n) t(n) ∈ O(n)

En el caso promedio hay que considerar que el número de comparaciones depende de si x está o no en el vector y, si lo está, de su posición. Sea α la probabilidad de que el elemento esté en el vector, y β = 1 −α la probabilidad de que no lo esté:

α = P(p ∈ [1, n]) β = P(p = n + 1 )

Pág. 4.4 Búsqueda secuencial

π

Si x está en el vector, entonces ocupa una de sus n posiciones; así, bajo hipótesis de equi- probabilidad:

P(p = 1 ) = · · · = P(p = n) = α n El número de comparaciones que realiza en el promedio es:

t(n) = βn +

∑^ n

i= 1

α n i

= ( 1 − α)n + α n

∑^ n

i= 1

i

= ( 1 − α)n + α n

n(n + 1 ) 2

= (^2 −^ α)n^ +^ α 2 ∈ Θ(n)

ya que 0 ≤ α ≤ 1.

Pág. 4.6 Ordenación por intercambio directo

π

Ordenación por intercambio directo ordenación-intercambio : v × n → v desde i ← 1 hasta n − 1 burbujeo(v, i, n) burbujeo : v × i × j → v desde k ← j hasta i + 1 con decremento 1 si v[k] < v[k − 1 ] ← j − i veces v[k] ↔ v[k − 1 ] No hay diferencia entre el mejor caso, el peor ca- so y el promedio. El número de comparaciones no depende del vector, sólo de su tamaño. El bucle externo varía i desde 1 hasta n − 1 realizando n − i comparaciones:

t(n) =

∑^ n−^1

i= 1

(n − i) = n(n − 1 ) 2 ∈ Θ(n^2 )

Pág. 4.7 Ordenación por selección directa

π

Ordenación por selección directa ordenación-selección : v × n → v desde i ← 1 hasta n − 1 p ← posición-mínimo(v, i, n) v[p] ↔ v[i] posición-mínimo : v × i × j → p 〈p, m〉 ← 〈i, v[i]〉 desde k ← i + 1 hasta j si v[k] < m ← j − i veces 〈p, m〉 ← 〈k, v[k]〉 Nótese que posición-mínimo no es más que una generalización de mínimo que devuelve la posi- ción del mínimo en vez de su valor. El análisis es idéntico al del algoritmo de inter- cambio directo.

Pág. 4.9 Ordenación por inserción directa

π

Hay diferencia entre ambos casos, así que anali- zamos también el caso promedio. Supondremos que los n elementos son distintos y sus n! per- mutaciones equiprobables. Al insertar v[i], la probabilidad de que quede en cualquiera de las posiciones [1, i] es la misma, por lo que rige el análisis ya realizado sobre el tiempo promedio de inserción.

t(n) =

∑^ n

i= 2

i + 1 2

i

= (n^ +^4 )(n^ −^1 ) 4

∑^ n

i= 2

i ∈ Θ(n^2 )

ya que: ∑^ n

i= 2

i = Hn − 1 ∈ Θ(log n)

Pág. 4.

Esquema de la corrección

∫ π

∑ ∏

Esquema de la corrección

Consideremos los siguientes predicados:

fa(

x, v, n

)^ ≡

α

[1, n

]^ |

x

v

]}|

perm

(v, w, n

)^ ≡ ∀

α^

[1, n

]^ fa

(v

], v, n

fa

(v

], w, n

parte

(i, v, n

)^ ≡ ∀

α^

[1, i

)^ ∀

β^

(i, n

]^ v

]^ ≤

v

]

La postcondición es

ord

(v, 1, n

)^ ∧

perm

(v,

^v, n

)^ en los tres algorit-

mos. El invariante del bucle externo en los dos primeros es:

i^ ≤

n

ord

(v, 1, i

)^ ∧

perm

(v,

^v, n

)^ ∧

parte

(i, v, n

y en el tercero,

i^

n

ord

(v, 1, i

)^ ∧

perm

(v,

^v, n

Análisis y Diseño de Algoritmos I

Tema 4. 2006-07.

Pág. 4.12 Ordenación por montículo

π

Ordenación por montículo Podemos ordenar un vector utilizando un mon- tículo. Este es el algoritmo de Williams o de or- denación por montículo. Su funcionamiento es muy sencillo:

  1. Se crea un montículo con los elementos.
  2. Se intercambian el primero y el último, con lo que el máximo queda al final.
  3. El vector resultante de eliminar el último ele- mento es un montículo salvo, quizás, por la raíz. Hundimos ésta.
  4. Volvemos a 2 con el vector reducido, salvo que éste sólo tenga ya un elemento.

Pág. 4.13 Ordenación por montículo

π

El algoritmo se basa en la idea de selección. A cada paso se selecciona el máximo de la zona que queda por ordenar y se coloca al principio de la zona ordenada. ordenación-montículo : v × n → v crea-montículo(v, n) desde i ← n hasta 2 con decremento 1 v[ 1 ] ↔ v[i] hunde(v, i − 1, 1) El invariante del bucle externo permite asegurar que [vi,... , vn] está ordenado y que v es una permutación del vector original. A diferencia de selección directa, se elimina (en general) más de una inversión por cada compa- ración realizada.

Pág. 4.15 Creación de un montículo (I)

π

Creación de un montículo (I) Basta hacer flotar sucesivamente a todos los ele- mentos, lo que equivale a insertar a cada paso un nuevo elemento en el montículo. crea-montículo : v × n → v desde i ← 2 hasta n flota(v, n, i) ← entre 1 y blog 2 ic comp. El invariante del bucle nos permite asegurar que [v 1 ,... , vi− 1 ] es un montículo y que v es una permutación del vector original. Obviamente t(n) ∈ Ω(n) ∩ O(n log n), ya que el tiempo de flotación pertenece a O(log n). Más exactamente:

t(n) ∈

∑^ n

i= 2

O(log i) = O(n log n)

Pág. 4.16 Creación de un montículo (II)

π

Creación de un montículo (II) Otra forma de crear un montículo, debida a Floyd, es hundir sucesivamente los elementos desde el padre del último hasta el primero. crea-montículo : v × n → v desde i ← n div 2 hasta 1 con decremento 1 hunde ︸ (︷︷v, n, i ︸) entre 1 y 2 blog 2 ni c comp. El invariante del bucle nos permite asegurar que vi+ 1 ,... , vn son raíces de submontículos de v y que v es una permutación del vector original. Esto equivale a formar submontículos por nive- les, de mayor a menor profundidad. Éstos van fundiéndose hasta obtener la solución. Obviamente t(n) ∈ Ω(n) ∩ O(n log n), pero se puede mejorar el análisis.

Pág. 4.18 Componentes conexas

π

Componentes conexas Sea G = 〈V, A〉 un grafo orientado, n = |V| y a = |A|. Podemos calcular sus componen- tes (débilmente) conexas con una estructura de partición.

  1. Se crea una estructura de partición con n conjuntos, uno por cada vértice del grafo.
  2. Si quedan aristas sin procesar se seleccio- na una de ellas. En caso contrario, el algo- ritmo termina.
  3. Se buscan los conjuntos a los que pertene- cen sus extremos.
  4. Si los conjuntos son distintos, se unen.
  5. La arista seleccionada ya ha sido procesa- da. Volvemos a 2.

Pág. 4.19 Componentes conexas

π

G puede representarse mediante listas de ad- yacencia con un vector l de n listas. Las listas contendrán, en total, a elementos. Este algoritmo devuelve una estructura de parti- ción con sus componentes conexas. componentes-conexas : l × n → p p ← partición-inicial(n) desde i ← 1 hasta n para todo j en l[i] e 1 ← búsqueda(p, n, i) e 2 ← búsqueda(p, n, j) si e 1 6 = e 2 unión(p, n, e 1 , e 2 ) Al principio, el algoritmo supone que existe una componente conexa por vértice. Luego, recorre cada arista comprobando si une dos componen- tes distintas, en cuyo caso las funde.