• No se han encontrado resultados

slides pdf

N/A
N/A
Protected

Academic year: 2020

Share "slides pdf"

Copied!
681
0
0

Texto completo

(1)

Algoritmos y Estructuras de Datos

Mario Storti, Jorge D’El´ıa, Rodrigo Paz, Lisandro Dalc´ın, Mart´ın Pucheta

C ´atedra de Algoritmos y Estructuras de Datos

http://www.cimec.org.ar/aed

<(mstorti jdelia rodrigop ...

dalcinl mpucheta)@intec.unl.edu.ar>

Facultad de Ingenier´ıa y Ciencias H´ıdricas

Universidad Nacional del Litoral

http://www.unl.edu.ar

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa - CIMEC

(2)

slide 52...Tiempos de ejecuci ´on de un programa

slide 99...Tipos de datos abstractos fundamentales

.

slide 109...El TAD lista

slide 118...Interfase para listas

slide 129...Funciones que retornan referencias

slide 139...Implementaciones de lista

slide 140...Listas por arreglos

slide 152...Listas por celdas enlazadas

slide 170...Listas por cursores

slide 183...Interfase STL para lista

.

slide 198...El TAD pila

.

slide 214...El TAD cola

.

slide 222...Correspondencias

slide 260...Arboles

.

slide 272...Arboles ordenados orientados

.

slide 314...Implementaci ´on de ´arboles

.

slide 348...Arboles binarios

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 2

(3)

slide 410...Conjuntos

.

slide 412...Relaciones de orden

.

slide 418...Notaci ´on de conjuntos

.

slide 422...Interfase b ´asica para conjuntos

.

slide 443...Implementaci ´on por vectores de bits

.

slide 456...Implementaci ´on con listas

.

slide 460...Operaciones binarias

.

slide 474...Interfase avanzada para conjuntos

.

slide 477...Diccionarios

.

slide 496...Diccionarios. Tiempos de ejecuci ´on

.

slide 530...Conjuntos con ´arboles binarios de b ´usqueda

slide 554...Ordenamiento

.

slide 560...M ´etodos de ordenamiento lentos

.

slide 572...Ordenamiento r ´apido (quick-sort)

.

slide 585...Ordenamiento por mont´ıculos (heap-sort)

(4)

.

slide 633...Comparaci ´on de m ´etodos

slide 638...Dise ˜no de algoritmos

.

slide 640...Dividir para vencer

.

slide 642...El problema de las Torres de Hanoi

.

slide 664...Fixture de torneos todos-contra-todos

.

slide 670...Programaci ´on din ´amica

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 4

(5)

Existe una p ´agina web con informaci ´on y material del curso:

http://www.cimec.org.ar/aed

. Incluye material (apuntes y esta transparencia). Todo el c ´odigo que se ense ˜na durante el desarrollo del curso.

Desde la p ´agina se puede suscribir a la lista de correo Noti-AED. Por la

lista se manda informaci ´on sobre el curso. Recomendamos que todos los

alumnos deben estar suscriptos a la lista.

Es recomendable leer los apuntes antes de la clase correspondiente.

Evaluaci ´on: 3 parciales. Regulariza con

40% en los 3. Promueve si adem ´as el promedio es

70%.

Habr ´a un recuperatorio que reemplaza la peor nota.

El curso se dar ´a en lenguaje C++, en especial el uso de la librer´ıa STL (hoy parte del C++ est ´andar). Es un objetivo del curso que los alumnos

finalicen el curso con un buen nivel de programaci ´on en C++.

De acuerdo con los lineamientos de le UNL se fomentar ´a el uso de

(6)

Dise ˜

no y an ´alisis de

algoritmos

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 6

(7)

Dise ˜

no y an ´alisis de algoritmos

En matem ´atica y ciencias de la computaci ´on un algoritmo es un

procedimiento (un conjunto de instrucciones bien definidas) para cumplir una tarea. A partir de un estado inicial, el algoritmo debe terminar en un estado final bien definido.

Informalmente, el concepto de algoritmo es similar al de una receta de cocina, si bien los algoritmos pueden ser mucho m ´as complejos. Los algoritmos

(8)

El concepto de algoritmo se origin ´o como una forma de registrar

procedimientos para resolver problemas matem ´aticos (ej. al algoritmo de suma, resta, multiplicaci ´on y divisi ´on, o el Algoritmo de Euclides para encontrar el m ´aximo com ´un divisor de dos n ´umeros). El concepto fue

formalizado en 1936 por Alan Turing a trav ´es del uso de lo que hoy se llaman

M ´aquinas de Turing. Estos conceptos est ´an en la base misma de la Ciencia de la Computaci ´on

La mayor´ıa de los algoritmos pueden ser implementados directamente por programas de computaci ´on. Otros pueden ser al menos simulados en teor´ıa por programas de computaci ´on.

Una restricci ´on que se agrega usualmente a la definici ´on de algoritmo es que ´este llegue al estado final en un n ´umero finito de pasos.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 8

(9)

Dise ˜

no y an ´alisis de algoritmos (cont.)

No existe una regla precisa para escribir un programa que resuelva un

problema pr ´actico dado. Al menos por ahora escribir programas es en gran medida un arte.

Sin embargo con el tiempo se han desarrollado un variedad de conceptos

que ayudan a desarrollar estrategias para resolver problemas y comparar

(10)

Por ejemplo supongamos que queremos resolver el

“Problema del Agente Viajero” (TSP, por

“Traveling Salesman

Problem”) el cual consiste en encontrar el orden en que se debe recorrer un cierto n ´umero de ciudades (esto es, una serie de

puntos en el plano) en

