














Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Analisis y diseño de algoritmos I, Profesor: , Carrera: I. T. Infor. Sistemas, Universidad: UCA
Tipo: Apuntes
1 / 22
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!















Dpto. de Lenguajes y Sistemas Informáticos UNIVERSIDAD DE CÁDIZ
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:
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.
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.