Вы находитесь на странице: 1из 51

CONJUNTOS

DINÁMICOS
ESTRUCTURAS DE DATOS
CONJUNTOS DINÁMICOS

• Los conjuntos que son manipulados


mediante algoritmos, que crecen,
disminuyen o cambian con el tiempo, son
llamados conjuntos dinámicos

2
Fundamentos de Análisis y Diseño de Algoritmos
CONJUNTOS DINÁMICOS

• En las implementaciones de un conjunto


dinámico, cada elemento es representado
por un objeto cuyos campos pueden ser
examinados y manipulados si existe un
puntero al objeto.

• Algunos conjuntos dinámicos asumen que


uno de los campos de los objetos es un
campo llave.

3
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES

• Search(S,k): Una consulta que retorna un puntero


x a un elemento tal que key[x] = k, o NIL si el
elemento no pertenece al conjunto.

• Insert(S,x): Aumenta el conjunto con el elemento


apuntado por x.

• Delete(S,x): Dado un puntero x a un elemento,


borra x del conjunto.

4
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES

• Minimum(S): Retorna el elemento con la


menor llave.
• Maximum(S): Retorna el elemento con la
mayor llave.

• Successor(S,x): Dado un elemento cuya


llave es de un conjunto totalmente ordenado,
retorna el siguiente elemento mas grande,o
nil si x es el maximo elemento.

5
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES

• Predecessor(S,x): Una consulta que, dado un


elemento cuya llave es de un conjunto
totalmente ordenado, retorna el siguiente
elemento mas pequeño, o nil si x es el menor
elemento del conjunto.

6
Fundamentos de Análisis y Diseño de Algoritmos
PILAS

Definición:
Estructura de datos donde los elementos pueden ser
añadidos o removidos solo por un extremo.

Trabajan con filosofía LIFO (Last In- First Out ).

Ejemplos:
•Pila de llamadas a funciones recursivas
•Llamadas a subprogramas
•Evaluación de expresiones postfijas
•Equilibrado de símbolos

7
Fundamentos de Análisis y Diseño de Algoritmos
REPRESENTACIÓN DE PILAS

• Usando arreglos: Define un arreglo de una


dimensión (vector) donde se almacenan los
elementos.

1 2 3 4 5 6

TOPE: Apunta hacia el elemento que se encuentra en el


extremo de la pila.

8
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES BASICAS CON PILAS

PUSH (insertar).- Agrega un elementos a la pila en el


extremo llamado tope.

POP (remover).- Remueve el elemento de la pila que


se encuentra en el extremo llamado tope.

STACK-EMPTY.- Indica si la pila contiene o no


contiene elementos.

9
Fundamentos de Análisis y Diseño de Algoritmos
ALGORITMOS DE PILA

Stack-Empty(S)
1 if top[S] = 0
2 then return true
3 else return false

10
Fundamentos de Análisis y Diseño de Algoritmos
ALGORITMOS DE PILA

Push(S,x)
1. top[S]  top[S] + 1
2. S[top[S]]  x

Si a una pila llena se le aplica la


operación Push, se dice que la
pila esta overflow (desbordada en
su máxima capacidad).

11
Fundamentos de Análisis y Diseño de Algoritmos
ALGORITMOS DE PILA

Pop(S)
1 if Stack-Empty(S)
2 then error “underflow”
3 else top[S]  top[S] – 1
4 return S[top[S] + 1] Si a una pila vacía se
le aplica la operación
Pop, se dice que la
pila esta underflow
(desbordada en su
mínima capacidad).

12
Fundamentos de Análisis y Diseño de Algoritmos
Ejemplo

PUSH(S, A) PUSH (S,B) PUSH(S,C) POP(S)

Inicio:

C
B B B

A A A A

Tope 0 Tope Tope Tope


Tope

13
Fundamentos de Análisis y Diseño de Algoritmos
Aplicaciones de Pilas

Recursión

// Funcion factorial
public static int factorial(int n) {
if (n<=1) return 1;
else return n*factorial(n-1);
}

14
Fundamentos de Análisis y Diseño de Algoritmos
Aplicaciones de Pilas
Control de secuencia de programas.

