recurrencia programación ii 3-4 de febrero de 2009

23
Recurrencia Programación II 3-4 de febrero de 2009

Upload: merlin-laredo

Post on 11-Apr-2015

110 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Recurrencia Programación II 3-4 de febrero de 2009

Recurrencia

Programación II

3-4 de febrero de 2009

Page 2: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación rápida: Quick Sort

Quick Sort divide el vector en dos partes que se ordenan recursivamente. Se puede resumir en tres pasos:

1. Escoger un Elemento de Pivote.

2. Particionar el vector en dos partes: una cuyos elementos son menores que el pivote, otra cuyos elementos son mayores.

3. Ordenar cada partición de manera recursiva con QuickSort.

Page 3: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación rápida: Quick Sort

1 accion QuickSort (V: vector de natural ; E,D: natural)2 variable medio, pivote, posicion_pivote : natural ;3 si (E >= D) entonces4 // no hacer nada; intervalo ya ordenado5 sino6 pivote := BuscarElementoPivote (V, E, D);7 posicion_pivote := Particionar (V, E, D, pivote);8 QuickSort ( V, E, posicion_pivote - 1);9 QuickSort ( V, posicion_pivote , D);10 fsi11 faccion

Page 4: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación rápida: Quick Sort

1 funcion BuscarElementoPivote (V: vector de natural ; i,j: natural) devuelve natural

2 devolver V[j];3 // hay diversas maneras de hacer esto.... //4 ffuncion

Existen varias maneras de obtener el elemento de pivote.

En este caso se devuelve el último elemento.

No hay ninguna manera que garantice mejores resultados.

Page 5: Recurrencia Programación II 3-4 de febrero de 2009

1 funcion Particionar (V: vector de natural ; i,j,pivote: natural) devuelve natural

2 variable E, D: natural ; 3 E := i; 4 D := j;5 mientras ( E < D ) hacer6 mientras ( V[E] < pivote ) hacer // izquierda //7 E := E + 1; 8 fmientras9 mientras (V[D] >= pivote ) hacer // derecha //10 D := D - 1; 11 fmientras12 si (E < D ) entonces13 Intercambiar ( V, E, D );14 fsi15 fmientras16 Intercambiar ( V, E, j );17 devuelve E;18 ffuncion

Ordenación rápida: Quick Sort

Page 6: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación rápida: Quick Sort

¿Porqué inventar un algoritmo de ordenación más complejo?

Page 8: Recurrencia Programación II 3-4 de febrero de 2009

Recorrido de grafos

Muchos problemas se pueden representar por grafos

Un grafo G=(V,E) consiste en un conjunto V de vértices y un conjunto E de aristas

Hay varias razones para recorrer grafos:- visitar todos los vértices- buscar un(os) vértice(s)

L M N O P

G

Q

H JI K

FED

B C

A

Page 9: Recurrencia Programación II 3-4 de febrero de 2009

Búsqueda en profundidad (DFS; depth-first search)

Recorre todos los vértices de una rama antes de seguir con la siguiente

Visita a algunos vértices muy lejanos (profundos) del origen antes de otros cercanos

La implementación más fácil es recursivaL M N O P

G

Q

H JI K

FED

B C

A

Page 10: Recurrencia Programación II 3-4 de febrero de 2009

Búsqueda en profundidad (DFS)

Para no visitar a un mismo vértice varias veces, hay que marcar los vértices ya visitados

Sólo visitamos a un nodo si no ha sido marcado

L M N O P

G

Q

H JI K

FED

B C

A

Page 11: Recurrencia Programación II 3-4 de febrero de 2009

1 accion DFS(v: vertice)2 variable u: vertice;3 si (no marcado(v)) entonces4 marcado(v) := cierto;5 // procesamiento anterior de v6 para cada vecino u de v hacer7 DFS(u);8 fpara9 // procesamiento posterior de v10 fsi11 faccion

Búsqueda en profundidad (DFS)

Page 12: Recurrencia Programación II 3-4 de febrero de 2009

1 funcion DFS(v,w: vertice) devuelve booleano2 variable u: vertice;3 b: booleano;4 si (marcado(v)) entonces5 devuelve falso;6 sino7 marcado(v) := cierto;8 si (v = w) entonces9 devuelve cierto;10 fsi11 b := falso;12 para cada vecino u de v hacer13 b := b o DFS(u, elem);14 fpara15 devuelve b;16 fsi17 ffuncion

Ejemplo: buscar un vértice w

Page 13: Recurrencia Programación II 3-4 de febrero de 2009

Búsqueda en anchura (BFS; breadth-first search)

Recorre los vértices en orden de su distancia desde el origen

Visita a todos los vértices (el ancho) de un nivel antes de seguir con el siguiente

Siempre encuentra la distancia mínima entre un vértice y el origen

L M N O P

G

Q

H JI K

FED

B C

A

Page 14: Recurrencia Programación II 3-4 de febrero de 2009

