Sunteți pe pagina 1din 44

Teoría y Aplicación de la Informática I

Definiciones

Tipos de datos

• Un tipo de dato determina el conjunto de valores al que pertenece


una constante, o que puede tomar una variable o expresión, o que
pueden ser generados por un operador o función

• También determina el conjunto de operaciones que se puede


aplicar al conjunto de valores

Cardinalidad

• El número de valores distintos que pertenecen a un tipo T se llama


cardinalidad de T

• La cardinalidad proporciona una medida de la cantidad de memoria


que se necesita para representar una variable x de tipo T

_____________________________________________________________________ 1
Estructuras de datos
Teoría y Aplicación de la Informática I

Tipos de Datos Elementales

Son tipos atómicos, sin estructura interna

• Tipos elementales normalizados, estándar o predefinidos

o Comprenden típicamente:
 los números enteros (integer)
 los números fraccionarios (real)
 los valores lógicos, falso y verdadero (boolean)
 caracteres de escritura (char)

o Incorporan un conjunto adecuado de operadores elementales.


Entre ellos son muy importantes, y en general se aplican a
todos los tipos de datos:
 Comprobación de igualdad: x=y
 Asignación a una variable x: x := y

El tipo integer

o Comprende un subconjunto de los enteros, cuyo tamaño varía


de computador a computador

o Todas las operaciones con datos de este tipo son exactas

o El proceso de cálculo se interrumpe cuando aparece un


resultado que está fuera del conjunto de números
representables en el computador

o Operadores normalizados:
 +
 -
 *
 div (división entera)
 mod (resto de la división entera)

_____________________________________________________________________ 2
Estructuras de datos
Teoría y Aplicación de la Informática I

El tipo real

o Designa un subconjunto de los números reales

o En la aritmética de tipo real se permite una cierta imprecisión,


dentro de los límites del error de redondeo producido por el
cálculo con un número finito de dígitos

o Operadores normalizados:
 +
 -
 *
 /

El tipo boolean

o Sus dos valores correspondientes son: true y false

o Operadores:
 ∨ u or (unión lógica)
 ∧ o and (conjunción lógica)
 ¬ o not (negación lógica)

El tipo char

o Comprende el conjunto de caracteres imprimibles

o El código ASCII es el más ampliamente admitido

o En general se puede asumir que:


 Contiene las 26 letras del alfabeto latino, los 10 dígitos
de la numeración árabe y signos de puntuación
 Contiene un carácter blanco o espacio

_____________________________________________________________________ 3
Estructuras de datos
Teoría y Aplicación de la Informática I

_____________________________________________________________________ 4
Estructuras de datos
Teoría y Aplicación de la Informática I

• Tipos elementales definidos por el usuario

Enumeración

o Definido por enumeración del conjunto de todos los posibles


valores
type T = (c1, c2, …, cn)
card (T) = n

o Ejemplos:
type forma = (rectángulo, cuadrado, elipse, círculo)
card (forma) = 4
var f: forma
f := rectángulo

type color = (rojo, amarillo, verde)


card (color) = 3
var c: color
c := verde

Subrango

o Útil cuando una variable puede tomar valores de cierto tipo en


un intervalo específico
type T = min .. max

o Ejemplo:
type año = 1900 .. 1999
card (año) = 100
var a: año
r := 1998

_____________________________________________________________________ 5
Estructuras de datos
Teoría y Aplicación de la Informática I

Tipos de Datos Estructurados

• Se definen nuevos tipos de datos en función de otros definidos


previamente

• Los valores de los tipos estructurados son usualmente


agrupaciones de valores componentes de los tipos constituyentes
definidos previamente

• Si solamente hay un tipo constituyente, esto es, si todos los


componentes son del mismo tipo, entonces éste se denomina tipo
base. Este es el caso de un array

• Como los tipos constituyentes, a su vez, pueden también ser


estructurados, pueden construirse jerarquías de estructuras. Los
componentes últimos de una estructura deben ser atómicos

• La cardinalidad de un tipo estructurado es el producto de las


cardinalidades de sus componentes

• Tipos de Datos Estructurados Estáticos


o Son las estructuras más básicas:
 arreglo o array
 registro o record
 fichero secuencial
o Son estáticos en la memoria

• Tipos de Datos Estructurados Dinámicos