• Las pilas son requeridas para implementar


el control de flujo de ejecución de un
programa con subprogramas (funciones,
procedimientos o métodos).
–Subprogramas recursivos o no recursivos
–Existen llamadas a ejecución de subprogramas.
–Un subprograma se ejecuta completamente
antes de retornar al punto donde fue llamado.

15
Fundamentos de Análisis y Diseño de Algoritmos
COLAS

Definición. Es una lista lineal de elementos en la que


las operaciones de insertar y eliminar se realizan en
diferentes extremos de la cola.
Trabajan con filosofía FIFO ( First In - First out), el
primer elemento en entrar es el primer elemento en
salir.

Ejemplos:

• Cola de programas en espera de ser ejecutados por


una computadora.
• Cola de tareas esperando por un recurso.

16
Fundamentos de Análisis y Diseño de Algoritmos
REPRESENTACIÓN USANDO
ARREGLOS

Las colas pueden ser representadas en arreglos


de una dimensión (vector) manteniendo dos
variables que indiquen el HEAD[] y TAIL[] de los
elementos de la cola.
1 2 3 4 5 6

A F S D Z

HEAD[Q]=1 TAIL[Q]=6
Al comienzo HEAD[Q]=TAIL[Q]=1

17
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES BÁSICAS EN COLAS
SIMPLES

ENQUEUE: Encolar
DEQUEUE: Desencolar

• Si la cola está vacía, un llamado a Dequeue causará


underflow.

• Cuando la cola está llena y un nuevo llamado a Enqueue


causará overflow.

18
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES CON COLAS

Enqueue(Q,x)
1 Q[tail[Q]]  x
2 if tail[Q] = length[Q]
3 then tail[Q]  1
4 else tail[Q]  tail[Q] + 1

19
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES CON COLAS

Dequeue(Q)
1 x  Q[head[Q]]
2 if head[Q] = length[Q]
3 then head[Q]  1
4 else head[Q]  head[Q] + 1
5 return x

20
Fundamentos de Análisis y Diseño de Algoritmos
LISTAS ENLAZADAS

1. Simples (con enlace simple)


2. Dobles (doblemente enlazadas)

• Existe diversas implementaciones de estas


estructuras.
• Las variaciones mas comunes implementan
listas circulares y listas con cabecera en sus
dos variaciones (simples y dobles)

21
Fundamentos de Análisis y Diseño de Algoritmos
LISTAS ENLAZADAS

• Colección lineal de elementos llamados nodos


• El orden de los nodos se establece mediante punteros
o referencias y existe un puntero/referencia especial
llamado inicio para localizar al primer elemento.

Ejemplos:
inicio
*Lista enlazada de 0 elementos
Información enlace

inicio
* Lista enlazada de 4 elementos
22
Fundamentos de Análisis y Diseño de Algoritmos
LOS NODOS DE LAS LISTAS

Un nodo se divide en 2 partes:


• Key: Contiene la información del elemento.
• Next: Contiene la dirección del siguiente nodo de
la lista.

Key next

Nodo

23
Fundamentos de Análisis y Diseño de Algoritmos
LISTAS DOBLES

• Estructura lineal de nodos


• Contienen dos campos de enlace: uno al elemento
anterior y otro al elemento siguiente de la lista.
• El primer nodo de la lista contiene nulo en su
enlace al elemento anterior y el último nodo de la
lista contiene nulo en su enlace al elemento
siguiente.

Estructura del Nodo: Prev Key Next

24
Fundamentos de Análisis y Diseño de Algoritmos
EJEMPLOS

Lista Vacía
inicio = fin =

Lista de un solo elemento

Head A

Lista de tres elementos

Head A B C

25
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES CON LISTAS

List-Search(L,k)
1 x  head[L]
2 while x != nil and key[x] != k
3 do x  next[x]
4 return x

26
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES CON LISTAS

List-Insert(L,x)
1 next[x]  head[L]
2 if head[L] != nil
3 then prev[head[L]]  x
4 head[L]  x
5 prev[x]  nil

27
Fundamentos de Análisis y Diseño de Algoritmos
OPERACIONES CON LISTAS

