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
•
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 binariosCentro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 2
•
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).
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 ´amicaCentro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 4
•
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 lalista 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 alumnosfinalicen el curso con un buen nivel de programaci ´on en C++.
•
De acuerdo con los lineamientos de le UNL se fomentar ´a el uso deDise ˜
no y an ´alisis de
algoritmos
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 6
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
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
Dise ˜
no y an ´alisis de algoritmos (cont.)
•
No existe una regla precisa para escribir un programa que resuelva unproblema 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 conceptosque ayudan a desarrollar estrategias para resolver problemas y comparar
•
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
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 “lavuelta 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
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 ´unvisitada hasta recorrerlas todas.
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 12
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?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, conn
= 10
y una seriede tareas a realizar
T
0,T
1, ...T
m−1 conm
= 12
. Cada tareadebe 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
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 laT
1 y as´ı siguiendo hasta laT
11, de esta forma nos aseguramos que no hay conflictos en el acceso a losDise ˜
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 yT
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 tiempomτ
, mientras que ejecutando las tareasT
0 yT
1 al mismo tiempo reducimos eltiempo de ejecuci ´on a
(
m
−
1)
τ
.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 16
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 debemosparticionar el conjunto de etapas en un cierto n ´umero de subconjuntos
“disjuntos”.)
•
Las tareas a ejecutarse en una dada etapa no deben acceder al mismoobjeto.
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
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
donden
v es el n ´umero total de v ´ertices.a b
c
e
f
d
Puede representarse como una matriz
A
sim ´etrica de tama ˜non
v×
n
v con 0’s y 1’s. Si hay una arista entre el v ´erticei
y elj
entonces el elementoA
ij es uno, y sino es cero. Adem ´as, si existe una arista entre dos v ´erticesi
yj
entonces decimos quei
es “adyacente” aj
.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
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 elj
entonces elj
est ´a conectado con eli
. Tambi ´en existen “grafos orientados” donde las aristas se representan por flechas.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
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
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
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 queAlgoritmo 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 habern
c=
n
v colores, es decir la coloraci ´on que consiste en asignar a cadav ´ertice un color diferente es siempre admisible.
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 26
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 delalgoritmo debe ser ejecutable en un n ´umero finito de pasos as´ı que
trataremos de evaluar cuantas coloraciones
N
(
n
c, n
v)
hay paran
v v ´erticescon
n
c colores. Notemos primero que el procedimiento para generar lasGeneraci ´
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 decirN
(
n
c= 1
, n
v) = 1
para cualquiern
v.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 28
Coloraciones de 3 objetos con 2 colores
N
(2
,
3) = 2
N
(2
,
2)
N
(
n
c, n
v) =
n
cN
(
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 RR R R
R R R R R R R R R G G G G G G G G G
G G G
Recursivamente, para cualquier
n
c, n
v≥
1
, tenemos queN
(
n
c, n
v) =
n
cN
(
n
c, n
v−
1)
=
n
2cN
(
n
c, n
v−
2)
. . .
=
n
nv−1c
N
(
n
c,
1)
(1)
Pero el n ´umero de coloraciones para un s ´olo v ´ertice con
n
c colores esn
c, de manera queN
(
n
c, n
v) =
n
ncv (2)Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 30
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 estuvieraexceso”.
•
Algunascoloraciones en realidad tienen menos de 3 colores.
•
Otras en realidad son esencialmente la mismacoloraci ´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
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
nvv 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 coloracionesnecesitamos verificar
N
be=
n
2vn
nvv=
n
nvv+2El crecimiento de la funci ´on
n
nvv 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 almomento 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
11a ˜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
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 eltiempo 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
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
nvv , para
20 v ´ertices pasamos de
4
.
2
×
10
28 coloraciones a5
.
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 coloracionescoloraciones
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
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
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 coloreadodeterminar si est ´a
conectado (esto es, posee alg ´un v ´ertice en com ´un) con un v ´ertice del nuevo color.
c
d
a
Re
b
RG
G B
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 38
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
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
1
void
greedy
(
graph
&
G
,
set
<
int
> &
no-col
,
2set
<
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
();
8set
<
int
>
::iterator q
;
9
for
(
q
=
no-col
.
begin
();
q
!=
no-col
.
end
();
q
++) {
10if
(
/* ‘*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
}
•
Est ´a escrito en “seudo-c ´odigo” (por ejemplo “elegir un v ´ertice no coloreado”).•
Luego en un paso de “refinamiento” posterior estas sentencias enseudo-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 finalmentequedar ´an los colores de cada v ´ertice.
•
El argumento de entrada color indica el color (un entero empezandodesde 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
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’ . . . */
) {
5adyacente
= 1;
6
break
;
7
}
8
}
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
Con esta interfase para grafos, podemos definir completamente el if. El
c ´odigo final es
1
void
greedyc
(
graph
&
G
,
set
<
int
> &
no-col
,
2set
<
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
();
8set
<
int
>
::iterator q
,
w
;
9
for
(
q
=
no-col
.
begin
();
q
!=
no-col
.
end
();
q
++) {
10int
adyacente
=0;
11
for
(
w
=
nuevo-color
.
begin
();
12
w
!=
nuevo-color
.
end
();
w
++) {
13
if
(
G
.
edge
(*
q
,*
w
)) {
18
if
(!
adyacente
) {
19
// marcar a ‘*q’ como coloreado
20tabla-color
[*
q
] =
color
;
21
// agregar ‘*q’ a ‘nuevo-color’
22nuevo-color
.
insert
(*
q
);
23
}
24
}
25
}
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 46
1
void
greedy
(
graph
&
G
,
int
nv
,
2
vector
<
int
> &
tabla-color
) {
3int
color
=0;
4
set
<
int
>
nuevo-color
,
no-col
;
5set
<
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
,
13tabla-color
,
color
);
14
// Saca los vertices que se acaban de colorear
15// (‘nuevo-color’) de ‘no-col’
16
// . . .
22
}
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 48
1
void
greedy
(
graph
&
G
,
int
nv
,
2
vector
<
int
> &
tabla-color
) {
3int
color
=0;
4
set
<
int
>
nuevo-color
,
no-col
;
5set
<
int
>
::iterator q
;
6
// Inicialmente ponemos todos los vertices en ‘no-col’
7for
(
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’
14for
(
q
=
nuevo-color
.
begin
();
15q
!=
nuevo-color
.
end
();
q
++)
16no-col
.
erase
(*
q
);
21
}
22
}
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 50
Implementaci ´
on del algoritmo heur´ıstico (cont.)
Crecimiento del tiempo de ejecuci ´on para el algoritmo ´avido
Tiempos de ejecuci ´
on de
un programa
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 52
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 algoritmoTiempos de ejecuci ´
on de un programa (cont.)
•
M ´as importante que saber escribir programas eficientemente es sabercu ´ando y d ´onde preocuparse por la eficiencia.
•
Un programa est ´a compuesto en general por varios componentes om ´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
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 sudistribuci ´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”), oTiempos 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 den
n ´umeros no depende de los n ´umeros en s´ı mismos sino de la longitudn
del arreglo.T
(
n
) =
cn
(3)•
c
es una constante que representa el tiempo necesario para sumar unelemento.
Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 56
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
;
5return
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 elementol
en un arregloa
. El tiempo deejecuci ´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.•
“En promedio” el elemento buscado estar ´a en la zona media del arreglo, de manera que una ecuaci ´on como laT
(
n
) =
cn
ser ´a v ´alida (enpromedio).
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 unalgoritmo puede ser dif´ıcil. Muchas veces, encontrar el
T
peor(
n
)
es una tarea relativamente m ´as f ´acil. Determinar elT
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
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 esT
(
n
) =
O
(
n
2)
(se lee “T
(
n
)
es ordenn
2”) si existen constantesc, n
0>
0
tales queT
(
n
)
≤
c n
2,
paran
≥
n
0 (5)Ejemplo: Sea
T
(
n
) = (
n
+ 1)
vemos gr ´aficamente que la relaci ´onT
(
n
)
≤
2
n
2 es cierta para valores de3
≤
n
≤
10
. O sea que parece ser v ´alido paran
0= 3
yc
= 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
Notaci ´
on asint ´
otica (cont.)
Para ver que esta relaci ´on es v ´alida para todos los valores de
n
tales quen
≥
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
22
n
2≥
(
n
+ 1)
2+ 2
≥
(
n
+ 1)
2Notaci ´
on asint ´
otica (cont.)
La notaci ´on
O
(
...
)
puede usarse con otras funciones, es decirO
(
n
3)
,O
(2
n)
,O
(log
n
)
. En general decimos queT
(
n
) =
O
(
f
(
n
))
(se lee “T
(
n
)
es ordenf
(
n
)
”) si existen constantesc, n
0>
0
tales queT
(
n
)
≤
c f
(
n
)
,
paran
≥
n
0 (7)Se suele llamar a
f
(
n
)
la “tasa de crecimiento” deT
(
n
)
.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 62
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 esO
(
n
3)
.Demostraci ´on: Esto puede verse facilmente ya que si
T
(
n
) =
O
(2
n
3)
,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
;
paran <
10
,
(
n
+ 1)
2;
paran
≥
10
,
(9)
entonces vemos que
T
1(
n
)
coincide con la funci ´onT
(
n
) = (
n
+ 1)
2 estudiada antes.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 64
Notaci ´
on asint ´
otica (cont.)
T
(
n
)
yT
1(
n
)
s ´olodifieren 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)
Notaci ´
on asint ´
otica (cont.)
Transitividad
La propiedad
O
( )
es transitiva, es decir siT
(
n
) =
O
(
f
(
n
))
yf
(
n
) =
O
(
g
(
n
))
entoncesT
(
n
) =
O
(
g
(
n
))
.Demostraci ´on: si
T
(
n
)
≤
cf
(
n
)
paran
≥
n
0 yf
(
n
)
≤
c
0g
(
n
)
paran
≥
n
00, entoncesT
(
n
)
≤
c
00g
(
n
)
paran
≥
n
000, dondec
00=
cc
0 yn
000= max(
n
0, n
00)
. En cierta forma,O
(
...
)
representa una relaci ´on de ordenentre las funciones (como “
<
” entre los n ´umeros reales).Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 66
Notaci ´
on asint ´
otica (cont.)
Regla de la suma
Si
f
(
n
) =
O
(
g
(
n
))
, cona, b
son constantes positivas, entoncesa 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 deO
(
...
)
). As´ı por ejemplo, siT
(
n
) = 2
n
3+ 3
n
5, entonces puede verse f ´acilmente quen
3=
O
(
n
5)
por lo tanto,T
(
n
) =
O
(
n
5)
.Demostraci ´on: Si
f
(
n
)
≤
cg
(
n
)
paran
≥
n
0 entoncesNotaci ´
on asint ´
otica (cont.)
Regla del producto
Si
T
1(
n
) =
O
(
f
1(
n
))
yT
2(
n
) =
O
(
f
2(
n
))
entoncesT
1(
n
)
T
2(
n
) =
O
(
f
(
n
)
g
(
n
))
.Demostraci ´on: Si
T
1(
n
)
≤
c
1f
1(
n
)
paran
≥
n
01 yT
2(
n
)
≤
c
2f
2(
n
)
paran
≥
n
02 entoncesT
1(
n
)
T
2(
n
)
≤
c f
1(
n
)
f
2(
n
)
paran > n
0= max(
n
01, n
02)
conc
=
c
1c
2.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 68
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´ı “<
” representaO
(
...
)
. Es decir,1 =
O
(log
n
)
,log
n
=
O
(
√
n
)
, ...•
La funci ´on logaritmo crece menos que cualquier potencian
α conα >
1
.•
Los logaritmos en diferente base son equivalentes entre s´ı por la bien conocida relaci ´onlog
bn
= log
ba
log
an,
(11)Funciones t´ıpicas utilizadas en la notaci ´on asint ´otica
•
1
representa las funciones constantes.•
Las potenciasn
α (conα >
0
) se comparan entre s´ı seg ´un susexponentes, es decir
n
α=
O
(
n
β)
siα
≤
β
. Por ejemplo,n
2=
O
(
n
3)
,n
1/2=
O
(
n
2/3)
.•
Las exponencialesa
n (cona >
1
) se comparan seg ´un su base, es decir quea
n=
O
(
b
n)
sia
≤
b
. Por ejemplo2
n=
O
(3
n)
. En los problemas de computaci ´on cient´ıfica es muy com ´un que aparezcan expresiones con basea
= 2
.Centro Internacional de M ´etodos Computacionales en Ingenier´ıa slide 70
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 paragrandes 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
¿Cu ´al es la mejor cota?
Para
T
(
n
) = (
n
+ 1)
2 podemos decir queT
(
n
) =
O
(
n
2)
o´T
(
n
) =
O
(
n
3)
.Pero decir que
T
(
n
) =
O
(
n
2)
es unaaseveraci ´on “m ´as fuerte” del tiempo de ejecuci ´on ya que
n
2< n
3. En generaldebemos 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