o Estructuras más complicadas:
 Pila o stack
 Cola o queue
 lista enlazada o linked list
 árbol o tree
 grafo
o Son generadas dinámicamente durante la ejecución del
programa, y pueden variar de tamaño y de forma

_____________________________________________________________________ 6
Estructuras de datos
Teoría y Aplicación de la Informática I

La Estructura Array

• Estructura homogénea, todos sus componentes son del mismo


tipo base

• Estructura de acceso aleatorio, todos sus componentes pueden


seleccionarse arbitrariamente y son igualmente accesibles

• La definición de un tipo array T especifica tanto un tipo base T0


como un tipo índice Ti.

type T = array [ Ti ] of T0

Ejemplo: type Fila = array [1..5] of real


var x: Fila

Operaciones con los arrays

o Asignación mediante un constructor


x := T (c1, c2, … ,cn)

Ejemplo : x := Fila (0.5, 0.25, 0.125, 0.0625, 0.03125)

o Selección de un componente individual del array


x [i]

Ejemplo: Fila [2]

o Asignación o actualización selectiva


x [i] := y

Ejemplo: Fila [2] := 0.003

• Cardinalidad de un array T = array [ Ti ] of T0


card(T) = (card(T0)) card(Ti)
Ejemplo : card(Fila) = (card(real)) 5

_____________________________________________________________________ 7
Estructuras de datos
Teoría y Aplicación de la Informática I

• Los elementos constituyentes de un array pueden estar a su vez


estructurados

• Una variable de tipo array cuyos componentes son también arrays


se denomina matriz

Ejemplos:
M: array [1..10] of Fila
M: array [1..10] of array [1..5] of real
M: array[1..10, 1..5] of real

card (M) = (card (real)) 50

• M[i][j], o bien M[i, j] designa el componente j de la fila M[i], que es el


componente i de M

• Un array puede ser definido de n-dimensiones ampliando los


conceptos y definiciones directamente

Ejemplo:
N: array [1..10, 1..5, 1..2, 1..3] of real
var multi: N;
multi [3, 3, 3, 3] := 3

card (N) = (card (real)) 300

_____________________________________________________________________ 8
Estructuras de datos
Teoría y Aplicación de la Informática I

La Estructura Registro

• Un registro es una colección de información relativa a una entidad


particular

• Un campo es un ítem o elemento de datos elementales. Está


caracterizado por su tipo de datos

• Un registro es una colección de campos lógicamente relacionados,


que pueden ser tratados como una unidad por un programa

• Los registros organizados en campos se denominan registros


lógicos.

• Un registro físico o bloque es la cantidad más pequeña de datos


que pueden transferirse en una operación de entrada/salida

• Un registro lógico puede ocupar menos de un registro físico, un


registro físico o más de un registro físico

• Un archivo o fichero es una colección de registros relacionados


entre sí y organizados para un propósito específico

• La cardinalidad del tipo estructurado registro es el producto de las


cardinalidades de los tipos componentes

• El tipo registro T se define de la forma siguiente:

type T = record
s1: T1;
s2: T2;

sn: Tn
end

card (T) = card (T1) * card (T2) * … * card (Tn)

_____________________________________________________________________ 9
Estructuras de datos
Teoría y Aplicación de la Informática I

Ejemplos :
type Fecha = record
día : 1..31 ;
mes : 1..12 ;
año :1..2500
end

type Persona = record


nombre: array [1 .. 40] of char;
apellido: array [1 .. 40] of char;
nacimiento: Fecha ;
sexo: (masculino, femenino) ;
estadocivil: (soltero, casado, viudo)
end

• Ahora se pueden declarar las variables


var f : Fecha
var p : Persona

Operaciones con los registros

o Asignación mediante un constructor


x := T (x1, x2, …, xn)
donde los xi son valores de los tipos constituyentes Ti.

Ejemplos :
f := Fecha (4, 5, 1978)
p := Persona (‘Carlos’, ‘Acosta’, Fecha(10, 4, 1997),
masculino, soltero)

o Selección de un campo del registro


x.si

Ejemplos:
f.dia
p.nombre
p.estadocivil

_____________________________________________________________________ 10
Estructuras de datos
Teoría y Aplicación de la Informática I

o Actualización o asignación a un campo de un registro


