• No results found

VIII. CONCLUSIONS AND FUTURE DIRECTIONS

8.2. Future Directions

COLA-MEDIEVAL es un ejemplo de colas de prioridad en la que los elementos de la cola son plebeyos y nobles, en la cual la prioridad la tienen los nobles.

fth MEDIEVAL is sort Elt .

op esNoble?: Elt --> Bool . endfth

fmod COLA-MEDIEVAL {x::MEDIEVAL} is protecting NAT, BOOL .

sort colaM{x} .

subsort colaMNV{x} < colaM{x} . op crear: --> colaM{x} [ctor] .

op insertar: x$Elt colaM{x} --> colaMNV{x} [ctor] . op extraer: colaM{x} --> colaM{x} .

op frente: colaMNV{x} --> x$Elt . op NNobles: colaM{x} --> Nat . op NPlebleyos: colaM{x} --> Nat . var C: colaMNV{x} .

var E: x$Elt .

eq extraer(crear) = crear .

eq extraer(insertar(E,crear)) = crear .

eq extraer(insertar(E,C)) = if NOT(esNoble?(frente(c))) AND esNoble?(E) then c

else

insertar(E,extraer(c)) fi .

eq frente(insertar(E,crear)) = E .

eq frente(insertar(E,C)) = if (esNoble?(E)) AND (esNoble?(frente(C))) then E

else

frente(C) fi .

45

eq NNobles(crear) = 0 .

eq NNobles(insertar(E,C)) = if esNobles?(E) then 1 + NNobles(C) else

NNobles(C) fi .

eq NPlebleyos(crear) = 0 .

eq NPlebleyos(insertar(E,C)) = if NOT(esNobles?(E)) then 1 + NPlebeyos(C) else NPlebeyos(C) fi . endfm Implementación en JAVA

Partimos a partir de la implementación en JAVA utilizando clases.

package colaPrioridadSimpleEnlazada;

import colaException.*;

public class ColaPrioridad implements colaPrioridadInterface.ColaPrioridad {

class Celda {

Object elemento; int prioridad; Celda sig; }

private Celda cola; public ColaPrioridad() { cola = new Celda(); cola.sig = null; }

public boolean vacia() {

return (cola.sig==null); }

public Object primero() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException(); return cola.sig.elemento;

}

public int primero_prioridad() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException();

return cola.sig.prioridad; }

public int primero_prioridad() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException();

return cola.sig.prioridad; }

public void inserta(Object elemento, int prioridad) {

Celda p,q;

boolean encontrado = false; p = cola;

while((p.sig!=null)&&(!encontrado)) { if (p.sig.prioridad<prioridad)

46

encontrado = true; else p = p.sig;

}

q = p.sig;

p.sig = new Celda(); p = p.sig;

p.elemento = elemento; p.prioridad = prioridad; p.sig = q;

}

public void suprime() throws ColaVaciaException { if (vacia()) throw new ColaVaciaException(); cola = cola.sig;

}

} // fin clase ColaPrioridad

Árbol (informática)

En ciencias de la informática, un árbol es una estructura jerárquica de datos que imita la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. Los demás nodos (tienen padre y uno o varios hijos) se les conoce como rama.

Definición

Formalmente, podemos definir un árbol de la siguiente forma: Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).

Un nuevo árbol a partir de un nodo nr y k árboles de raíces con elementos cada uno, puede construirse estableciendo una relación padre-hijo entre nr y cada una de las raíces de los k árboles. El árbol resultante de nodos tiene como raíz el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja está formado por la unión de los k conjuntos hojas iniciales. A cada uno de los árboles Ai se les denota ahora subárboles de la raíz.

Una sucesión de nodos del árbol, de forma que entre cada dos nodos consecutivos de la sucesión haya una relación de parentesco, decimos que es un recorrido árbol. Existen dos recorridos típicos para listar los nodos de un árbol: primero en profundidad y primero en anchura. En el primer caso, se listan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo anterior probando por el siguiente hijo y así sucesivamente. En el segundo, por su parte, antes de listar los nodos de nivel n + 1 (a distancia n + 1 aristas de la raíz), se deben haber listado todos los de nivel n. Otros recorridos típicos del árbol son preorden, postorden e inorden:

El recorrido en preorden, también llamado orden previo consiste en recorrer en primer lugar la raíz y luego cada uno de los hijos en orden previo.

47 El recorrido en inorden, también llamado orden simétrico (aunque este nombre sólo cobra significado en los árboles binarios) consiste en recorrer en primer lugar A1, luego la raíz y luego cada uno de los hijos

en orden simétrico.

El recorrido en postorden, también llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos en orden posterior y por último la raíz.

Finalmente, puede decirse que esta estructura es una representación del concepto de árbol en teoría de grafos. Un árbol es un grafo conexo y acíclico (ver también teoría de grafos y Glosario en teoría de grafos).

ESTA ES UNA FORMA MAS FACIL DE COMPRENDER EL TEMA A+B SUFIJO +AB PREFIJO AB+ POSFIJO El arbol normal (a+b) * c * A+b c + A b I pre orden d entre orden r pos orden idr posfijo rid Prefijo ird sufijo Tipos de árboles

48 Árboles Binarios

Árbol de búsqueda binario auto-balanceable

o Árboles Rojo-Negro o Árboles AVL Árboles B o Árbol-B+ o Árbol-B* Árboles Multicamino

Operaciones de árboles. Representación Las operaciones comunes en árboles son: Enumerar todos los elementos.

Buscar un elemento.

Dado un nodo, listar los hijos (si los hay). Borrar un elemento.

Eliminar un subárbol (algunas veces llamada podar). Añadir un subárbol (algunas veces llamada injertar). Encontrar la raíz de cualquier nodo.

Encontrar la primer raiz.

Por su parte, la representación puede realizarse de diferentes formas. Las más utilizadas son: Representar cada nodo como una variable en el heap, con punteros a sus hijos y a su padre.

Representar el árbol con un array donde cada elemento es un nodo y las relaciones padre-hijo vienen dadas por la posición del nodo en el array.

Uso de los árboles

Usos comunes de los árboles son: Representación de datos jerárquicos.

Como ayuda para realizar búsquedas en conjuntos de datos (ver también: algoritmos de búsqueda en Árboles )

Related documents