forma de tener un recorrido m´ınimo.

SF

CB TC

BA

SR

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 10

(11)

Dise ˜

no y an ´alisis de algoritmos (cont.)

Este problema surge en una variedad de problemas

Aplicaciones pr ´acticas, por ejemplo encontrar caminos m´ınimos para recorridos de distribuci ´on de productos.

Resolver el problema de “la

vuelta del caballo en el tablero de ajedrez”, es decir, encontrar un camino para el caballo que recorra toda las casillas del tablero pasando una sola vez por cada casilla.

3

A

B

C

D

E

F

0

(12)

Estrategias

Existe una estrategia (trivial) que consiste en evaluar todos los caminos posibles. Pero esta estrategia de “b ´usqueda exhaustiva” tiene un gran defecto, el costo computacional crece de tal manera con el n ´umero de ciudades que deja de ser aplicable a partir de una cantidad relativamente peque ˜na.

Otra estrategia “heur´ıstica” se basa en buscar un camino que, si bien no es el ´optimo (el de menor recorrido sobre todos los posibles) puede ser relativamente bueno en la mayor´ıa de los casos pr ´acticos. Por ejemplo, empezar en una ciudad e ir a la m ´as cercana que no haya sido a ´un

visitada hasta recorrerlas todas.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 12

(13)

Algoritmo

Una forma abstracta de plantear una estrategia es en la forma de un

“algoritmo”, es decir una secuencia de instrucciones cada una de las cuales representa una tarea bien definida y puede ser llevada a cabo en una cantidad finita de tiempo y recursos computacionales. El algoritmo debe terminar en un n ´umero finito de pasos. Un algoritmo puede ser usado como una

instrucci ´on en otro algoritmo m ´as complejo.

Entonces, comparando diferentes algoritmos para el TSP entre s´ı, podemos plantear las siguientes preguntas

¿Da el algoritmo la soluci ´on ´optima?

Si el algoritmo es iterativo, ¿converge?

(14)

Ejemplo: Sincronizaci ´on en c ´alculo distribuido

Consideremos un sistema de procesamiento con varios procesadores que acceden a un ´area de memoria

compartida. En memoria hay una serie de objetos

O

0,

O

1, ...

O

n−1, con

n

= 10

y una serie

de tareas a realizar

T

0,

T

1, ...

T

m−1 con

m

= 12

. Cada tarea

debe modificar un cierto subconjunto de los objetos, seg ´un la figura

O0 O1 O2 O3 O4

O6 O7 O8 O9 O5 T0 T1 T2 T3 T4 T5 T6

T7 T8 T9

T10 T11

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 14

(15)

Dise ˜

no y an ´alisis de algoritmos (cont.)

Las tareas pueden realizarse en cualquier orden, pero dos tareas no pueden

ejecutarse al mismo tiempo si acceden al mismo objeto, ya que los cambios hechos por una de ellas puede interferir con los cambios hechos por la otra. Debe entonces desarrollarse un sistema que sincronice entre s´ı la ejecuci ´on de las diferentes tareas.

Una forma trivial de sincronizaci ´on es ejecutar cada una de las tareas en

forma secuencial. Primero la tarea

T

0 luego la

T

1 y as´ı siguiendo hasta la

T

11, de esta forma nos aseguramos que no hay conflictos en el acceso a los

(16)

Dise ˜

no y an ´alisis de algoritmos (cont.)

Sin embargo, esta soluci ´on puede estar muy lejos de ser ´optima en cuanto al tiempo de ejecuci ´on ya que por ejemplo

T

0 y

T

1 pueden ejecutarse al mismo tiempo en diferentes procesadores ya que modifican diferentes objetos. Si asumimos, para simplificar, que todas las tareas llevan el mismo tiempo de ejecuci ´on

τ

, entonces la versi ´on trivial consume una cantidad de tiempo

, mientras que ejecutando las tareas

T

0 y

T

1 al mismo tiempo reducimos el

tiempo de ejecuci ´on a

(

m

1)

τ

.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 16

(17)

Dise ˜

no y an ´alisis de algoritmos (cont.)

El algoritmo a desarrollar debe “particionar” las tareas en una serie de

p

“etapas”

E

0, ...

E

p. Las etapas son simplemente subconjuntos de las tareas y la partici ´on debe satisfacer las siguientes restricciones

Cada tarea debe estar en una y s ´olo una etapa. (De lo contrario la tarea no se realizar´ıa o se realizar´ıa m ´as de una vez, lo cual es redundante. En el lenguaje de la teor´ıa de conjuntos, estamos diciendo que debemos

particionar el conjunto de etapas en un cierto n ´umero de subconjuntos

“disjuntos”.)

Las tareas a ejecutarse en una dada etapa no deben acceder al mismo

objeto.

(18)

Este problema es muy com ´un, ya que se plantea siempre que hay un n ´umero de tareas a hacer y conflictos entre esas tareas, por ejemplo sincronizar una serie de tareas con

maquinaria a realizar en una industria, evitando conflictos en el uso del instrumental o maquinaria, es decir no

agendar dos tareas para realizar simult ´aneamente si van a usar el microscopio electr ´onico.

O0 O1 O2 O3 O4

O6 O7 O8 O9 O5

T0

T1 T3

T11

T4

T8

T9 T

2

T6

T7

T5

T10

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 18

(19)

Introducci ´

on b ´asica a grafos