x.si := xi
donde xi es un valor o expresión de tipo Ti

Ejemplos:
f.mes := 10
p.nombre := ‘Juan’
p.nacimiento.año := 1991

Programa que muestra como utilizar las variables registro

El siguiente programa tiene por objeto contar el número de personas,


representadas por la variable array personas, que son
simultáneamente femeninas y solteras

var personas: array [1..N] of Persona


contador, i: integer

contador := 0
for i := 1 to N do
if ((personas[i].sexo = femenino) and
(personas [i].estadocivil = soltero)) then
contador := contador + 1
end if
end for

Variante con la instrucción with

var personas: array [1..N] of Persona


contador, i: integer

contador := 0
for i := 1 to N do
with persona[i] do
if ((sexo = femenino) and (estadocivil = soltero)) then
contador := contador + 1
end if
end with
end for

_____________________________________________________________________ 11
Estructuras de datos
Teoría y Aplicación de la Informática I

Listas Ordenadas

• Ejemplos:

o Los días de la semana


(Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado)

o Los valores de los naipes


(2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, As)

• Una lista ordenada puede estar vacía, o puede ser escrita como:
(a1, a2, a3, …, an)
donde ai son átomos de un conjunto S

• Operaciones que pueden ser ejecutadas en las listas ordenadas:

o Encontrar la longitud, n, de la lista


o Leer la lista de izquierda a derecha, o de derecha a izquierda
o Recuperar el i-ésimo elemento, 1 ≤ i ≤ n
o Almacenar un nuevo valor en la i-ésima posición, 1 ≤ i ≤ n
o Insertar un nuevo valor en la posición i, 1 ≤ i ≤ n+1, causando
que los elementos numerados i, i+1, …, n tengan la
numeración i+1, i+2, …, n+1
o Borrar el elemento de la posición i, 1 ≤ i ≤ n, causando que los
elementos numerados i+1, i+2, …, n tengan la numeración i,
i+1, …, n-1

• Una manera de implementar una lista ordenada, es utilizando un


array, asociando el elemento de la lista ai con el índice i del array

_____________________________________________________________________ 12
Estructuras de datos
Teoría y Aplicación de la Informática I

Tipo Abstracto o Abstracción

• Una abstracción se caracteriza por un conjunto de operadores


definido por el programador

• Su representación consiste de:


o Declaración de las variables cuyos valores definen un
estado del tipo
o Declaración de los procedimientos o funciones que
implementan las operaciones del tipo
o Código de inicialización

• Este tipo de mecanismo está disponible en varios Lenguajes de


Programación de Alto Nivel

_____________________________________________________________________ 13
Estructuras de datos
Teoría y Aplicación de la Informática I

• Los tipos Abstractos o Abstracciones se definen así:

type class-name = abstracción


variable declarations

procedure P1 (…)
begin

end

procedure P2 (…)
begin

end

.
.
.

procedure Pn (…)
begin

end

begin
código de inicialización
end

• Si queremos definir una variable A del tipo class-name:


var A: class-name

• Para ejecutar cualquiera de la operaciones:


A.P1 (…)
A.P2 (…)
.
.
.
A.Pn (…)
_____________________________________________________________________ 14
Estructuras de datos
Teoría y Aplicación de la Informática I

• Ejemplo:

Se define el tipo abstracto árbol

type árbol = abstracción

var altura: integer

procedure REGAR_Y_CRECER ()
begin
altura := altura + 1
end

procedure ABONAR_Y_CRECER ()
begin
altura := altura + 2
end

procedure IMPRIMIR_ALTURA_ÁRBOL ()
begin
print (altura)
end

begin
altura := 2
end

Se declara una variable de tipo árbol

var mi_árbol: árbol

_____________________________________________________________________ 15
Estructuras de datos
Teoría y Aplicación de la Informática I

Se ejecutan los procedimientos en un fragmento de un


programa

.
.
.
mi_árbol.IMPRIMIR_ALTURA_ÁRBOL ()
mi_árbol.ABONAR_Y_CRECER ()
mi_árbol.IMPRIMIR_ALTURA_ÁRBOL ()
mi_árbol.REGAR_Y_CRECER ()
mi_árbol.IMPRIMIR_ALTURA_ÁRBOL ()
mi_árbol.ABONAR_Y_CRECER ()
mi_árbol.REGAR_Y_CRECER ()
mi_árbol.IMPRIMIR_ALTURA_ÁRBOL ()
.
.
.

