Professional Documents
Culture Documents
Factores externos: cualidad del software que puede ser detectada por un usuario (sin
conocer el cdigo fuente).
Factores internos: cualidad del software que puede ser percibida por el programador
(conociendo el cdigo fuente).
Correctitud: el programa respeta la especificacin (para una entrada dada produce la
salida esperada).
Robustez: el programa es capaz de manejar entradas no contempladas por la
especificacin (se espera que se degrade graciosamente). Ejemplo: recibe un entero
negativo cuando espera un positivo. Crtica en situaciones industriales.
Extensibilidad: capacidad de agregarle funcionalidad al software.
Portabilidad: habilidad del software con mnimo cambio en otro hardware o sistema
operativo.
Reusabilidad: capacidad de usar el cdigo en la construccin de otros programas.
Eficiencia: capacidad del software de requerir pocos recursos de computo (tiempo de CPU
y memoria).
Facilidad de uso: capacidad del software para ser usador por usuarios con distinta
habilidad.
Excepciones:
Las excepciones son eventos inesperados que ocurren durante la ejecucin de un
programa. Puede ser resultado de una condicin de error o una entrada incorrecta. En POO las
excepciones son objetos lanzados por un cdigo que detecta una condicin inesperada. Las
excepciones capturadas por otro cdigo que repara la situacin (o el programa termina con
error en ejecucin).
En Java las excepciones son subclases de la clase Exception. Los mtodos deben especificar en su
signatura las excepciones que pueden lanzar. Una excepcin se lanza desde una sentencia throw
void mtodo( parmetros formales )
{
try
{
.
sentencia_que_puede_producir_excepcin();
.
}
catch( tipo_excepcion e )
{
cdigo para manejar la excepcin e
}
Finally
{
codigo que siempre se ejecuta
}
}
Interfaces:
Una interfaz es una coleccin de declaraciones de mtodos (y sin atributos) que luego van
a ser implementados por una o ms clases. Una clase que implementa una interfaz debe
implementar todos los mtodos provistos por la interfaz.
Clases Wrapper:
En ocasiones es muy convenientes tratar a los datos primitivos (int, boolean, etc) como
objetos. Las clases wrapper se usan como cualquier otra.
Genericidad:
Una clase genrica permite encapsular una estructura cuyo comportamiento es
independiente del tipo de las componentes. Permite definir esquemas de clases que pueden
instanciarse de varias maneras.
Estructuras de Datos:
Una estructura de datos es una forma de organizar un conjunto de datos (elementales o
no). Cada una de las unidades que la componen se denomina celda. En general se accede a la
estructura de datos globalmente o a cada una de las celdas que la componen en forma particular.
As como las estructuras de datos se crean con el objetivo de facilitar la manipulacin de datos
individualmente como un todo. Desde la perspectiva de su representacin en memoria, una
estructura de datos es una coleccin de variables organizadas de alguna manera.
Algoritmo:
Un algoritmo es una secuencia de pasos que al ejecutarse permiten realizar una tarea en
una cantidad finita de tiempo.
Tiempo de ejecucin:
Es el tiempo de corrida de un programa sobre una maquina en particular y para una
determinada muestra de datos de entrada.
Orden de tiempo: Es una funcin T(n) que se asocia al programa (n = tamao de entrada).
Esta funcin representa el nmero de instrucciones ejecutarse sobre una maquina ideal.
Las ventajas de esta funcin son: Se independiza la evolucin de aspectos ajenos al
algoritmo y puede calcularse sobre el algoritmo sin necesidad de implementarlo
previamente.
Notacin asinttica (Big-Oh): sean F(n) y G(n) dos funciones de los naturales a los reales,
F(n) es O(G(n)) si y solo si existe un c real mayor que 0 y un n0 natural mayor que 1 tales
que F(n)<=c. G(n) para todo n>=n0 (se lee F(n) es big-oh de G(n) o F(n) es orden de G(n))
Regla de la suma: Si f1(n) es O(g1(n)) y f2(n) es O(g2(n)) entonces f1(n) + f2(n) es
O(max(g1(n),g2(n)).
Regla del producto: Si f1(n) es O(g1(n)) y f2(n) es O(g2(n)) entonces f1(n)*f2(n) es
O(g1(n)*g2(n)).
BigOmega: Sean f(n) y g(n) funciones de los naturales en los reales. f(n) es (g(n)) ssi
existen c real positivo y n0 natural tales que f(n) cg(n) para todo n n0.
BigTheta: Sean f(n) y g(n) funciones de los naturales en los reales. f(n) es (g(n)) ssi f(n) es
(g(n)) y f(n) es (g(n)).
Nota: BigTheta quiere decir c1g(n) f(n) c2g(n)
Reglas para calcular T(n) a partir del cdigo fuente de un algoritmo:
Paso 1: Determinar el tamao de la entrada n.
Paso 2: Aplicar las siguientes reglas en forma sistemtica:
TP(n) = constante si P es una accin primitiva
TS1;;Sn(n) = TS1(n) + + TSn(n)
Tif B then S1 else S2(n) = TB(n) + max(TS1(n),TS2(n))
Tfor(m;S)(n)=m*TS(n) donde m=cant_iteraciones(for(m;S))
Twhile B do S (n)=m*(TB(n) + TS(n)) donde m=cant_iteraciones(while B do S)
Tcall P(n) = TS(n) donde procedure P; begin S end
Tf(e)(n) = Tx:=e(n) + TS(n) donde function f(x); begin S end
ED - Arreglos y listas:
Secuencias:
Una secuencia de elementos [a1,a2,,an] tiene:
-
Una longitud n
Primer elemento (a 1)
Cada elemento ai (i=2,,n-1) tiene siguiente a i-1
Cada elemento ai(i=2,,n) tiene previo a i+1
Los elementos son homogneos (del mismo tipo)
Arreglos
Archivos
Lista enlazada
Lista doblemente enlazada: cada nodo conoce un elemento, el nodo anterior y el nodo
siguiente. Hay dos maneras de implementar una lista doblemente en lazada, una es
manteniendo referencia al primer y ltimo elemento, o bien usando nodos centinela al
principio y al final para evitar casos especiales al insertar y eliminar.
Lista circular: cada nodo conoce al nodo siguiente y el ltimo nodo conoce al primero
TDA pila:
Es una coleccin de objetos actualizada usando una poltica LIFO (last in firts out)
Operaciones:
-
Aplicaciones de la pila:
Implementacin:
Usando un arreglo: El tipo de la pila es guardado en una variable t, donde t es el ndice en
la pila. Cuando t =-1 la pila esta vaca. La cantidad de elementos es t+1. Cada mtodo corre en
tiempo constante O(1). Se mantiene una constante CAPACITY para indicar el tamao total del
arreglo. Al escoger un numero arbitrario de CAPACITY, generalmente grande, se est ocupando un
espacio en memoria que seguramente no se va a utilizar. Por el contrario, si se quieren agregar
elementos a la pila se lanzara una excepcin, o bien puede aumentarse el tamao del arreglo. Esta
implementacin con un arreglo es muy til cuando se tiene un valor estimado de la cantidad de
elementos que se agregaran a la pila
Usando una estructura enlazada: el tope de la pila est en la cabeza de la estructura. Las
operaciones son en tiempo constante O(1) y el espacio ocupado en memoria es O(n) donde n es la
cantidad de elementos de la estructura. Todas las inserciones y retiros se hacen desde la cabeza
de la estructura
TDA Cola:
Es una coleccin de objetos actualizada siguiendo una poltica FIFO (first in first out)
Operaciones:
Aplicaciones:
Implementaciones:
Usando arreglo circular: la variable f indica el primer elemento de la cola, es decir el
primero en ser removido, la variable r seala la prxima celda habilitada del arreglo. La cola esta
vaca cuando f=r. para evitar ndices fuera del arreglo se utiliza el arreglo circular en donde las
variables f y r pasan a la posicin 0 del arreglo despus de haber llegado al final, esto se hace
usando mod n, donde n es la longitud del arreglo. La cola no puede tener ms de n-1 elementos. El
tamao de la cola es (n-f+r) al igual que la pila con arreglo solo es eficiente cuando conocemos una
First(): retorna la posicin del primer elemento de la lista; lanza error si la lista esta vaca.
Last(): retorna la posicin del ltimo elemento de la lista; lanza error si la lista est vaca.
Prev(p): retorna la posicin que precede al elemento en la posicin p; lanza error si p=first.
Next(p): retorna la posicin del elemento que sigue al elemento en la posicin p; lanza
error si p=last.
set(p,e): reemplaza el elemento en la posicin p con e; retornando el elemento que estaba
antes en la posicin p.
addFirst(e): inserta un nuevo elemento e como primer elemento.
addLast(e): inserta un nuevo elemento e como ltimo elemento.
addBefore(p,e): inserta un nuevo elemento e antes de la posicin p.
addAfter(p,e):inserta un nuevo elemento e luego de la posicin p.
Ventajas:
addBefore y addAfter tiene orden O(1)
no hay casos especiales como testear que se inserta al principio de la lista o la lista est
vaca ya que siempre est al menos la celda de encabezamiento.
Desventajas:
addLast, Last y Prev siguen teniendo orden lineal en la cantidad de elementos de la lista.
Tercera implementacin: Usa una lista simplemente enlazada y mantiene una referencia al
primer y ltimo elemento, la posicin puede ser directa (sin nodo dummy) o indirecta (con nodos
dummy).
Ventajas:
addLast(e) y last() tienen orden O(1).
Desventajas:
hay casos especiales cuando se elimina al principio y al final, sobre todo cuando la lista
mide 1.
prev(p) sigue siendo de orden lineal en la cantidad de elementos de la lista (hay que
recorrer desde el principio).
Cuarta implementacin: Usa una lista doblemente enlazada con referencia al primer y
ltimo nodo y dos celdas de encabezamiento (una al principio y otra al final)
Ventajas:
cada nodo conoce el siguiente nodo y al nodo anterior.
todas las operaciones tienen orden 1.
Desventajas:
mayor uso de espacio.
Iteradores:
Un iterador es un patrn de diseo que abstrae el recorrido de los elementos de una
coleccin. Un iterador consiste en una secuencia S, un elemento actual corriendo sobre S, y una
manera de avanzar al siguiente elemento de S, hacindolo el nuevo elemento actual.
Mtodos de un elemento iterador:
rbol:
Un rbol T se define como un conjunto de nodos almacenando elementos tales que los nodos
tienen una relacin padre-hijo, que satisface:
Definicin recursiva
Un rbol T es:
Arboles Ordenados:
Un rbol se dice ordenado si existe un orden lineal para los hijos de cada nodo, es decir, se
puede identificar el primer hijo, el segundo hijo y as sucesivamente. Tal orden se visualiza de
izquierda a derecha de acuerdo a tal ordenamiento.
Mtodos de rbol:
Position:
Mtodos de acceso:
Root(): retorna la raz del rbol, lanza error si el rbol esta vaco.
Parent(v): retorna el padre de V, y lanza error si v es la raz.
Children(v): retorna una coleccin iterable conteniendo los hijos del nodo v, si el rbol es
ordenado, children los mantiene en orden. Si v es una hoja children(v) es vaca.
Mtodos de consulta:
Mtodos genricos:
Metodos de modificacin:
Profundidad y altura:
Primera solucin:
Altura(T)
h0
para cada vrtice v en T hacer
si b es una hoja en T entonces
hmax(h,profundidad(T,v))
retornar h
Tiempo de ejecucin: Taltura(n) es igual a O(n2).
Segunda solucin:
Altura(T,v)
si v es una hoja en T entonces
retornar 0
sino
h0
para cada hijo w de v en T hacer
hmax(h,altura(t,w))
retornar 1+h
Tiempo de ejecucin: Taltura(n) es igual a O(n2).
Recorridos: un recorrido de un rbol T es una manera sistemtica de visitar todos los nodos de T.
Por niveles:
o Nivel: es un subconjunto de nodos que tienen la misma profundidad.
o Recorrido por niveles: visita todos los nodos con profundidad p antes de recorrer
todos los nodos de p+1.
Algoritmo:
Niveles(T)
Colanew cola()
Cola.enqueue(t.root())
Cola.enqueue(null) //esto sirve para detectar el fin de lnea
mientras not cola.isEmpty() hacer
vcola.dequeue()
si v es distinto de null entonces
vistar(T,v)
para cada hijo w de v en T hacer
cola.enqueue(w)
sino
imprimir fin de lnea //accin al terminar un nivel
si not cola.isEmpty() entonces
cola.enqueue(null)
Tiempo de ejecucin: sea hi la cantidad de hijos del nodo i
T(n)= c1+ni=1 (c2+c3hi)=c1+c2n+c3(n-1)=O(n).
Representacin de arboles
-
Representacin lista de hijos: cada nodo conoce su rotulo (elemento) y la lista de sus
nodos hijos. El rbol conoce el nodo raz del rbol.
Padre + lista de hijos [GT]: el rbol conoce la raz. Cada nodo conoce el rotulo, la lista de
nodos hijos y el nodo padre.
Hijo extremo izquierdo - hermano derecho: cada nodo conoce su rotulo y la identidad de
su hijo extremo izquierdo y de su hermano derecho (se puede combinar con la
representacin del padre de ser necesario).
Arboles Binarios:
Un rbol binario es un rbol ordenado que cumple:
1. Cada nodo tiene a lo sumo dos hijos.
2. Cada nodo hijo es o bien, hijo izquierdo o hijo derecho.
3. El hijo izquierdo precede al hijo derecho en el orden de los hijos del nodo.
Un subrbol que tiene como raz al hijo izquierdo, se llama subrbol izquierdo, anlogamente
para el derecho. En un rbol binario propio, cada nodo tiene 0 o 2 hijos. Si un rbol binario no es
propio entonces es impropio.
Aplicaciones:
Sirve para representar los resultados asociados a un conjunto de preguntas con respuesta si
o no. Cada nodo interno se asocia con una pregunta. Se comienza en la raz y con cada pregunta
se va a la izquierda o a la derecha dependiendo de la respuesta. Cuando se llega a una hoja se
tiene un resultado al cual se llega al partir de las respuestas dados en los ancestros de la hoja.
Una expresin aritmtica puede representarse con un rbol binario. Las hojas almacenan
constantes o variables. Los nodos internos almacenan los operadores (+,-,*,/):
Calcular un rbol de expresin aritmtica: cada nodo en un rbol de expresin tiene un valor
asociado:
Algoritmo:
Evaluar(rbol_exp)
si rbol_exp es una hoja entonces
retornar el valor del rotulo de rbol_exp
sino
oprotulo de raz de rbol_exp
v1 evaluar(left(rbol_exp))
v2 evaluar(right(rbol_exp))
retornar aplicar(op,v1,v2)
Operaciones de ABB (el rbol binario es una especializacin de Tree que adems soporta los
mtodos de acceso adicionales):
Mtodos de modificacin:
addRoot(e): (o createRoot(e)) agrega un nodo raz con rotulo e, lanza error si ya hay una
raz.
insertLeft(v,e): crea un nodo w hijo izquierdo de v con rotulo e, lanza error si v ya tiene
hijo izquierdo.
insertRight(v,e): anlogo a insertLeft.
remove(v): elimina el nodo v (si v tiene un hijo, reemplaza a v por su hijo, si v tiene 2 hijos,
entonces ocurre un error).
attach(v,T1,T2): setea T1 como hijo izquierdo de v y T2 como hijo derecho de v (error si v no
es hoja).
Nota: una cola con prioridad almacena sus elementos de acuerdo a su prioridad relativa y no
expone una nocin de posicin a sus clientes.
Clave vs prioridad
-
Comparacin de claves con rdenes totales: una cola con prioridad necesita un criterio de
comparacin que sea un orden total para poder resolver siempre la comparacin entre
prioridades. es un orden total si y solo si:
Implementaciones:
lista no ordenada:
Insert: Se inserta al principio de la lista.
Min, removeMin: Para hallar el mnimo o removerlo es necesario recorrer toda la lista.
lista ordenada:
Insert: Para insertar en forma ordenada es necesario recorrer toda la lista en el peor
caso.
Min, removeMin: El mnimo es el primer elemento de la lista.
Propiedad de orden del heap (rbol parcialmente ordenado): en un heap T, para cada
nodo v distinto de la raz, la clave almacenada en v es mayor o igual que la clave
almacenada en el padre de v.
Propiedad de rbol binario completo: un heap T con altura H es un rbol binario completo
si los nodos de los niveles 0, 1, 2,, h-1 tiene 2 hijos y el nivel h-1 todos los nodos internos
estas a la izquierda de las hojas y hay a lo sumo un nico nodo con un hijo (que debe ser
izquierdo).
La cantidad n de nodos mnima ser con el nivel h-1 lleno y un nodo en el nivel h:
n 1+2+4++2h-1+1 = 2h-1+1 = 2h
Luego, es h log2n.
direccin, telfono, correo electrnico, etc. Un mapeo puede ser interpretado como una funcin
de dominio K y codominio V. Un mapeo puede ser interpretado como un conjunto de entradas
(k,v) donde k tiene tipo K y v tiene tipo V.
Operaciones de TDA Mapeo
Dado un mapeo M:
-
Diccionarios
Un diccionario almacena pares clave-valor (k,v) (como los mapeos). Las claves son de tipo K y
los valores de tipo V genricos (como los mapeos). A diferencia de los mapeos, un diccionario
puede almacenar claves repetidas. Existen dos tipos de diccionarios:
-
Operaciones:
Dado un diccionario D no ordenado:
Tabla Hash:
Una de las formas ms eficientes de implementar un mapeo o diccionario es en ciertos
casos usando una tabla hash. Aunque, como vimos antes, el tiempo de ejecucin de las
operaciones de un mapeo con n entradas y una tabla hash es de O(n), las tabla hash puede
usualmente hacer que las operaciones sean O(1). En general, una tabla hash consiste de dos
componentes, un arreglo de buckets y una funcin hash
-
Hash abierto: consiste en mantener en cada componen de esta tabla hash una lista de
entradas. Las colisiones determinan ms de un elemento en cada lista. Para buscar,
insertar o eliminar una entrada a partir de una clave, aplicamos la funcin hash sobre
dicha clave, accedemos de forma constante al bucket y recorremos la lista de entradas
arreglo de buckets: un arreglo de cubetas para implementar una tabla de hash es un
arreglo A de n componentes, donde cada celda de A es una coleccin de pares clave-valor
funcin de hash H: dada una clave k y un valor v, h de k es un entero en el intervalo [0,n-1]
tal que la entrada (k, v) se inserta en la cubeta A[H(k)]
colisin: dada 2 claves k1 y k2 tales que k1 k2, se produce una colisin cuando H(k1)=H(k2)
(las entradas de una cubeta tienen claves colisionadas)
Paso 1 (hash code): dada una clave k, obtener un nmero entero llamado cdigo de hash a
partir de K.
Paso 2 (funcin de compresin): a partir del cdigo de hash obtener un valor entre 0 y n-1
(mdulo de n [(ai+b)mod p]mod n donde ay b son enteros al azar y p es un primo mayor
a n).
Hash cerrado: En hash cerrado se tiene un arreglo de N buckets. Cada bucket almacena a
lo sumo una entrada. Dada la clave k y un valor v la funcin de hash H indica cual es la
componente H(k) del arreglo en la cual se almacena la entrada (k,v). Dada dos claves k1 y
k2 tales que k1 k2, si H(k1)=H(k2) entonces se produce una colisin.
Lineal (Lineal Probing): si tratamos de insertar una entrada en un bucket A[i] que ya est
ocupado (H(k)=i), entonces tratamos de colocarlo en A[(i+1) mod N] y si ya est ocupado
A[(i+2) mod N] y asi sucesivamente hasta encontrar un lugar libre. Este mtodo conserva
espacio pero complica a la hora de remover. Adems la bsqueda a travs de muchas
celdas de la tabla hash ralentiza el proceso de bsqueda considerablemente.
Cuadrtica (quadratic Probing): involucra iterablemente tratar en los buckets
A[(i+f(j))modN] donde j es 0,1,2, y f(j)=j2. Aunque N sea primo esta estrategia podra no
encontrar un bucket vaco en A si el arreglo de buckets esta medio lleno.
Hash doble (Double Hashing): elegimos una segunda funcin hash H2, y si H mapea alguna
entrada a un bucket ocupado, entonces se trata con los buckets A[(i+f(j))modN] donde j es
0,1,2, y f(j)=j*H2(k). la segunda funcin hash no debe estar evaluada en 0. Una opcin
comn es H2(k)=q-(k mod q) para algn numero primo q<N, N debera ser primo tambin.
Estos mtodos ahorran ms espacio que el hash abierto pero no son necesariamente ms
rpidos. En resumen, si el espacio es un problema se deberan utilizar los mtodos de hash
cerrado, de lo contrario los mtodos de hash abierto resultan ser eficaz
Ventajas y desventajas
- Del lineal: el hashing lineal tiende a agrupar entradas con claves con mismo valor de hash.
Si el arreglo es muy pequeo, se mezclan las claves ki con distinto hash y la bsqueda se
hace muy lenta porque degenera en buscar linealmente en un arreglo. Para hacer que
esto funcin N tiene que ser mucho mayor que n con lo que las claves se agrupan por su
valor de hash ([GT] sugiere que n/N sea menor que 0.5=).
Del cuadrado: la ventaja es que evita los patrones de agrupamiento de hash lineal pero
crea otro tipo que se llama agrupamiento secundario. Si N no es primo, puede no
encontrar un slot vaco aunque exista.
Captulo 9 de [GT]
rbol binario de bsqueda (ABB)
Un ABB es una estructura de datos til para implementar conjuntos, mapeos y diccionarios. En
un ABB las claves en los nodos se hallan ordenadas de una manera particular. El tiempo de
insertar, recuperar y eliminar es proporcional a la altura de ABB. Si el rbol tiene n claves, la altura
del ABB se halla entre el log2n y n. una ABB es un rbol binario tal que:
Es vaco.
Es un nodo con rotulo k e hijos T izq y Tder tales:
K claves de Tizq.
K claves de Tder.
Tizq y Tder son ABB.
Insercin en un ABB: las nuevas claves siempre se insertan como hijo de un nodo hoja
Algoritmo:
Insertar(k, nodov)
//comienza en la raz
si nodov es vaco entonces
Crear un nodo hoja con rotulo k
sino
si k < clave(nodov) entonces
Insertar(k,hijo izquierdo de nodo v)
sino
si k < clave(nodov) entonces
Insertar(k, hijo derecho de nodo v)
sino
si k = clave(nodov) entonces
Reemplazar rotulo de nodo v
Tiempo de ejecucin: sea h = altura de ABB y sea n = cant claves de ABB
Bsqueda:
Buscar(k,nodov)
//comienza en la raz
si el nodov es vacio entonces
return k no se encuentra en ABB
sino
si clave(nodov)=k entonces
return k si se encuentra en ABB
sino
si clave(nodov)>k entonces
return buscar(k, hijo izquierdo nodov)
sino //clave(nodov)<k
return buscar(k, hijo derecho nodov)
Tiempo de ejecucin: O(log2n) si el rbol esta balanceado y O(n) si no lo est.
Eliminacin:
Implementacin de mapeo con ABB: los nodos en lugar de solo claves tienen entradas (k, v).
Implementacin de diccionario:
Opcin 1 (ms sencilla): los nodos tienen una clave y una lista de entradas con la misma
clave. Tfind(n) = O(h+s) con n= cant entradas, h= altura de ABB y s= largo de la lista de
entradas.
Opcion2 (ms compleja): los nodos tienen una entrada y las claves repetiras se ramifican a
la derecha. Tfind(n) = O(h) (pero ojo, ahora h es potencialmente mayor a la altura de la
opcin 1). Capito 10 de [GT].
Grafos:
Un grafo G=(V,E) es un conjunto V de vrtices (o nodos) y un conjunto E, contenido en
VxV, de aristas o arcos. Intuitivamente E permite representar una relacin entre elementos de V.
TDA Grafo
El tipo de dato abstracto exporta 3 sorts:
-
Graph<V;E>: es un grafo pesado de vrtices con rtulos de tipo V y arcos con rtulos de
tipo E.
Vertex<V>: la posicin de un vrtice con rotulo de tipo V.
Edge<E>: la posicin de un arco con rotulo de tipo E.
Mtodos de Graph
-
Vrtices(): retorna una coleccin iterable con todos los vetices del grafo
Edges(): retorna una coleccin iterable con todos los arcos del grafo.
incidenEdeges(v): retorna una coleccin iterable con todos los arcos incidentes sobre un
vrtice v.
emegergentEdges(v): (o successorEdges) retorna una coleccin iterable con todos los
arcos emergentes de un vrtice v.
opposite(v,e): retorna el otro vrtice w del arco e = (v,w). Ocurre un error si e no es
incidente o emergente de v.
endVertices(e): retorna un arreglo (de dos componentes) conteniendo los vrtices del arco
e.
areAdyacente(v,w): testea si los vrtices v y w son adyacentes.
replace(v,x): remplaza el rotulo del vrtice v con x.
replace(e,x): remplaza el rotulo del arco e con x.
insertVertex(x): inserta y retorna un nuevo vrtice con rotulo x.
insertEdge(v,w,x): inserta un arco con rotulo x entre los vrtices v y w.
insertDirectedEdge(v,w,x): inserta un arco dirigido con rotulo x entre los vrtices v y w.
removeVertex(v): elimina el vrtice v y todos sus arcos adyacentes y retorna el rotulo de v.
removeEdge(e): elimina el arco e y retorna el rotulo almacenado en e.
Lista de arcos:
Lista de adyacencia:
Matriz de adyacencia:
Captulo 13 de [GT]
Recorridos de Grafos
-
Algoritmo:
DFS( G : Grafo; v : Vrtice )
Marcar a v como visitado
para cada arco e en G.incidentEdges(v) hacer
si e no est visitado entonces
w G.opposite(v, e )
si w no est visitado entonces
etiquetar a e como arco de descubrimiento
DFS( G, w )
sino
etiquetar a e como arco de retroceso
Tiempo de ejecucin:
TDFS(n,m) = O(n+m) con lista de adyacencia
TDFS(n,m) = O(n2) con matriz de adyacencia
TDFS(n,m) = O(n+m) con arcos decorados (asumiendo operaciones de mapeo en O(1))
Hallar el camino ms corto (en calidad de arcos) entre dos vrtices (en O(n+m)).
Captulo 13 de [GT].
Algoritmos para encontrar caminos en Digrafos pesados con nmeros reales
-
DFS con bactracking, marca y desmarca: Permite encontrar un camino de costo mnimo
entre dos vrtices v y w. Al comienzo, el camino actual es una lista vaca. El costo del
camino es la suma de los pesos de los arcos del camino.
Algoritmo:
HallarCaminoMinimo(G, origen, destino, camino_actual, camino_minimo)
origen.put( Estado, Visitado )
camino_actual.addLast( origen )
si origen = destino entonces
Si costo( camino_actual ) < costo( camino_minimo ) entonces
camino_minimo camino_actual
Sino
para cada adyacente v de origen en G hacer
si v. get ( Estado ) = NoVisitado entonces
HallarCaminoMinimo( G, v, destino, camino_actual, camino_minimo )
camino.remove( camino.last() ) //Backtracking
origen.put( Estado, NoVisitado )
Tiempo de ejecucin: TcaminoMin(n,m) = O(n!)
-
Dijkstra: Permite hallar todos los camino de costo mnimo entre un vrtice v y todos los
otros vrtices. Supongamos un Digrafo G=(V,E) tal que cada arco tiene costo no negativo.
Hay un vrtice que se conoce como la fuente. El costo del camino es la suma de los pesos
de los arcos del camino. El algoritmo mantiene un conjunto S con los vrtices cuyo camino
con la distancia ms corta es conocida. S es inicialmente contiene slo la fuente. En cada
paso se agrega a S el vrtice v cuya distancia a la fuente es tan cercana cmo es posible. El
algoritmo termina cuando S contiene todos los vrtices. D(v) contiene la distancia a v
desde la fuente.
Algoritmo:
Dijkstra //Asumimos que la fuente es 1
S{1}
para i 2 a n hacer
D(i) peso del arco de 1 a i // si no hay arco
P(i) 1 //Para ir a i pasar por 1 (camino directo)
para i 1 a n-1 hacer
elegir vrtice w en V-S tal que D(w) es mnimo
agregar w a S
para cada vrtice v en V-S hacer
si D(w) + peso_arco(w,v) < D(v) entonces
D(v) D(w) + peso_arco(w,v)
P(v) w
Floyd: Permite hallar el camino de costo mnimo entre cada par de vrtices v y w. Dado un
Digrafo pesado G=(V,A) donde cada arco tiene un peso no negativo. Queremos calcular los
caminos de costo mnimo de todos los vrtices a todos los vrtices. Supongamos que C(i,j)
de A. Usaremos una matriz A de nxn tal que inicialmente A(i,j)=C(i,j), o si no hay arco
entre i y j. En la iteracin k-sima veremos si actualizamos a A de acuerdo a:
Ak(i,j) = min(Ak-1(i,j), Ak-1(i,k) + Ak-1(k,j)).
k
Ak-1(k,j)
Ak-1(i,k)
i
Ak-1(i,j)
Algoritmo
Floyd
Para i1..n hacer
para j 1..n hacer
si hay arco (i,j) entonces A(i,j) C(i,j)
sino A(i,j)
P(i,j) 0 //por defecto el camino es directo
para i 1 .. n hacer
A(i,i) 0
para k 1..n hacer
para i 1..n hacer
para j 1..n hacer
si a(i,k) + a(k,j) < a(i,j) entonces
a(i,j) a(i,k) + a(k,j)
p(i,j) k
Tiempo de ejecucin: O(n3).
Recuperacin del camino en Floyd
Algoritmo
//Recupera el camino de i a j y lo almacena en cola
RecuperarCamino( P, cola, i, j )
k P(i,j)
si k 0 entonces
RecuperarCamino( P, cola, i, k )
cola.enqueue( k )
RecuperarCamino( P, cola, k, j )
Procesamiento de Texto
Tries: un trie es un rbol que se usa para implementar pattern matching en forma eficiente. La
aplicacin fundamental es la recuperacin. Un trie se usa para implementar un conjunto S de
String o un mapeo M de String en un tipo E. Un trie es un rbol que factoriza prefijos comunes
entre las cadenas del conjunto S o claves de M. Los caminos de la raz a las hojas representan
las palabras de S o las claves de M.
Definicin de Trie: Sea S un conjunto de string sobre un alfabeto . Un trie para S es un rbol
ordenado T tal que:
Propiedades de un Trie: Un trie almacenando una coleccin S de s strings de longitud total n sobre
un alfabeto de tamao d cumple:
Orden de tiempo de un Trie: Sea un conjunto S implementado con nodo trie T sobre un alfabeto .
Sea s la cardinalidad de S, d la cardinal de , y m el largo de un string a procesar:
Tinsert(s,d,m) = O(m)
Tlookup(s,d,m) = O(m)
Tdelete(s,d,m) = O(dm)
Aplicaciones de un Trie: Word matching: Dado un documento determinar todas las apariciones de
una palabra determinada. La solucin es construir un trie donde por cada palabra se almacena la
lista de posiciones (una lista de enteros) de las apariciones de la palabra.
Captulo 12 de [GT]
almacena la lista L de documentos web donde aparece t. El mapeo se puede implementar con
un trie. La lista L contiene las URLs de los documentos y la copia encontrada por el buscador
(la lista se almacena en disco). En general no se almacenan las stop words (artculos,
preposiciones, etc). Los trminos se pueden stemmizar (quedarse slo con la raz). La lista L
puede ser una cola con prioridad donde los documentos se rankean por importancia.
Compresin de datos
La compresin de datos consiste en la reduccin del volumen de informacin tratable
(procesar, transmitir o grabar). En principio, con la compresin se pretende transportar la
misma informacin, pero empleando la menor cantidad de espacio.
Compresin sin prdida de informacin: Los datos antes y despus de comprimirlos son
exactos en la compresin sin prdida. En el caso de la compresin sin prdida una mayor
compresin solo implica ms tiempo de proceso. Se utiliza principalmente en la
compresin de texto.
Compresin con prdida de informacin: Puede eliminar datos para reducir an ms el
tamao, con lo que se suele reducir la calidad. Hay que tener en cuenta que una vez
realizada la compresin, no se puede obtener la seal original, aunque s una
aproximacin cuya semejanza con la original depender del tipo de compresin. Se utiliza
principalmente en la compresin de imgenes, videos y sonidos.
Huffman: En lugar de usar un nmero fijo de bits para codificar cada carcter de un string X,
los caracteres que ms se usan se codifican con menos bits y los que menos se usan se
codifican con ms bits. Por cada carcter es necesario conocer su frecuencia de aparicin. Es
decir, por cada carcter c tendremos f(c) que es la cantidad de apariciones de c en la cadena X
a comprimir. La concatenacin de los bits de la compresin de los caracteres de la cadena
forman el string comprimido.
Cdigo prefijo: Para evitar ambigedades, no va a haber ningn cdigo que sea prefijo de otro.
Huffman (Idea)
Construye un rbol binario T que representa la codificacin para una cadena X. Cada nodo,
excepto la raz, representa un bit del cdigo. El hijo izquierdo representa un 0 y el derecho un
1. Cada hoja representa un carcter c. La codificacin de un carcter c se define como la
secuencia de bits determinada por el camino de la raz a la hoja que contiene a c en el rbol T.
Cada hoja tiene una frecuencia f(v) correspondiente a la frecuencia de carcter c almacenado
en v. Cada nodo interno tiene una f(v) que corresponde a la suma de la frecuencias de los
caracteres en dicho subrbol.
Algoritmo
Huffman (X)
Entrada: Un string X de longitude n sobre alfabeto de tamao d.
Salida: rbol para codificar X.
Computar la frecuencia f(c) para cada carcter c de X
Crear una cola con prioridad C
para cada carcter c en X hacer
crear un rbol binario hoja T con rtulo c
insertar T en Q con prioridad f(c)
mientras Q.size() > 1 hacer
f1 Q.min().key();
T1 Q.removeMin();
f2 Q.min().key();
T2 Q.removeMin();
Crear un Nuevo rbol binario T con hijo izquierdo T 1 e hijo derecho T2
Insertar T en Q con prioridad f1+f2
retornar el rbol Q.removeMin()
Arboles Balanceados
AVL: Es un rbol binario de bsqueda con una restriccin para mantener una altura del rbol
proporcional al logaritmo de la cantidad de nodos del rbol. El tiempo de bsqueda, insercin
y borrado en un rbol binario de bsqueda es lineal en la altura del rbol. Entonces, si n es la
cantidad de elementos de un rbol T, tendramos as que T(n) = O(log2(n)).
Propiedad del balance de la altura
Para cada nodo interno v de T, las alturas de los hijos difieren a lo sumo en 1. Cualquier ABB
que satisface esta propiedad se dice rbol AVL.
Eliminacin en un AVL
Es idntica a la de un ABB pero en este caso, cada vez que se sale de la recursin es necesario
verificar de qu lado se elimin un nodo para realizar el rebalanceo.
rbol 2-3: Un rbol 2-3 es un rbol tal que cada nodo interno (no hoja) tiene dos o tres hijos, y
todas las hojas estn al mismo nivel. La definicin recursiva es:
T es un rbol 2-3 de altura h si
T es vaco (es decir de altura -1)
T es de la forma
Donde n es un nodo y Ti y Td son rboles 2-3, cada uno de altura h-1.
Ti se dice subrbol izquierdo y Td subrbol derecho.
T es de la forma
Donde n es un nodo y Ti, Tm y Td son rboles 2-3, cada uno de
altura h-1. Ti se dice subrbol izquierdo, T m se dice
subrbol medio y Td subrbol derecho.
Propiedad: Si un rbol 2-3 no contiene ningn nodo con 3 hijos entonces su forma
corresponde a un rbol binario lleno.
rbol 2-3 de bsqueda
Un rbol 2-3 es un rbol 2-3 de bsqueda si T es un rbol 2-3 tal que:
T es de la forma
n contiene dos claves k1 y k2, y k1 es mayor que las claves de
Ti, k1 es menor que las claves de Tm, k2 es mayor que las claves
de Tm, k2 es menor que las claves de Td. Ti, Tm y Td son rboles
2-3 de bsqueda.
Reglas de Bsqueda
o Si n tiene dos hijos, entonces contiene una entrada
o Si n tiene tres hijos, entonces contiene dos entrada
o Si n es una hoja, entonces contiene una o dos entrada
Algoritmo
queda con el valor ms pequeo, L2 con el ms grande, y el del medio se manda al padre P de
L. Los nodos L1 y L2 se convierten en los hijos de P.
Si P tiene slo 3 hijos (y 2 valores), terminamos. En cambio, si P tiene 4 hijos (y 3 valores), hay
que partir a P igual que como hicimos una hoja slo que hay que ocuparse de sus 4 hijos.
Partimos a P en P1 y P2, a P1 le damos la clave ms pequea de los dos hijos de la izquierda y a
P2 le damos la clave ms grande y los dos hijos de la derecha.
Luego de esto, la entrada que sobra se manda al padre de P en forma recursiva. El proceso
termina cuando la entrada sobrante termina en un nodo con dos entradas o el rbol crece 1
en altura (al crear una nueva raz).
rboles 2-3-4: Un rbol 2-3-4 tiene hojas con 1,2 o 3 claves, y sus nodos internos contienen:
1 clave y 2 hijos
2 claves y 3 hijos
3 claves y 4 hijos
Todas las hojas tienen la misma profundad.
Insercin en un rbol 2-3-4: Es igual que en un rbol 2-3 excepto que cuando hay overflow (4
claves en un nodo), se parte el nodo y van 2 claves al nodo izquierdo y 1 clave al nodo de la
derecha, la tercera clave va al padre y as sucesivamente.
Captulo 10 de [GT]
Ordenamiento
Dado un arreglo a de n componentes enteras a[0], a[1], , a[n-1] se desea obtener una
permutacin de a tal que a[0] a[1] a[n-2] a[n-1].
Multipasada: O(n2)
o
Seleccin (selection sort): Haremos n-1 pasadas sobre el arreglo a. En la pasada isima, encontraremos el i-simo menos elemento del arreglo y lo
intercambiaremos con a[i].
Quick sort: Quick Sort en promedio corta el arreglo por la mitad, como no hace el Merge,
en promedio es ms eficiente que el Merge sort con una complejidad de O(n*log2(n)). Sin
embargo, el peor caso se da cuando se quiere ordenar un arreglo ordenado, se invoca
recursivamente con una parte que mide 1 y la otra n-1, dando una complejidad de O(n2).
Algoritmo
Quick Sort
si la lista es no vaca entonces
1. Dividir la lista en dos de tal manera que los tems en la
primera mitad vengan antes que los tems en la segunda
mitad.
2. Ordenar con Quick Sort la primera mitad.
3. Ordenar con Quick Sort la segunda mitad.
Serializacin
La serializacin implica salvar el estado actual de un objeto en un stream y luego poder
recuperar el objeto equivalente de tal stream.
Archivos de accesos directo
Los archivos de acceso directo (Random Access File) permiten:
Tendremos una operacin ms que se llama seek que recibe el nmero de byte al que hay que
mover el puntero de archivo para realizar la prxima operacin de lectura o escritura. Para utilizar
seek es necesario conocer el tamao del registro del archivo subyacente.
Archivos Indizados (o Indexados)
Los archivos indexados tuenen un orden virtual determinado por el ordenamiento de una clave.
-
rbol B
El rbol B generaliza la idea del rbol 2-3 con un nmero M de claves en cada nodo. El tiempo de
bsqueda y actualizacin es proporcional al log M(cantidad de claves). Se puede desperdiciar
espacio en os nodos.
rbol B+
El rbol B+ almacena entradas (clave, valor) slo en las hojas, los nodos internos almacenan solo
claves que sirven para guiar la bsqueda.
Sntesis
Estructura de Datos
Arreglo
Arreglo Ordenado
Pila
Cola
-
Ventajas
Insercin rpida.
Acceso rpido si el ndice es
conocido.
Bsqueda ms rpida con
respecto a los arreglos no
ordenados.
Rpido acceso al elemento
tope.
Rpida insercin.
Rpido acceso al elemento
frente.
Rpida insercin.
Desventajas
Bsqueda y eliminacin lenta.
Tamao fijo.
Lista Enlazada
rbol Binario
rbol Red-Black
rbol
rbol 2-3-4
Tabla Hash
Rpida eliminacin e
insercin.
Rpida bsqueda, insercin
y eliminacin (si el rbol
esta balanceado).
Rpida bsqueda.
Rpida insercin y
eliminacin.
Rpida bsqueda, insercin
y eliminacin.
El rbol se mantiene
siempre balanceado.
Muy rpido acceso si la
clave es conocida.
Rpida insercin.
Bsqueda lenta.
Algoritmo de eliminacin
complejo.
Implementacin compleja.
Su implementacin es
compleja.
Eliminacin lenta.
Acceso lento si la clave es
desconocida.
Utilizacin de memoria
ineficiente.
Acceso lento a los dems
elementos.
Heap
Grafo
Rpida insercin y
eliminacin.
Acceso directo al mayor
elemento.
Muchas situaciones de la
vida real son resueltos con
grafos.