El problema se puede plantear usando una estructura matem ´atica conocida como “grafo”. La base del grafo es un conjunto finito

V

de puntos llamados

“v ´ertices”. La estructura del grafo est ´a dada por las conexiones entre los v ´ertices. Si dos v ´ertices est ´an conectados se dibuja una l´ınea que va desde un v ´ertice al otro. Estas conexiones se llaman “aristas” (“edges”) del grafo. Los v ´ertices pueden identificarse con un n ´umero de 0 a

n

v

1

donde

n

v es el n ´umero total de v ´ertices.

a b

c

e

f

d

(20)

Puede representarse como una matriz

A

sim ´etrica de tama ˜no

n

v

×

n

v con 0’s y 1’s. Si hay una arista entre el v ´ertice

i

y el

j

entonces el elemento

A

ij es uno, y sino es cero. Adem ´as, si existe una arista entre dos v ´ertices

i

y

j

entonces decimos que

i

es “adyacente” a

j

.

a b

c

e

f

d

a d e f a b f c d e b c 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 0

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 20

(21)

Introducci ´

on b ´asica a grafos (cont.)

Para este ejemplo usaremos “grafos no orientados”, es decir que si el v ´ertice

i

est ´a conectado con el

j

entonces el

j

est ´a conectado con el

i

. Tambi ´en existen “grafos orientados” donde las aristas se representan por flechas.

(22)

Podemos plantear el problema dibujando un grafo donde los v ´ertices corresponden a las tareas y dibujaremos una arista entre dos tareas si son incompatibles entre s´ı

(modifican el mismo objeto).

T0 T1 T2

T8 T

7

T11 T10

T9 T

6

T3 T

4 T5

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 22

(23)

Planteo del problema mediante grafos (cont.)

La buena noticia es que nuestro problema de particionar el grafo ha sido muy estudiado en la teor´ıa de grafos y se llama el problema de

“colorear” el grafo, es decir se representan gr ´aficamente las etapas asign ´andole colores a los v ´ertices del grafo. La mala noticia es que se ha encontrado que obtener el coloreado

´

optimo (es decir el coloreado admisible con la menor cantidad de colores posibles) resulta ser un problema extremadamente costoso en cuanto a tiempo de c ´alculo.

T0 T1 T2

T8 T 7 T11 T10 T9 T 6

T3 T

(24)

El t ´ermino “colorear grafos” viene de un problema que tambi ´en se puede poner en t ´erminos de colorear grafos y es el de colorear pa´ıses en un mapa.

Debemos asignar a cada pa´ıs un color, de manera que pa´ıses lim´ıtrofes (esto es, que comparten una porci ´on de frontera de medida no nula) tengan

diferentes colores y, por supuesto,

debemos tratar de usar el m´ınimo n ´umero de colores posibles.

C1

C2

C3 C4

C7 C10 C9 C8 C5 C6

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 24

(25)

Algoritmo de b ´

usqueda exhaustiva

Probar si el grafo se puede colorear con 1 solo color (esto s ´olo es posible si no hay ninguna arista en el grafo). Si esto es posible el problema est ´a

resuelto (no puede haber coloraciones con menos de un color). Si no es

posible entonces generamos todas las coloraciones con 2 colores, para cada una de ellas verificamos si satisface las restricciones o no, es decir si es

admisible. Si lo es, el problema est ´a resuelto: encontramos una coloraci ´on admisible con dos colores y ya verificamos que con 1 solo color no es

posible. Si no encontramos ninguna coloraci ´on admisible de 2 colores entonces probamos con las de 3 colores y as´ı sucesivamente. Si

encontramos una coloraci ´on de

n

c colores entonces ser ´a ´optima, ya que

(26)

Algoritmo de b ´

usqueda exhaustiva (cont.)

Ahora tratando de responder las preguntas que planteamos para un algoritmo gen ´erico

Da la soluci ´on ´optima.

Termina en un n ´umero finito de pasos ya que a lo sumo puede haber

n

c

=

n

v colores, es decir la coloraci ´on que consiste en asignar a cada

v ´ertice un color diferente es siempre admisible.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 26

(27)

Generaci ´

on de las coloraciones

En realidad todav´ıa falta resolver un punto del algoritmo y es c ´omo generar todas las coloraciones posibles de

n

c colores. Adem ´as esta parte del

algoritmo debe ser ejecutable en un n ´umero finito de pasos as´ı que

trataremos de evaluar cuantas coloraciones

N

(

n

c

, n

v

)

hay para

n

v v ´ertices

con

n

c colores. Notemos primero que el procedimiento para generar las

(28)

Generaci ´

on de las coloraciones (cont.)

Para

n

c

= 1

es trivial, hay una sola coloraci ´on donde todos los v ´ertices tienen el mismo color, es decir

N

(

n

c

= 1

, n

v

) = 1

para cualquier

n

v.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 28

(29)

Coloraciones de 3 objetos con 2 colores

N

(2

,

3) = 2

N

(2

,

2)

N

(

n

c

, n

v

) =

n

c

N

(

n

c

, n

v

1)

a

b

b

a

b

a

b

a

c

b

c

c

c

c

a

b

a

b

a

b

a

c

b

c

c

c

c

n

c

=2

v

=2

n

N=4

n

c

=2

N=8

+

+

a

b

a

b

a

b

a

R R R R G G G G R

R R R

R R R R R R R R R G G G G G G G G G

G G G

(30)

Recursivamente, para cualquier

n

c

, n

v

1

, tenemos que

N

(

n

c

, n

v

) =

n

c

N