La salida del fragmento del programa es:

.
.
.
2
4
5
8
.
.
.

_____________________________________________________________________ 16
Estructuras de datos
Teoría y Aplicación de la Informática I

Pilas (Stacks)

• Una pila es una lista ordenada en la cual todas las inserciones y


eliminaciones se hacen en un extremo, llamado tope (top)

• Sea la pila S = (a1, a2, …, an)


o a1 es el elemento que está en el fondo de la pila
o ai se encuentra por encima del elemento ai-1, 1 ≤ i ≤ n

• Si un stack se carga con los elementos A, B, C, D, E, en ese orden,


entonces el primer elemento a ser eliminado es E

E
D
C
B
A

• El último elemento que fue insertado en la pila, es el primero que


debe salir. Por este motivo las pilas son llamadas listas LIFO (Last
In, First Out)

_____________________________________________________________________ 17
Estructuras de datos
Teoría y Aplicación de la Informática I

Ejemplo del Uso de Pilas en la solución de problemas


relacionados con la computación

Procesamiento de las llamadas a subrutinas y sus retornos

• Tenemos un procedimiento principal y tres rutinas

• Los retornos se deben hacer en orden inverso a las llamadas

• Entonces, las direcciones de retorno se van almacenando en una


pila, y cada vez que termina una ejecución se retorna a la dirección
indicada en el tope de la pila

_____________________________________________________________________ 18
Estructuras de datos
Teoría y Aplicación de la Informática I

Operaciones con las Pilas

• ADD (item, stack)  stack


Inserta item en stack, y devuelve el stack modificado

• DELETE (stack)  stack


Elimina el elemento del tope de stack, y devuelve el stack
modificado

• TOP (stack)  item


Devuelve el ítem ubicado en el tope de stack. No modifica stack

• ISEMPTY (stack)  boolean


Devuelve ‘true’ si stack está vacío, y “false” en caso contrario

Implementación de una pila

Supongamos que utilizamos un lenguaje que admite la definición de


tipos por medio de abstracción. Entonces, podríamos definir el tipo
stack así:

type stack = abstracción


const N = 1000
var top: integer
var s: array [1..N] of integer

procedure ADD (item)


begin
if top ≥ N then
call STACK_FULL
else
top := top + 1
s [top] := item
end if
end

_____________________________________________________________________ 19
Estructuras de datos
Teoría y Aplicación de la Informática I

procedure DELETE ()
begin
if top ≤ 0 then
call STACK_EMPTY
else
top := top – 1
end if
end

procedure TOP ()
begin
if TOP = 0 then
return (error)
else
return (s [top])
end if
end
procedure ISEMPTY ()
begin
if top = 0 then
return (true)
else
return (false)
end if
end
begin { inicialización }
top := 0
end

Si queremos usar esta definición:


var p: snack
begin
p.ADD (1)
p.ADD (2)
p.ADD (3)
p.DELETE()
print (p.TOP())
end
_____________________________________________________________________ 20
Estructuras de datos
Teoría y Aplicación de la Informática I

Colas (Queues)

• Una cola es una lista ordenada en la cual todas las inserciones se


hacen en un extremo, el final (rear), mientras que las eliminaciones
se hacen en el otro extremo, el frente (front)

• Sea la cola S = (a1, a2, …, an)


o a1 es el elemento que está al frente de la cola
o an es el elemento que está al final de la cola
o ai+1 se encuentra atrás del elemento ai, 1 ≤ i ≤ n

• La cola requiere que el primer elemento que se inserta sea el


primero que se saque. Por esto, son conocidas como listas FIFO
(First In, First Out)

Ejemplo del Uso de Colas en la solución de problemas


relacionados con la computación

Planificación del procesador

• Cada vez que un proceso está listo para ejecutarse, se incorpora al


final de una cola de Listos (ready queue)

• El CPU scheduler selecciona el proceso que está al frente de la


cola de Listos para asignarle la CPU

_____________________________________________________________________ 21
Estructuras de datos
Teoría y Aplicación de la Informática I

Operaciones con las Colas

• ADDQ (item, queue)  queue