Búsqueda en anchura (BFS)

Mantener una cola de vértices a procesar

Cola: primer dato que entra, primero que sale (FIFO)

Marcar vértices ya visitados (igual que para DFS)

Agregar nuevos vértices a la cola

Seguir hasta que la cola esté vacía

Page 15: Recurrencia Programación II 3-4 de febrero de 2009

1 accion BFS(v: vertice)2 variable c: cola;3 u,w: vertice;4 marcado(v) := cierto; // falso para otros vértices5 Inicializar(c);6 Agregar(c, v);7 mientras (no Vacia(c)) hacer8 u := Sacar(c);9 // procesamiento anterior de u10 para cada vecino w de u hacer11 si (no marcado(w)) entonces12 marcado(w) := cierto;13 Agregar(c, w);14 fsi15 fpara16 // procesamiento posterior de u17 fmientras18 faccion

Búsqueda en anchura (BFS)

Page 16: Recurrencia Programación II 3-4 de febrero de 2009

1 tupla cola2 v: vector de vertice; i,d: natural;3 ftupla

Implementación de cola

1 accion Agregar(c: cola; v: vertice)2 c.v[c.d] := v; c.d := c.d + 1;3 faccion

1 funcion Vacia(c: cola) devuelve booleano2 devuelve c.d > c.i;3 ffuncion

1 funcion Sacar(c: cola) devuelve vertice2 c.i := c.i + 1; devuelve c.v[c.i – 1];3 faccion

1 accion Inicializar(c: cola)2 c.i := c.d := 1;3 faccion

Page 17: Recurrencia Programación II 3-4 de febrero de 2009

1 funcion BFS(v,x: vertice) devuelve natural2 variable c: cola;3 u,w: vertice;4 marcado(v) := 0; // -1 para otros vértices5 Inicializar(c);6 Agregar(c, v);7 mientras (no Vacia(c)) hacer8 u := Sacar(c);9 para cada vecino w de u hacer10 si (marcado(w) < 0) entonces11 marcado(w) := marcado(u) + 1;12 Agregar(c, w);13 fsi14 fpara15 fmientras16 devuelve marcado(x);19 ffuncion

Ejemplo: devolver la distancia de v a un vértice x

Page 18: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación por intercalación: Merge Sort

Merge Sort es un algoritmo recursivo para ordenar los elementos de un vector.

Primero se divide el vector en dos partes iguales.

Después se ordenan las dos partes recursivamente.

Finalmente se combinan las dos partes ordenadas para obtener el resultado.

Page 19: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación por intercalación: Merge Sort

1 funcion MergeSort (V: vector de natural ; E,D: natural) devuelve vector de natural

2 variable medio : natural ;3 Ve , Vd : vector de natural ;4 si (E >= D) entonces5 devuelve [ V[E] ];6 sino7 medio := ( E + D ) / 2;8 Ve := MergeSort ( V, E, medio );9 Vd := MergeSort ( V, D, medio+1 );10 devuelve Combina (Ve , Vd , medio – E + 1, D – medio );11 fsi12 ffuncion

Page 20: Recurrencia Programación II 3-4 de febrero de 2009

1 funcion Combina (V1,V2 : vector de natural ; m,n: natural) devuelve vector de natural

2 variable resultado : vector de natural ;3 r, i, j : natural;4 r := 1; i := 1; j := 15 mientras (( i <= m) y ( j <= n)) hacer6 si (V1 [i] <= V2 [j] ) entonces7 resultado[r] := V1[i];8 i := i + 1; r := r + 1;9 sino10 resultado[r] := V2[j];11 j := j + 1; r := r + 1;12 fsi13 fmientras14 mientras ( i <= m ) hacer15 resultado[r] := V1[i];16 i := i + 1; r := r + 1;17 fmientras18 mientras ( j <= n) hacer19 resultado[r] := V2[j];20 j := j + 1; r := r + 1;21 fmientras22 devuelve resultado;23 ffuncion

Page 21: Recurrencia Programación II 3-4 de febrero de 2009

Dividir en el centro

Intercalar lasSoluciones

Ordenar recursivamente

Ordenación por intercalación: Merge Sort

Page 22: Recurrencia Programación II 3-4 de febrero de 2009

Ordenación por intercalación: Merge Sort

6 12 4 9 8 13 5

4 6 9 12 5 8 13

4 5 6 8 9 12 13

Llamada recursiva 1 ( MergeSort )

Llamada recursiva 2 ( MergeSort )

Llamada recursiva 3 ( MergeSort )

Volver 3 a 2 ( Combina )

Volver 2 a 1 ( Combina )

Combina

Page 23: Recurrencia Programación II 3-4 de febrero de 2009

Algoritmo MergeSort: Animación

http://www.cs.toronto.edu/%7Eneto/teaching/238/16/mergesort.html

http://www.cs.ubc.ca/spider/harrison/Java/http://www.sorting-algorithms.com/merge-sort