(

n

c

, n

v

1)

=

n

2c

N

(

n

c

, n

v

2)

. . .

=

n

nv−1

c

N

(

n

c

,

1)

(1)

Pero el n ´umero de coloraciones para un s ´olo v ´ertice con

n

c colores es

n

c, de manera que

N

(

n

c

, n

v

) =

n

ncv (2)

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 30

(31)

Generaci ´

on de las coloraciones (cont.)

Esto cierra con la ´ultima pregunta, ya que vemos que el n ´umero de pasos para cada uno de los colores es finito, y hay a lo sumo

n

v colores de manera que el n ´umero total de posibles coloraciones a verificar es finito. Notar de paso que esta forma de contar las coloraciones es tambi ´en “constructiva”, da un procedimiento para generar todas las coloraciones, si uno estuviera

(32)

exceso”.

Algunas

coloraciones en realidad tienen menos de 3 colores.

Otras en realidad son esencialmente la misma

coloraci ´on, ya que corresponden a intercambiar colores entre s´ı (por ejemplo rojo con verde).

a

b

c

a

b

c

a

b

c

a

b

c

a

b

c

a

b

c

a

b

c

a

b

c

un solo color

=

=

=

R R R

R R R R R R R R R G G G G G G G G G

G G G

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 32

(33)

Crecimiento del tiempo de ejecuci ´

on

No consideremos, por ahora, la eliminaci ´on de coloraciones redundantes y consideremos que para aplicar la estrategia exhaustiva al problema de

coloraci ´on de un grafo debemos evaluar

N

=

n

nv

v coloraciones. Esto

corresponde al peor caso de que el grafo necesite el n ´umero m ´aximo de

n

c

=

n

v colores.

Para verificar si una coloraci ´on dada es admisible debemos realizar un cierto n ´umero de operaciones. En el peor de los casos el n ´umero de operaciones necesario para verificar una dada coloraci ´on es igual al n ´umero de aristas y a lo sumo el n ´umero de aristas es

n

v

·

n

v (el n ´umero de elementos en la forma matricial del grafo) de manera que para verificar todas las coloraciones

necesitamos verificar

N

be

=

n

2v

n

nvv

=

n

nvv+2

(34)

El crecimiento de la funci ´on

n

nv

v con el n ´umero de v ´ertices es tan r ´apido que

hasta puede generar asombro. Consideremos el tiempo que tarda una

computadora personal t´ıpica en evaluar todas las posibilidades para

n

v

= 20

v ´ertices. Tomando un procesador de 2.4 GHz (un procesador t´ıpico al

momento de escribir este apunte) y asumiendo que podemos escribir un programa tan eficiente que puede evaluar una arista por cada ciclo del

procesador (en la pr ´actica esto es imposible y al menos necesitaremos unas decenas de ciclos para evaluar una coloraci ´on) el tiempo en a ˜nos necesario para evaluar todas las coloraciones es de

T

=

20

22

2

.

4

×

10

9

.

3600

.

24

.

365

= 5

.

54

×

10

11

a ˜nos

Esto es unas 40 veces la edad del universo (estimada en 15.000.000.000 de a ˜nos).

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 34

(35)

Algo que debe quedar en claro es que el problema no esta en la velocidad de las computadoras, sino en la estrategia de b ´usqueda exhaustiva. Incluso

haciendo uso de las m ´as sofisticadas t ´ecnicas de procesamiento actuales los tiempos no bajar´ıan lo suficiente. Por ejemplo usando uno de los “clusters”

de procesadores m ´as grandes existentes actualmente (con m ´as de mil

procesadores, ver

http://www.top500.org

) s ´olo podr´ıamos bajar el

tiempo de c ´alculo al orden de los millones de a ˜nos.

Otra forma de ver el problema es preguntarse cu ´al es el m ´aximo n ´umero de v ´ertices que se puede resolver en un determinado tiempo, digamos una hora de c ´alculo. La respuesta es que ya con

n

v

= 15

se tienen tiempos de m ´as de 5 horas.

En la secci ´on siguiente veremos que si bien la eliminaci ´on de las

(36)

Eliminando las coloraciones redundantes se obtiene una gran reducci ´on en el n ´umero de coloraciones a evaluar.

N

bem

n

nv/2+2

v . Esto

significa una gran mejora con respecto a

n

nv

v , para

20 v ´ertices pasamos de

4

.

2

×

10

28 coloraciones a

5

.

2

×

10

13 coloraciones y el tiempo de c ´omputo se reduce a s ´olo 99 d´ıas. Est ´a claro que todav´ıa resulta ser excesivo para un uso pr ´actico.

n

v coloraciones

coloraciones

diferentes

1 1 1

2 4 2

3 27 5

4 256 15

5 3125 52

6 46656 203

7 823543 877

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 36

(37)

Algoritmo heur´ıstico ´avido

Una estrategia diferente a la de b ´usqueda exhaustiva es la de buscar una soluci ´on que, si bien no es la ´optima (es decir, la mejor de todas), sea aceptablemente buena, y se pueda obtener en un tiempo razonable.

Un algoritmo que produce una soluci ´on razonablemente buena haciendo

hip ´otesis “razonables” se llama “heur´ıstico”. Del diccionario: heur´ıstico: una regla o conjunto de reglas para incrementar la posibilidad de resolver un

(38)

Un posible algoritmo

heur´ıstico para colorear grafos es el siguiente algoritmo

” ´avido”.

Seleccionar alg ´un v ´ertice no coloreado y asignarle el nuevo color.