List-Delete(L,x)
1 if prev[x] !=nil
2 then next[prev[x]]  next[x]
3 else head[L]  next[x]
4 if next[x] != nil
5 then prev[next[x]]  prev[x]

28
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE DIRECCIONAMIENTO
DIRECTO

29
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

• Optimiza los recursos de memoria: Requiere


menos espacio de almacenamiento.

• Con hashing, el elemento es almacenado en


el slot h(k); esto es, una función hash h es
usada para encontrar el slot de la llave k.

• Problema: Colisiones. Puede haber mas dos


llaves que tengan el mismo valor hash

30
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Tabla de Hash

Universo de Claves 1
U
2
5 8 0 2
3
Función de
6 hash o 4
1 función de
mapeo 5
Claves 3
Almacenadas 6
(K) 4
7
7

8
9
9

31
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

HASHING CON ENCADENAMIENTO


32
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Operaciones de Hashig con Encadenamiento:

Chained-Hash-Insert(T,x)
List-Insert(T[h(key[x])], x)

Chained-Hash-Search(T,k)
List-Search(T[h(k)], k)

Chained-Hash-Delete(T,x)
List-Delete(T[h(key[x])], x)

Costos?

33
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

• Factor de Carga. α = n/ m

• Suposición de Hashing uniforme simple

• Teorema:
En una tabla hash en la cual las colisiones son resueltas
con encadenamiento, una búsqueda sin éxito toma un
tiempo O(1+ α), en promedio, bajo la suposición de
hashing uniforme simple.

• Igual una búsqueda con éxito (peor caso)

34
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Métodos para generar funciones hash

• Método de la Multiplicación:
1. Se multiplica la llave k por una constante A en el
rango 0 < A < 1 y se extrae la parte fraccionaria de
kA.

2. Se multiplica este valor por m y se toma el piso


del resultado.

h(k) = piso( m (k . A mod 1) )

Un buen valor para A es ( 5 − 1) / 2 = 0.6180339887…


35
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Métodos para generar funciones hash

• Método de la Multiplicación:

Ejemplo: Encontrar el slot que le corresponde a la llave


k= 123456 en una tabla hash con m = 10000 slots.

36
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Métodos para generar funciones hash

• Método de la División:

En el método de la división para crear funciones hash, se


asigna una llave k a uno de los m slots tomando el residuo
de k dividido por m.

La función hash es h(k) = k mod m.

Un buen valor para m es un número primo no cercano a una


potencia de 2.
37
Fundamentos de Análisis y Diseño de Algoritmos
TABLAS DE HASH

Métodos para generar funciones hash

• Método de la División:

Ejemplo: Encontrar el slot que le corresponde a la llave


k= 123456 en una tabla hash con m = 701 slots.

38
Fundamentos de Análisis y Diseño de Algoritmos
ARBOLES DE BUSQUEDA
BINARIA

29

35

39
Fundamentos de Análisis y Diseño de Algoritmos
PROPIEDAD DE UN ÁRBOL DE
BÚSQUEDA BINARIA

• Sea x un nodo en un árbol de búsqueda binaria. Si y es un


nodo del sub-árbol izquierdo de x, entonces la clave de y 
clave de x. Si y es un nodo del sub-árbol derecho de x,
entonces la clave de x  clave de y.
• Por ejemplo, dos árboles de búsqueda binaria son:

5 2
3
3 7
7
2 5 8
5 8
5

40
Fundamentos de Análisis y Diseño de Algoritmos
Ejemplo

• Dibujar el árbol de búsqueda binaria resultante


de organizar los datos de la siguientes
sucesiones de entrada:

–26, 38, 14, 19, 42, 40, 30, 10, 35, 17


–M, G, B, S, J, Q, H, W, U, Z
–(1000)2, (1101)2, (1001)2, (0001)2, (0000)2,
(0011)2, (1110)2, (1111)2

41
Fundamentos de Análisis y Diseño de Algoritmos
RECORRIDO DE UN ÁRBOL DE
BÚSQUEDA BINARIA

INORDER-TREE-WALK(x)
1. if x ≠ NIL
2. then INORDER-TREE-WALK(left[x])
3. print key[x]
4. INORDER-TREE-WALK(right[x])