Inserta item al final de la cola, y devuelve la cola modificada

• DELETEQ (queue)  queue


Saca el elemento que está al frente de la cola, y devuelve la cola
modificada

• FRONT (queue)  item


Devuelve el elemento que está al frente de la cola sin modificarla

• ISEMPTYQ (queue)  boolean


Devuelve ‘true’ si la cola está vacía, y ‘false’ en caso contrario

Implementación de una Cola

Para implementar la cola usando arrays se necesita:

o Un array de una dimensión


o Las variables front y rear
o Vamos a adoptar la convención de que front apunta a una
posición antes del comienzo real de la cola, y rear apunta al
último elemento de la cola
o Inicialmente front = rear = 0
o La cola está vacía cuando front = rear

Podemos definir la cola como sigue:

const N = 1000
var front, rear: integer
var Q: array [1..N] of integer

front := 0
rear := 0

_____________________________________________________________________ 22
Estructuras de datos
Teoría y Aplicación de la Informática I

procedure ISEMPTYQ (Q)


begin
if front = rear then
return (true)
else
return (false)
end if
end

procedure FRONT (Q)


begin
if ISEMPTYQ (Q) then
return (error)
else
return (Q [front + 1])
end if
end

procedure ADDQ (item, Q, N, rear)


begin
if rear = N then
call QUEUE_FULL
else
rear := rear + 1
Q [rear] := item
end if
end

procedure DELETEQ (Q, front, rear)


begin
if front = rear then
call QUEUE_EMPTY
else
front := front + 1
end if
end

¿Por qué esta implementación (o representación) de las colas no


es eficiente?

_____________________________________________________________________ 23
Estructuras de datos
Teoría y Aplicación de la Informática I

Una representación más eficiente de la cola se consigue haciendo


que el vector Q sea circular

o El vector Q tiene índices que van de 0 a N-1


o Cuando rear = N-1, el próximo elemento entraría a Q(0), si
ese lugar está vacío
o front apunta una posición antes del primer elemento de Q
o La cola está vacía cuando front = rear
o Inicialmente, front = rear = 0

Ejercicio: Re-escribir los procedimientos anteriores considerando


Q como vector circular

*Hay dos posibilidades:


- Usar solo N-1 posiciones del vector
front = rear  cola vacía
front = (rear + 1) mod n  cola llena

- Usar las N posiciones del vector


front = rear  cola llena y/o vacía
Usar una bandera para distinguir entre cola llena y vacía

_____________________________________________________________________ 24
Estructuras de datos
Teoría y Aplicación de la Informática I

Listas Enlazadas (Linked Lists)

• En los arrays, y las pilas y colas implementadas con arrays,


estuvimos utilizando el mapeamiento secuencial, o listas
contiguas, en las que los elementos son adyacentes en la memoria

• Consideremos la siguiente lista ordenada de palabras en inglés


que terminan con AT:

(BAT, CAT, EAT, FAT, HAT, JAT, LAT, MAT, OAT, PAT, RAT,
SAT, TAT, VAT, WAT)

• Queremos insertar la palabra GAT entre FAT y HAT, y también


eliminar la palabra LAT

• Usando listas contiguas necesitaremos mover elementos de la


lista un lugar para arriba o para abajo

• Una lista enlazada es un conjunto de nodos en los que cada nodo


apunta al siguiente nodo de la lista

• Un nodo se estructura en campos

• Los campos pueden ser de:


o Datos: DATA1, DATA2, etc
o Enlace: LINK1, LINK2, etc. Estos apuntan al siguiente nodo
de la lista (contienen la dirección del siguiente nodo de la
lista)

• Cada nodo de una lista enlazada debe tener al menos un campo


DATA y un campo LINK

• El último nodo de la lista tiene LINK = 0

• Los nodos de una lista enlazada se pueden almacenar en


posiciones de memoria que no son consecutivas

_____________________________________________________________________ 25
Estructuras de datos
Teoría y Aplicación de la Informática I

En la siguiente figura, los elementos de la lista están almacenados en


un array unidimensional llamado DATA. El array LINK almacena
punteros a los elementos del array DATA. F es un apuntador a la lista
enlazada y tiene valor 8, porque la lista comienza con BAT, que está
en DATA (8)

F=8