Recorrer la lista de v ´ertices no coloreados. Para cada v ´ertice no coloreado

determinar si est ´a

conectado (esto es, posee alg ´un v ´ertice en com ´un) con un v ´ertice del nuevo color.

c

d

a

R

e

b

R

G

G B

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 38

(39)

Algoritmo heur´ıstico ´avido (cont.)

Esta aproximaci ´on es llamada ´avida ya que asigna colores tan r ´apido como lo puede hacer, sin tener en cuenta las posibles consecuencias negativas de tal acci ´on. Si estuvi ´eramos escribiendo un programa para jugar al ajedrez,

entonces una estrategia ´avida, ser´ıa evaluar todas las posibles jugadas y

elegir la que da la mejor ventaja material. En realidad no se puede catalogar a los algoritmos como ´avidos en forma absoluta, sino que se debe hacer en forma comparativa: hay algoritmos m ´as ´avidos que otros. En general cuanto m ´as ´avido es un algoritmo m ´as simple es y m ´as r ´apido es en cuanto a

(40)

El algoritmo encuentra una soluci ´on con tres colores, sin embargo se puede encontrar una soluci ´on con dos colores. Esta ´ultima es ´optima ya que una mejor deber´ıa tener s ´olo un color, pero esto es imposible ya que entonces no podr´ıa haber ninguna arista en el grafo. Este ejemplo ilustra perfectamente que si bien el algoritmo ´avido da una soluci ´on razonable, ´esta puede no ser la

´

optima.

Notemos tambi ´en que la coloraci ´on producida por el algoritmo ´avido depende del orden en el que se recorren los v ´ertices. En el caso

previo, si recorri ´eramos los nodos en el orden

{

a, e, c, d, b

}

, obtendr´ıamos la coloraci ´on ´optima.

c

d

a

e

b

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 40

(41)

1

void

greedy