Toma un tiempo Θ(n) recorrer un árbol de


búsqueda binaria de n nodos

42
Fundamentos de Análisis y Diseño de Algoritmos
RECORRIDO DE UN ÁRBOL DE
BÚSQUEDA BINARIA

Similarmente existen los algoritmos PREORDER- TREE-


WALK y POST-ORDER-TREE-WALK
PREORDER- POSTORDER-
TREE-WALK(x) TREE-WALK(x)
1.
1.
2.
2.
3.
3. 4.
4.

43
Fundamentos de Análisis y Diseño de Algoritmos
CONSULTAS EN A.B.B.

• Las operaciones básicas en A.B.B. son:


búsqueda de una llave almacenada en el
árbol (Search), también: Minimum,
Maximum, Successor y Predecessor.

• Cada una de estas operaciones pueden


realizarse en un tiempo O(h), donde h es la
altura del árbol.

44
Fundamentos de Análisis y Diseño de Algoritmos
BÚSQUEDA

TREE-SEARCH (x, k)
1 if x= NIL or k = key[x]
2 then return x
3 if k < key[x]
4 then return TREE-SEARCH(left[x], k)
5 else return TREE-SEARCH(right[x], k)25

Tiempo de ejecución: T(n) = O(h)

45
Fundamentos de Análisis y Diseño de Algoritmos
BÚSQUEDA

ITERATIVE-TREE-SEARCH(x, k)
1 while x ≠ NIL and k ≠ key[x]
2 do if k < key[x]
3 then x ← left[x]
4 else x ← right[x]
5 return x

46
Fundamentos de Análisis y Diseño de Algoritmos
MINIMUM AND MAXIMUM

TREE-MINIMUM
(x)
1 while left[x] ≠ NIL
2 do x ← left[x]
3 return x
TREE-MAXIMUM(x)
1 while right[x] ≠ NIL
2 do x ← right[x]
3 return x
47
Fundamentos de Análisis y Diseño de Algoritmos
SUCCESSOR AND PREDECESSOR

TREE-SUCCESSOR(x)
1 if right[x] ≠ NIL
2 then return TREE-MINIMUM (right[x])
3 y ← p[x]
4 while y ≠ NIL and x = right[y]
5 do x ← y
6 y ← p[y]
7 return y

48
Fundamentos de Análisis y Diseño de Algoritmos
INSERCIÓN
TREE-INSERT(T, z)
1 y ← NIL
2 x ← root[T]
3 while x ≠ NIL
4 do y ← x
5 if key[z] <= key[x]
6 then x ← left[x]
7 else x ← right[x]
8 p[z] ← y
9 if y = NIL
10 then root[T] ← z
11 else if key[z] < key[y]
12 then left[y] ← z
13 else right[y] ← z
49
Fundamentos de Análisis y Diseño de Algoritmos
EJEMPLO
TREE-INSERT(T, z)
1 y ← NIL
Usar el algoritmo de 2 x ← root[T]
inserción para insertar 3 while x ≠ NIL
el nodo con Key 16 en 4 do y ← x
el siguiente árbol: 5 if key[z] <= key[x]
6 then x ← left[x]
7 else x ← right[x]
8 p[z] ← y
9 if y = NIL
10 then root[T] ← z
11 else if key[z] < key[y]
12 then left[y] ← z
13 else right[y] ← z
50
Fundamentos de Análisis y Diseño de Algoritmos
ELIMINACIÓN

TREE-DELETE(T, z)
1 if left[z] = NIL or right[z] = NIL
2 then y ← z
3 else y ← TREE-SUCCESSOR(z)
4 if left[y] ≠ NIL 9 if p[y] = NIL
10 then root[T] ← x
5 then x ← left[y] 11 else if y = left[p[y]]
6 else x ← right[y] 12 then left[p[y]] ← x
13 else right[p[y]] ← x
7 if x ≠ NIL 14 if y ≠ z
8 then p[x] ← p[y] 15 then key[z] ← key[y]
16 copy y's satellite data into z
17 return y
51
Fundamentos de Análisis y Diseño de Algoritmos

Вам также может понравиться