Representación gráfica de las listas enlazadas

_____________________________________________________________________ 26
Estructuras de datos
Teoría y Aplicación de la Informática I

Pasos para insertar GAT entre FAT y HAT

o Conseguir un nodo libre, sea X su dirección


o Poner en el campo DATA de ese nodo el valor GAT
o Poner en el campo LINK de ese nodo el valor del campo
LINK de FAT (el cual apunta a HAT)
o Poner en el campo LINK de FAT el valor X

En la siguiente figura se ven los arrays DATA y LINK después de


agregar GAT

Con la representación de listas enlazadas tenemos:

_____________________________________________________________________ 27
Estructuras de datos
Teoría y Aplicación de la Informática I

Pasos para eliminar el nodo que contiene GAT

o Identificar el nodo que precede al nodo cuyo campo DATA es


GAT (en este caso el nodo cuyo campo DATA es FAT)
o En el campo LINK del nodo identificado se debe poner el
valor que tiene el campo LINK del nodo cuyo campo DATA es
GAT
o Marcar el nodo eliminado como libre

Operaciones con las listas enlazadas

Primero definimos dos funciones auxiliares:

• GETNODE (X): devuelve un puntero X a un nodo libre, y si no hay


nodos libres, emite un mensaje de error y para

• RET(X): retorna el nodo X a la memoria

A continuación se definen procedimientos para insertar y eliminar


elementos de una lista enlazada

INSERT
• Sea T un puntero a una lista enlazada
• T = 0 si la lista no tiene nodos
• Sea X un apuntador a un nodo arbitrario de la lista T
• El siguiente algoritmo inserta un nodo con el campo DATA = item, a
continuación del nodo apuntado por X

_____________________________________________________________________ 28
Estructuras de datos
Teoría y Aplicación de la Informática I

procedure INSERT (T, X, item)


call GETNODE (I)
DATA (I) := item
if T = 0 then
T := I
LINK (I) := 0
else
LINK (I) := LINK (X)
LINK (X) := I
end if
end

DELETE
• Sea X un puntero a un nodo arbitrario de la lista enlazada T
• Sea Y el nodo que precede a X. (Y = 0 si X es el primer nodo en T,
esto es si X = T)
• El algoritmo siguiente suprime el nodo X de T

procedure DELETE (X, Y, T)


if Y = 0 then
T := LINK (T)
else
LINK (Y) := LINK (X)
end if
call RET (X)
end

_____________________________________________________________________ 29
Estructuras de datos
Teoría y Aplicación de la Informática I

Árboles (Trees)

Ejemplo

Definición

Un árbol es un conjunto finito de uno o más nodos, tal que,


o existe un nodo llamado raíz,
o el resto de los nodos están particionados en n ≥ 0 conjuntos
disjuntos T1, T2, …, Tn, donde cada uno de estos conjuntos
es, a su vez, un árbol. T1, T2, …, Tn se llaman subárboles
de la raíz

_____________________________________________________________________ 30
Estructuras de datos
Teoría y Aplicación de la Informática I

Terminología

• El nodo representa el o los ítems de información más las ramas a


los otros nodos. En la figura tenemos 13 nodos, A, B, C, …, M. La
raíz es A.

• El grado es el número de subárboles de un nodo. El grado de A es


3, de C es 1, de F es 0.

• Los nodos hojas o nodos terminales son los nodos que tienen
grado 0. {K, L, F, G, M, I, J} constituye el conjunto de nodos hojas.

• Los nodos no terminales son los nodos que no son hojas. Por
ejemplo, H es un nodo no terminal.

• Padres e Hijos: las raíces de los subárboles de un nodo X, son los


hijos de X. X es el padre de sus hijos.
Ejemplo: los hijos de D son, H, I, J; el padre de D es A.

• Los hijos de un mismo padre son hermanos.


Ejemplo: H, I, J son hermanos.

• El grado de un árbol es el máximo grado de los nodos del árbol.


El árbol de la figura tiene grado 3.

_____________________________________________________________________ 31
Estructuras de datos
Teoría y Aplicación de la Informática I

• Los antepasados de un nodo son todos los nodos a lo largo del


camino que va desde la raíz hasta el nodo en cuestión.
Ejemplo: los antepasados de M son A, D, H.