(

graph

&

G

,

set

<

int

> &

no-col

,

2

set

<

int

> &

nuevo-color

,

3

vector

<

int

> &

tabla-color

,

int

color

) {

4

// Asigna a ‘nuevo-color’ un conjunto de vertices

5

// de ‘G’ a los cuales puede darse el mismo nuevo color

6

// sin entrar en conflicto con los ya coloreados

7

nuevo-color

.

clear

();

8

set

<

int

>

::iterator q

;

9

for

(

q

=

no-col

.

begin

();

q

!=

no-col

.

end

();

q

++) {

10

if

(

/* ‘*q’ no es adyacente a

11

ningun vertice en ‘nuevo-color’ . . . */

) {

12

// marcar a ‘*q’ como coloreado

13

// . . .

14

// agregar ‘*q’ a ‘nuevo-color’

15

// . . .

16

}

(42)

Est ´a escrito en “seudo-c ´odigo” (por ejemplo “elegir un v ´ertice no coloreado”).

Luego en un paso de “refinamiento” posterior estas sentencias en

seudo-c ´odigo son refinadas en tareas m ´as peque ˜nas, hasta que

finalmente terminamos con un c ´odigo que puede ser compilado y

linkeditado en un programa.

Los v ´ertices son identificados por un entero de 0 a nv-1.

La rutina adem ´as mantiene una tabla tabla_color donde finalmente

quedar ´an los colores de cada v ´ertice.

El argumento de entrada color indica el color (un entero empezando

desde 0 e increment ´andose de a 1 en cada llamada a greedyc) con el cual

se est ´a coloreando en esta llamada a greedyc.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 42

(43)

Implementaci ´

on del algoritmo heur´ıstico (cont.)

Para verificar si *q es adyacente a alg ´un v ´ertice de nuevo_color debemos

recorrer todos los nodos de nuevo_color y verificar si hay alguna arista entre

los mismos y *q. Es decir, el seudo-c ´odigo:

1

if

(

/* ‘*q’ no es adyacente a

2

ningun vertice en ‘nuevo-color’ . . . */

) {

es refinado a

1

int

adyacente

=0;

2

for

(

w

=

nuevo-color

.

begin

();

3

w

!=

nuevo-color

.

end

();

w

++) {

4

if

(

/* ‘*w’ es adyacente a ‘*q’ . . . */

) {

5

adyacente

= 1;

6

break

;

7

}

8

}

(44)

Para refinar el condicional necesitamos definir la clase grafo, para ello

utilizaremos una representaci ´on muy simple, ´util para grafos peque ˜nos

basada en mantener una tabla de unos y ceros. Los elementos de la matriz se acceden a trav ´es de una funci ´on miembro edge(j,k) que retorna una

referencia al elemento correspondiente de la matriz. edge() retorna una

referencia al elemento correspondiente, puede usarse tanto para insertar aristas en el grafo

1

G

.

edge

(

j

,

k

) = 1;

como para consultar si un dado par de v ´ertices es adyacente o no

1

if

(!

G

.

edge

(

j

,

k

)) {

2

// no estan conectados

3

// . . .

4

}

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 44

(45)

Con esta interfase para grafos, podemos definir completamente el if. El

c ´odigo final es

1

void

greedyc

(

graph

&

G

,

set

<

int

> &

no-col

,

2

set

<

int

> &

nuevo-color

,

3

vector

<

int

> &

tabla-color

,

int

color

) {

4

// Asigna a ‘nuevo-color’ un conjunto de vertices

5

// de ‘G’ a los cuales puede darse el mismo nuevo color

6

// sin entrar en conflicto con los ya coloreados

7

nuevo-color

.

clear

();

8

set

<

int

>

::iterator q

,

w

;

9

for

(

q

=

no-col

.

begin

();

q

!=

no-col

.

end

();

q

++) {

10

int

adyacente

=0;

11

for

(

w

=

nuevo-color

.

begin

();

12

w

!=

nuevo-color

.

end

();

w

++) {

13

if

(

G

.

edge

(*

q

,*

w

)) {

(46)

18

if

(!

adyacente

) {

19

// marcar a ‘*q’ como coloreado

20

tabla-color

[*

q

] =

color

;

21

// agregar ‘*q’ a ‘nuevo-color’

22

nuevo-color

.

insert

(*

q

);

23

}

24

}

25

}

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 46

(47)

1

void

greedy

(

graph

&

G

,

int

nv

,

2

vector

<

int

> &

tabla-color

) {

3

int

color

=0;

4

set

<

int

>

nuevo-color

,

no-col

;

5

set

<

int

>

::iterator q

;

6

// Inicialmente ponemos todos los vertices en

7

// ‘no-col’

8

for

(

int

k

=0;

k

<

nv

;

k

++)

no-col

.

insert

(

k

);

9

while

(1) {

10

// Determina a cuales vertices podemos asignar el

11

// nuevo color

12

greedyc

(

G

,

no-col

,

nuevo-color

,

13

tabla-color

,

color

);

14

// Saca los vertices que se acaban de colorear

15

// (‘nuevo-color’) de ‘no-col’

16

// . . .

(48)

22

}

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 48

(49)

1

void

greedy

(

graph

&

G

,

int

nv

,

2

vector

<

int

> &

tabla-color

) {

3

int

color

=0;

4

set

<

int

>

nuevo-color

,

no-col

;

5

set

<

int

>

::iterator q

;

6

// Inicialmente ponemos todos los vertices en ‘no-col’

7

for

(

int

k

=0;

k

<

nv

;

k

++)

no-col

.

insert

(

k

);

8

while

(1) {

9

// Determina a cuales vertices podemos asignar

10

// el nuevo color

11

greedyc

(

G

,

no-col

,

nuevo-color

,

tabla-color

,

color

);

12

// Saca los vertices que se acaban de colorear

13

// (‘nuevo-color’) de ‘no-col’

14

for

(

q

=

nuevo-color

.

begin

();

15

q

!=

nuevo-color

.

end

();

q

++)

16

no-col

.

erase

(*

q

);

(50)

21

}

22

}

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 50

(51)

Implementaci ´

on del algoritmo heur´ıstico (cont.)

Crecimiento del tiempo de ejecuci ´on para el algoritmo ´avido

(52)

Tiempos de ejecuci ´

on de

un programa

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 52

(53)

Tiempos de ejecuci ´

on de un programa

La eficiencia de un c ´odigo va en forma inversa con la cantidad de recursos que consume, principalmente tiempo de CPU y memoria. A veces en programaci ´on la eficiencia se contrapone con la sencillez y legibilidad de un c ´odigo.

Sin embargo en ciertas aplicaciones la eficiencia es un factor importante que no podemos dejar de tener en cuenta. Si escribimos un programa para buscar un nombre en una agenda personal de 200 registros,

entonces probablemente la eficiencia no es la mayor preocupaci ´on. Pero si escribimos un algoritmo para un motor de b ´usqueda en un n ´umero de entradas

>

10

9, como es com ´un en las aplicaciones para buscadores en Internet hoy en d´ıa, entonces la eficiencia probablemente pase a ser un concepto fundamental. Para tal volumen de datos, pasar de un algoritmo

(54)

Tiempos de ejecuci ´

on de un programa (cont.)

M ´as importante que saber escribir programas eficientemente es saber

cu ´ando y d ´onde preocuparse por la eficiencia.

Un programa est ´a compuesto en general por varios componentes o

m ´odulos. No tiene sentido preocuparse por la eficiencia de un m ´odulo dado si ´este representa un 5% del tiempo total de c ´alculo.

En tal m ´odulo tal vez sea mejor preocuparse por la robustez y sencillez de programaci ´on que por la eficiencia.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 54

(55)

Tiempos de ejecuci ´

on de un programa (cont.)

Para fijar ideas, pensemos en un programa que ordena de menor a mayor una serie de n ´umeros enteros. El tiempo de ejecuci ´on de un programa depende de:

La eficiencia del compilador y las opciones de optimizaci ´on que pasamos al mismo en tiempo de compilaci ´on.

El tipo de instrucciones y la velocidad del procesador donde se ejecutan las instrucciones compiladas.

Los datos del programa. En el ejemplo, la cantidad de n ´umeros y su

distribuci ´on estad´ıstica: ¿son todos iguales?, ¿est ´an ya ordenados o casi ordenados?

La “complejidad algor´ıtmica” del algoritmo subyacente. ¿Es el algoritmo

. O

(

n

log

n

)

(“quicksort”), o

(56)

Tiempos de ejecuci ´

on de un programa (cont.)

En muchos casos, el tiempo de ejecuci ´on depende de alguna “medida”

del tama ˜no de los datos.

Por ejemplo sumar un arreglo de

n

n ´umeros no depende de los n ´umeros en s´ı mismos sino de la longitud

n

del arreglo.

T

(

n

) =

cn

(3)

c

es una constante que representa el tiempo necesario para sumar un

elemento.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 56

(57)

Tiempos de ejecuci ´

on de un programa (cont.)

1

int

search

(

int

l

,

int

*

a

,

int

n

) {

2

int

j

;

3

for

(

j

=0;

j

<

n

;

j

++)

4

if

(

a

[

j

]==

l

)

break

;

5

return

j

;

6

}

En otros casos, si bien el tiempo de ejecuci ´on s´ı depende de los datos espec´ıficos, en promedio s ´olo depende del tama ˜no de los datos.

Buscar la ubicaci ´on de un elemento

l

en un arreglo

a

. El tiempo de

ejecuci ´on depender ´a fuertemente de la ubicaci ´on del elemento dentro del arreglo, y por lo tanto es proporcional a la posici ´on

j

del elemento dentro del vector.

(58)

“En promedio” el elemento buscado estar ´a en la zona media del arreglo, de manera que una ecuaci ´on como la

T

(

n

) =

cn

ser ´a v ´alida (en

promedio).

T

(

n

) =

cj

T

peor

(

n

) =

cn

T

prom

(

n

) =

c

n

2

(4)

En general, determinar anal´ıticamente el tiempo de ejecuci ´on de un

algoritmo puede ser dif´ıcil. Muchas veces, encontrar el

T

peor

(

n

)

es una tarea relativamente m ´as f ´acil. Determinar el

T

prom

(

n

)

puede a veces ser m ´as f ´acil y otras veces m ´as dif´ıcil.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 58

(59)

Notaci ´

on asint ´

otica

Para poder obtener una r ´apida comparaci ´on entre diferentes algoritmos

usaremos la “notaci ´on asint ´otica”

O

(

...

)

. Por ejemplo, decimos que el tiempo de ejecuci ´on de un programa es

T

(

n

) =

O

(

n

2

)

(se lee

T

(

n

)

es orden

n

2”) si existen constantes

c, n

0

>

0

tales que

T

(

n

)

c n

2

,

para

n

n

0 (5)

(60)

Ejemplo: Sea

T

(

n

) = (

n

+ 1)

vemos gr ´aficamente que la relaci ´on

T

(

n

)

2

n

2 es cierta para valores de

3

n

10

. O sea que parece ser v ´alido para

n

0

= 3

y

c

= 2

.

0 20 40 60 80 100 120 140 160 180 200

1 2 3 4 5 6 7 8 9 10

(n+1)2 n 0 2 2n n T(n) c

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 60

(61)

Notaci ´

on asint ´

otica (cont.)

Para ver que esta relaci ´on es v ´alida para todos los valores de

n

tales que

n

3

, entonces debemos recurrir a un poco de ´algebra.

n

3

,

n

1

2

,

(

n

1)

2

4

,

n

2

2

n

+ 1

4

,

n

2

3 + 2

n,

2

n

2

3 + 2

n

+

n

2

2

n

2

(

n

+ 1)

2

+ 2

(

n

+ 1)

2

(62)

Notaci ´

on asint ´

otica (cont.)

La notaci ´on

O

(

...

)

puede usarse con otras funciones, es decir

O

(

n

3

)

,

O

(2

n

)

,

O

(log

n

)

. En general decimos que

T

(

n

) =

O

(

f

(

n

))

(se lee “

T

(

n

)

es orden

f

(

n

)

”) si existen constantes

c, n

0

>

0

tales que

T

(

n

)

c f

(

n

)

,

para

n

n

0 (7)

Se suele llamar a

f

(

n

)

la “tasa de crecimiento” de

T

(

n

)

.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 62

(63)

Notaci ´

on asint ´

otica (cont.)

Invariancia ante constantes multiplicativas

Podemos ver que la definici ´on de la tasa de crecimiento es invariante ante constantes multiplicativas, es decir

T

(

n

) =

O

(

c f

(

n

))

=

T

(

n

) =

O

(

f

(

n

))

(8)

Por ejemplo, si

T

(

n

) =

O

(2

n

3

)

entonces tambi ´en es

O

(

n

3

)

.

Demostraci ´on: Esto puede verse facilmente ya que si

T

(

n

) =

O

(2

n

3

)

,

(64)

Notaci ´

on asint ´

otica (cont.)

Invariancia de la tasa de crecimiento ante valores en un conjunto finito de puntos

Es decir si

T

1

(

n

) =

100

;

para

n <

10

,

(

n

+ 1)

2

;

para

n

10

,

(9)

entonces vemos que

T

1

(

n

)

coincide con la funci ´on

T

(

n

) = (

n

+ 1)

2 estudiada antes.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 64

(65)

Notaci ´

on asint ´

otica (cont.)

T

(

n

)

y

T

1

(

n

)

s ´olo

difieren en un n ´umero

finito de puntos (los

valores de

n <

10

)

0 100 200 300 400 500 600 700 800

0 2 4 6 8 10 12 14 16 18 20

n 2 2n 1 T (n) n 0 2 T(n)=(n+1)

(66)

Notaci ´

on asint ´

otica (cont.)

Transitividad

La propiedad

O

( )

es transitiva, es decir si

T

(

n

) =

O

(

f

(

n

))

y

f

(

n

) =

O

(

g

(

n

))

entonces

T

(

n

) =

O

(

g

(

n

))

.

Demostraci ´on: si

T

(

n

)

cf

(

n

)

para

n

n

0 y

f

(

n

)

c

0

g

(

n

)

para

n

n

00, entonces

T

(

n

)

c

00

g

(

n

)

para

n

n

000, donde

c

00

=

cc

0 y

n

000

= max(

n

0

, n

00

)

. En cierta forma,

O

(

...

)

representa una relaci ´on de orden

entre las funciones (como “

<

” entre los n ´umeros reales).

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 66

(67)

Notaci ´

on asint ´

otica (cont.)

Regla de la suma

Si

f

(

n

) =

O

(

g

(

n

))

, con

a, b

son constantes positivas, entonces

a f

(

n

) +

b g

(

n

) =

O

(

g

(

n

))

. Es decir, si en una expresi ´on tenemos una serie de t ´erminos, s ´olo queda el “mayor” de ellos (en el sentido de

O

(

...

)

). As´ı por ejemplo, si

T

(

n

) = 2

n

3

+ 3

n

5, entonces puede verse f ´acilmente que

n

3

=

O

(

n

5

)

por lo tanto,

T

(

n

) =

O

(

n

5

)

.

Demostraci ´on: Si

f

(

n

)

cg

(

n

)

para

n

n

0 entonces

(68)

Notaci ´

on asint ´

otica (cont.)

Regla del producto

Si

T

1

(

n

) =

O

(

f

1

(

n

))

y

T

2

(

n

) =

O

(

f

2

(

n

))

entonces

T

1

(

n

)

T

2

(

n

) =

O

(

f

(

n

)

g

(

n

))

.

Demostraci ´on: Si

T

1

(

n

)

c

1

f

1

(

n

)

para

n

n

01 y

T

2

(

n

)

c

2

f

2

(

n

)

para

n

n

02 entonces

T

1

(

n

)

T

2

(

n

)

c f

1

(

n

)

f

2

(

n

)

para

n > n

0

= max(

n

01

, n

02

)

con

c

=

c

1

c

2.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 68

(69)

Funciones t´ıpicas utilizadas en la notaci ´on asint ´otica

Cualquier funci ´on puede ser utilizada como tasa de crecimiento, pero las m ´as usuales son, en orden de crecimiento

1

<

log

n <

n < n < n

2

< ... < n

p

<

2

n

<

3

n

<

· · ·

< n

!

< n

n (10)

Aqu´ı “

<

” representa

O

(

...

)

. Es decir,

1 =

O

(log

n

)

,

log

n

=

O

(

n

)

, ...

La funci ´on logaritmo crece menos que cualquier potencia

n

α con

α >

1

.

Los logaritmos en diferente base son equivalentes entre s´ı por la bien conocida relaci ´on

log

b

n

= log

b

a

log

a

n,

(11)

(70)

Funciones t´ıpicas utilizadas en la notaci ´on asint ´otica

1

representa las funciones constantes.

Las potencias

n

α (con

α >

0

) se comparan entre s´ı seg ´un sus

exponentes, es decir

n

α

=

O

(

n

β

)

si

α

β

. Por ejemplo,

n

2

=

O

(

n

3

)

,

n

1/2

=

O

(

n

2/3

)

.

Las exponenciales

a

n (con

a >

1

) se comparan seg ´un su base, es decir que

a

n

=

O

(

b

n

)

si

a

b

. Por ejemplo

2

n

=

O

(3

n

)

. En los problemas de computaci ´on cient´ıfica es muy com ´un que aparezcan expresiones con base

a

= 2

.

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 70

(71)

Notaci ´

on asint ´

otica (cont.)

La funci ´on factorial

Una funci ´on que aparece muy com ´unmente en problemas combinatorios es la funci ´on factorial

n

!

. Para poder comparar esta funci ´on con otras para

grandes valores de

n

es conveniente usar la “aproximaci ´on de Stirling”

n

!

2

π n

n+1/2 e−n (12)

Gracias a esta aproximaci ´on es f ´acil ver que

n

! =

O

(

n

n

)

(13)

y

(72)

¿Cu ´al es la mejor cota?

Para

T

(

n

) = (

n

+ 1)

2 podemos decir que

T

(

n

) =

O

(

n

2

)

T

(

n

) =

O

(

n

3

)

.

Pero decir que

T

(

n

) =

O

(

n

2

)

es una

aseveraci ´on “m ´as fuerte” del tiempo de ejecuci ´on ya que

n

2

< n

3. En general

debemos tomar la

“menor” de todas las cotas posibles.

f (n)3 f (n)

2 f (n) 1

n T(n)

Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 72

Referencias

Documento similar

La superficie total de las explotaciones de la comunidad está distribuida de la siguiente forma: El 74% no es de montaña, y del resto que es de montaña, el 15% es SAU y el 11%

(29) Cfr. MUÑOZ MACHADO: Derecho público de las Comunidades Autóno- mas, cit., vol. Es necesario advertir que en la doctrina clásica este tipo de competencias suele reconducirse

610. En una operación nacional la responsabilidad recae en el comandante opera- cional, quien desarrolla en ZO el marco logístico diseñado para la operación por el nivel

El total de líneas de fibra óptica hasta el hogar (FTTH) alcanzó en julio los 13,3 millones, con un crecimiento mensual de 64.172 líneas.. A nivel anual, respecto a julio

Industrial concentrado Industrial disperso Agrícola-Secano Agrícola-Regadío Otros usos rurales Forestal. Infraestructuras: carreteras Infraestructuras: ferrocarriles

Desacuerdo a la actividad de la empresa se procede a implementar el procedimiento del área de distribución, con el fin de poder identificar el paso a paso de cada una de

Sabemos que, normalmente, las ​cookies deben ser almacenadas y enviadas de vuelta al servidor sin modificar; sin embargo existe la posibilidad de que un atacante

o que carecen de tono muscular. Es fácil imaginar al niño pequeño que al sentirse abandonado o no recibir suficiente atención, decide por cualquier medio seducir a