• El nivel de un nodo se define, estableciendo inicialmente la raíz a


nivel 1. Si un nodo está en el nivel l, sus hijos están en el nivel l+1.
En la figura se señala el nivel de todos los nodos del árbol.

• Altura o profundidad de un árbol: es el máximo nivel de sus


nodos. El árbol de la figura tiene altura 4.

• Una floresta es un conjunto de n ≥ 0 árboles disjuntos. Si retiramos


la raíz de un árbol, obtenemos una floresta. En la figura, si
eliminamos A tenemos una floresta con 3 árboles.

Representación en memoria

Si queremos usar listas enlazadas, cada nodo tendrá un número


variable de campos LINK, dependiendo del número de ramas

DATA LINK 1 LINK 2 … LINK n

_____________________________________________________________________ 32
Estructuras de datos
Teoría y Aplicación de la Informática I

Árboles Binarios

Definición

Un árbol binario es un conjunto finito de nodos, que está vacío,


o:
o hay un nodo llamado raíz
o el resto de los nodos está particionado en dos conjuntos
disjuntos T1 y T2 tal que T1 y T2 son árboles binarios. T1 es
el subárbol izquierdo y T2 el subárbol derecho.

Diferencias entre los árboles y los árboles binarios

• Los árboles binarios no tienen ningún nodo con grado mayor que 2

• Existe el árbol binario vacío (sin ningún nodo), pero no existe el


árbol con cero nodos

• Los dos árboles binarios que aparecen abajo son distintos

_____________________________________________________________________ 33
Estructuras de datos
Teoría y Aplicación de la Informática I

Tipos especiales de árboles binarios

Árbol asimétrico (con asimetría izquierda)

Árbol binario completo

_____________________________________________________________________ 34
Estructuras de datos
Teoría y Aplicación de la Informática I

Propiedades

• El número máximo de nodos en el nivel i de un árbol binario es 2i-1,


i≥1

• El número máximo de nodos en un árbol binario de profundidad k


es 2k -1, k ≥ 1

• Para cualquier árbol binario no vacío, si n0 es el número de hojas


(nodos con grado 0) y n2 el número de nodos de grado 2, entonces
n0 = n2 + 1

Representación

Cada nodo tendrá tres campos

HIJO IZQ DATO HIJO DER

_____________________________________________________________________ 35
Estructuras de datos
Teoría y Aplicación de la Informática I

Ejemplos de Representación

Representación del Árbol asimétrico (con asimetría izquierda)

Representación del Árbol binario completo

_____________________________________________________________________ 36
Estructuras de datos
Teoría y Aplicación de la Informática I

Recorrido del árbol binario

Existen tres ordenamientos principales, que surgen de la forma natural


de los árboles, con los que se puede procesar o visitar los nodos de un
árbol. Ellos son: Orden
Pre-orden
Post-orden

Supongamos que tenemos la representación de árbol de la expresión


( ( A / ( B ** ( - C ) ) ) * D + E )

Recorrido en Orden

1- Recorrer el subárbol izquierdo en Orden


2- Visitar la raíz
3- Recorrer el subárbol derecho en Orden

Si consideramos que visitar corresponde a la operación print


tendremos:
A / B ** - C * D + E
que es la notación convencional infija, aunque sin los paréntesis que
se necesitan para aclarar las precedencias

_____________________________________________________________________ 37
Estructuras de datos
Teoría y Aplicación de la Informática I

Recorrido en Pre-orden

1- Visitar la raíz
2- Recorrer el subárbol izquierdo en Pre-orden
3- Recorrer el subárbol derecho en Pre-orden

Si al visitar vamos imprimiendo tendremos:


+ * / A ** B – C D E
que es la notación prefija de la expresión

Recorrido en Post-orden

1- Recorrer el subárbol izquierdo en Post-orden


2- Recorrer el subárbol derecho en Post-orden
3- Visitar la raíz

Si al visitar vamos imprimiendo tendremos:


A B C - ** / D * E +
que es la notación postfija de la expresión

_____________________________________________________________________ 38
Estructuras de datos
Teoría y Aplicación de la Informática I

Grafos

Definición y terminología

• Un grafo G consiste de dos conjuntos:


o V: conjunto finito y no vacío de vértices
o E: conjunto de pares de vértices llamados lados

V(G) representa el conjunto de vértices del grafo G


E(G) representa el conjunto de lados del grafo G
G = (V, E) representa un grafo

• En un grafo dirigido cada lado es representado por un par


ordenado <v1, v2>. v1 es la cola y v2 la cabeza del lado. Por lo
tanto <v1, v2> y <v2, v1> representan dos lados diferentes

• En un grafo no dirigido los pares de vértices que representan un


lado no son pares ordenados, así que (v1, v2) y (v2, v1)
representan el mismo lado

o G1 y G2 son grafos no dirigidos. G3 es un grafo dirigido


o V(G1) = {1, 2, 3, 4}
o E(G1) = {(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)}
o V(G2) = {1, 2, 3, 4, 5, 6, 7}
o E(G2) = {(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7)}
o V(G3) = {1, 2, 3}
_____________________________________________________________________ 39
Estructuras de datos
Teoría y Aplicación de la Informática I

o E(G3) = {<1, 2>, <2, 1>, <2, 3>}


• Si (v1, v2) o <v1, v2> son lados de un grafo, entonces v1 ≠ v2

• Como E(G) es un conjunto, un grafo no puede tener múltiples


ocurrencias del mismo lado. Si se saca esta restricción se tiene un
multigrafo

• Ejemplo de multigrafo

• Un subgrafo de G es un grafo G’ tal que V(G’) ⊆ V(G) y


E(G’) ⊆ E(G)

• Ejemplos de subgrafos de G3

• Un camino del vértice vp al vértice vq en un grafo G es una


secuencia de vértices
vp, vi1, vi2, …, vin, vq
tal que (vp, vi1), (vi1, vi2), …, (vin, vq) son lados incluidos en E(G)

• Si (vi, vj) es un lado en E(G), entonces vi y vj son adyacentes y el


lado (vi, vj) es incidente en los vértices vi y vj
_____________________________________________________________________ 40
Estructuras de datos
Teoría y Aplicación de la Informática I

_____________________________________________________________________ 41
Estructuras de datos
Teoría y Aplicación de la Informática I

Representación de Grafos

Matriz de Adyacencia

• Sea G = (V, E) un grafo con n vértices, n ≥ 1

• La matriz de adyacencia de G es un arreglo A de n x n con la


propiedad de que:
o A(i, j) = 1 si y solo si (vi, vj) (<vi, vj> para un grafo dirigido) está
en E(G)
o A(i, j) = 0 si no existe ese lado en G

• Ejemplos

Matriz de adyacencia de G1

Matriz de adyacencia de G3

• La matriz de adyacencia de un grafo no dirigido es siempre


simétrica, pues el lado (vi, vj) está en E(G) si el lado (vj, vi) también
está en E(G)

• La matriz de adyacencia de un grafo dirigido no necesita ser


simétrica

• Los 1 en la fila i nos dan los lados que salen del vértice i y los unos
en la columna j nos dan los lados que llegan al vértice j
_____________________________________________________________________ 42
Estructuras de datos
Teoría y Aplicación de la Informática I

Listas de Adyacencia

• Las n filas de la matriz de adyacencia se representan por n linked


list

• Existe una lista por cada vértice en G

• Los nodos de la lista i representan los vértices a los cuales se


puede llegar desde el vértice i

• Ejemplos

Lista de adyacencia de G1

Lista de adyacencia de G3

_____________________________________________________________________ 43
Estructuras de datos
Teoría y Aplicación de la Informática I

Bibliografía

• WIRTH, Niklaus, Algoritmos + Estructuras de Datos =


Programas, Madrid, Ediciones del Castillo, 1980, pp. 4 – 22.

• HOROWITZ, Ellis y SAHNI, Sartaj, Fundamentos de Estruturas


de Dados, 2da ed., Río de Janeiro, Editora Campus LTDA, 1986, pp.
47 – 49, 77 – 85, 101 – 106, 197 – 211, 252 – 259.

• JOYANES AGUILAR, Luis, Fundamentos de Programación.


Algoritmos y Estructura de Datos, 2da ed., Madrid, McGraw-Hill,
1996, pp. 204 – 220, 260 – 264, 385 – 426, 439 – 455, 466 – 473.

_____________________________________________________________________ 44
Estructuras de datos

S-ar putea să vă placă și