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

Estructuras de Datos III Introduccin Los conjuntos son tan fundamentales para la informtica, ya que son las matemticas.

Mientras que los conjuntos matemticos son inmutables, los conjuntos manipulados por algoritmos se crecen, se encogen, o no cambian con el tiempo. Llamamos a estos conjuntos dinmicos. Los siguientes cinco captulos presentan algunas tcnicas bsicas para representar conjuntos dinmicos finitos y manipularlos en un ordenador.

Algoritmos pueden requerir varios tipos diferentes de operaciones a realizar en conjuntos. Por ejemplo, muchos algoritmos necesitan slo la capacidad de insertar elementos en, eliminar elementos de, y la composicin de ensayo en un conjunto. Llamamos a un conjunto dinmico que apoya estas operaciones un diccionario. Otros algoritmos requieren operaciones ms complicadas. Por ejemplo, las colas minprioritarios, que Captulo 6 introdujo en el contexto de la estructura de datos montn, apoyan las operaciones de insertar un elemento en y extraer el elemento ms pequeo de un conjunto. La mejor manera de poner en prctica un conjunto dinmico depende de las operaciones que deben ser apoyadas.

Elementos de un conjunto dinmico En una implementacin tpica de un conjunto dinmico, cada elemento est representado por un objeto cuyos atributos pueden ser examinados y manipulado si tenemos un puntero al objeto. (Seccin 10.3 discute la implementacin de los objetos y punteros en entornos de programacin que no las contienen como tipos de datos bsicos.) Algunos tipos de conjuntos dinmicos asumen que uno de los atributos del objeto es una clave de identificacin. Si las claves son todos diferentes, podemos pensar en el conjunto dinmico como un conjunto de valores de clave. El objeto puede contener los datos de satlite, que se realizan en torno a otros atributos de los objetos, pero son de otro modo no utilizada por la aplicacin conjunto. Tambin puede tener atributos que son manipuladas por el conjunto de operaciones; estos atributos pueden contener datos o punteros a otros objetos del conjunto. Algunos conjuntos dinmicos presuponen que las claves se han extrado de un conjunto totalmente ordenado, tales como los nmeros reales, o el conjunto de todas las palabras en la lista alfabtica de pedido habitual. Un total de pedidos nos permite definir el elemento mnimo de la serie, por ejemplo, o para hablar del siguiente elemento mayor que un determinado elemento de un conjunto.

Operaciones sobre conjuntos dinmicos Las operaciones en un conjunto dinmico pueden agruparse en dos categoras: las consultas, que simplemente devuelven informacin acerca del conjunto, y operaciones de modificacin, que cambian el juego. Aqu est una lista de las operaciones tpicas. Cualquier aplicacin especfica que se requiere slo unos pocos de estos para su ejecucin.

SEARCH (S, k) Una consulta que, dado un conjunto S y un valor clave k, x devuelve un puntero a un elemento en S tal que x.key = k, o NIL si ese elemento no pertenece a S.

INSERT (S, x) Una operacin de modificacin que aumenta el conjunto S con el elemento apuntado por x. Normalmente suponemos que los atributos de los elementos x que necesita la aplicacin set ya se han iniciado.

DELETE (S, x) Una operacin de modificacin de que, dado un puntero x para un elemento en el conjunto S, elimina x de S. (Tenga en cuenta que esta operacin toma un puntero a un elemento x, no un valor de clave.)

MNIMO (S) Una consulta en un conjunto S totalmente ordenado que devuelve un puntero al elemento de S con la clave ms pequea.

M Aximum (S) Una consulta en un conjunto S totalmente ordenado que devuelve un puntero al elemento de S con la tecla ms grande.

SUCESOR (S, x) Una consulta que, dado un elemento x cuya clave es a partir de un conjunto totalmente ordenado S, devuelve un puntero al siguiente elemento ms grande en S, o NIL si x es el elemento mximo.

PREDECESOR (S, x) Una consulta que, dado un elemento x cuya clave es a partir de un conjunto totalmente ordenado S, devuelve un puntero al siguiente elemento ms pequeo en S, o NIL si x es el elemento mnimo.

En algunas situaciones, se puede extender la consulta SUCESOR y predecesor para que se apliquen a los conjuntos con llaves nondistinct. Para un conjunto de teclas n, la presuncin normal es que una llamada al mnimo seguido de n 1 llamadas a SUCESOR enumera los elementos del conjunto de forma ordenada.

Por lo general, medimos el tiempo necesario para ejecutar una operacin de conjunto en trminos de tamao del conjunto. Por ejemplo, el captulo 13 se describe una estructura de datos que puede soportar cualquiera de las operaciones mencionadas anteriormente en un conjunto de tamao n en tiempo O (lg n).

10 Estructuras de datos elementales En este captulo, se analiza la representacin de conjuntos dinmicos de estructuras de datos simples que utilizan punteros. Aunque podemos construir muchas estructuras de datos complejas utilizando punteros, se presentan slo los elementales: pilas, colas, listas enlazadas, rboles y races. Tambin ponen de manifiesto formas de sintetizar objetos y punteros a arrays.

10.1 Las pilas y colas Las pilas y las colas son conjuntos dinmicos en los que se especific previamente el elemento eliminado del conjunto de la operacin de eliminacin. En una pila, el elemento eliminado del conjunto es el ms recientemente introducido: la pila implementa una poltica de ltimo en entrar, primero en salir, o LIFO. Del mismo modo, en una cola, el elemento eliminado es siempre el que ha estado en el juego por mucho tiempo: la cola implementa una poltica de primero en entrar, primero en salir o FIFO. Hay varias maneras eficientes para implementar pilas y colas en un ordenador. En esta seccin se muestra cmo utilizar una matriz simple de implementar cada uno.

Pilas
La operacin de E nsert en una pila a menudo se llama PUSH, y la operacin de eliminacin, que no tiene un argumento elemento, a menudo se llama POP. Estos nombres son alusiones a pilas fsicos, tales como las pilas de resorte de placas utilizadas en las cafeteras. El orden en el que las placas se extraen de la pila es la inversa de la orden en el que se insertan en la pila, ya que slo la placa superior es accesible.

Colas
Llamamos a la operacin de insercin en un ENQUEUE cola y que llamamos la operacin DELETE DEQUEUE, como la operacin POP pila, DEQUEUE toma ningn argumento elemento. La propiedad de una cola FIFO hace que funcione como una fila de clientes esperando para pagar un cajero. La cola tiene una cabeza y una cola. Cuando se encola un elemento, que toma su lugar en la cola de la cola, al igual que un cliente recin llegados tiene un lugar en la final de la lnea. El elemento quitado de la cola es siempre el uno a la cabecera de la cola, como el cliente en la cabecera de la lnea que ha esperado ms tiempo.

10.2

Las listas enlazadas

Una lista enlazada es una estructura de datos en la que los objetos estn dispuestos en un orden lineal. A diferencia de una matriz, sin embargo, en que el orden lineal se determina por la matriz ndices, el orden en una lista enlazada se determina por un puntero en cada objeto. Las listas enlazadas proporcionan una representacin sencilla, flexible para conjuntos dinmicos, el apoyo (aunque no necesariamente de manera eficiente).

Una lista puede tener una de varias formas. Puede ser ya sea vinculada individualmente o doblemente vinculada, que puede ser resuelto o no, y puede ser circular o no. Si la lista es separado vinculado, omitimos el puntero pre en cada elemento. Si se ordena una lista, el orden lineal de la lista corresponde al orden lineal de claves almacenada en los elementos de la lista, el elemento mnimo es entonces la cabeza de la lista, y el elemento mximo es la cola. Si se unsorted la lista, los elementos pueden aparecer en cualquier orden. En una lista circular, el puntero antes de la cabeza de la lista de puntos a la cola, y el siguiente puntero de la cola de la lista apunta a la cabeza. Podemos pensar en una lista circular como un anillo de elementos. En el resto de esta seccin, se supone que las listas con las que estamos trabajando son seleccionados y doblemente enlazada.

Bsqueda de una lista enlazada El procedimiento LISTA-S Earch (L, k) busca el primer elemento con la clave k en la lista L por una bsqueda lineal simple, devolviendo un puntero a este elemento. Si no hay ningn objeto con

tecla k aparece en la lista, entonces el procedimiento devuelve NIL. Para buscar una lista de n objetos, la IST-S procedimiento Earch L toma,. N / hora en el peor de los casos, ya que puede tener que buscar en la lista completa.

Insercin en una lista enlazada Dado un elemento x cuyo atributo clave ya se ha establecido, el procedimiento LISTA-INSERT "empalmes" x sobre el frente de la lista enlazada, como se muestra en la figura 10.3 (b).

(Recuerde que la notacin atributo puede cascada, de modo que L.head.pre denota la atributo previo del objeto que L.head seala.) el tiempo de ejecucin para LIST-INSERT en una lista de n elementos es O (1).

Eliminacin de una lista enlazada La LISTA DE BORRAR procedimiento elimina un elemento x de una lista enlazada L. Se le debe dar un puntero a x, y luego "empalmes" x fuera de la lista mediante la actualizacin de punteros. Si queremos eliminar un elemento con una clave determinada, hay que llamar primero LISTA-SEARCH para recuperar un puntero al elemento.

Centinelas
El cdigo para la LISTA-DELETE sera ms sencillo si pudiramos ignorar los lmites las condiciones en la cabeza y la cola de la lista:

LISTA DE BORRAR '(L, x) 1 x.prev.next = x.next 2 x.next.prev = x.prev

Un centinela es un objeto ficticio que nos permite simplificar las condiciones de contorno. Por ejemplo, supongamos que nos ofrecen con la lista L L.nil un objeto que representa NIL, pero tiene todas las cualidades de los dems objetos de la lista. Siempre tenemos una referencia a NIL en el cdigo de lista,

que sustituirla por una referencia a la L.nil centinela. Como se muestra en la Figura 10.4, este cambio se convierte en una lista doblemente enlazada regular en una lista doblemente enlazada circular con un centinela, en el que el centinela L.nil se encuentra entre la cabeza y la cola. Los puntos L.nil.next atributos a la cabeza de la lista, y los puntos L.nil.prev a la cola. Del mismo modo, tanto el siguiente atributo de la cola y el atributo antes del punto a L.nil cabeza. Desde puntos L.nil.next en la cabeza, podemos eliminar la L.head atributo completo, sustituyendo las referencias a l por las referencias a L.nil.next.

Centinelas rara vez se reducen los lmites de tiempo asintticas de las operaciones de la estructura de datos, pero pueden reducir los factores constantes. El aumento del uso de centinelas dentro de los ciclos suele ser una cuestin de claridad de cdigo en lugar de la velocidad, el cdigo de lista enlazada, por ejemplo, se vuelve ms fcil cuando se utiliza centinelas, pero nos ahorramos slo O (1) vez en la lista INSERT 'y procedimientos LISTA-delete '. En otras situaciones, sin embargo, el uso de centinelas ayuda a apretar el cdigo en un bucle, lo que reduce el coeficiente de, por ejemplo, N o N ^ 2 en el tiempo de ejecucin.

Debemos utilizar centinelas juiciosamente. Cuando hay muchas listas pequeas, el espacio de almacenamiento utilizado por los centinelas puede representar prdida de memoria significativa. En este libro, usamos centinelas slo cuando realmente simplificar el cdigo.

10,3 indicadores de ejecucin y objetos Cmo implementamos punteros y objetos en lenguajes que no ofrecen ellos? En esta seccin, veremos dos formas de implementar estructuras de datos enlazadas sin un tipo de datos del puntero explcito. Vamos a sintetizar los objetos y punteros a arrays y los ndices de matriz.

Una representacin

de matriz mltiple de objetos

Podemos representar una coleccin de objetos que tienen los mismos atributos mediante el uso de una matriz para cada atributo. A modo de ejemplo, la figura 10.5 muestra cmo podemos poner en prctica la lista enlazada de la figura 10.3 (a) con tres matrices. La clave de la matriz contiene los valores de las claves actualmente en el conjunto dinmico, y los punteros residen en las matrices next y prev. Si desea un nmero determinado ndice de x, las entradas de la matriz tecla [x], al lado [x], y prev [x] representa un objeto en la lista enlazada. Bajo esta interpretacin, un puntero x es simplemente un ndice comn en los conjuntos clave, a continuacin, y prev.

Una representacin de un solo conjunto de objetos Las palabras en una memoria de ordenador suelen ser abordados por nmeros enteros de 0 a M-1, donde M es un entero grande adecuadamente. En muchos lenguajes de programacin, un objeto se encuentra en un conjunto contiguo de lugares de la memoria de la computadora. Un puntero es simplemente la direccin de la primera posicin de memoria del objeto, y podemos abordar otras ubicaciones de la memoria en el objeto agregando un desplazamiento al puntero.

Podemos utilizar la misma estrategia para implementar los objetos en entornos de programacin que no proporcionan los tipos de datos de puntero explcitas. Por ejemplo, la figura 10.6 se muestra cmo utilizar una nica matriz de A a almacenar la lista enlazada partir de las Figuras 10.3 (a) y 10.5. Un objeto se encuentra en un subconjunto contiguo A [j .. k]. Cada atributo del objeto corresponde a un desplazamiento en el rango de 0 a k-j, y un puntero al objeto es el ndice j.

En la figura 10.6, las compensaciones correspondientes a la clave, a continuacin, y prev son 0, 1 y 2, respectivamente. Para leer el valor de i.prev, dado un puntero i, aadimos el valor i del puntero el offset 2, la lectura de lo que A [2].

La representacin de un solo matriz es flexible ya que permite que los objetos de diferente longitudes para ser almacenados en la misma matriz. El problema de la gestin de una coleccin heterognea de tales objetos es ms difcil que el problema de la gestin de una coleccin homognea, en donde todos los objetos tienen los mismos atributos. Dado que la mayora de las estructuras de datos que consideraremos se componen de elementos homogneos, que ser suficiente para nuestros propsitos para utilizar la representacin de matriz mltiple de objetos.

Asignar y liberar objetos Para insertar una llave en un conjunto dinmico representado por una lista doblemente enlazada, hay que asignar un puntero a un objeto actualmente no se utiliza en la representacin de lista vinculada. Por lo tanto, es til para gestionar el almacenamiento de objetos que no se utilizan actualmente en la representacin de lista vinculada de modo que uno se le puede asignar. En algunos sistemas, un recolector de basura se encarga de determinar qu objetos se utilizan. Muchas aplicaciones, sin embargo, son lo suficientemente simples como para poder asumir la responsabilidad de devolver un objeto sin uso de un gestor de almacenamiento. Ahora vamos a explorar el problema de asignar y liberar (o desasignar) objetos homogneos utilizando el ejemplo de una lista doblemente enlazada representado por varias matrices.

Supongamos que las matrices en la representacin de matriz mltiple tienen m de longitud y que en algn momento el conjunto dinmico contiene N o m elementos. Entonces n objetos representan elementos actualmente en el conjunto dinmico, y los objetos mn restantes son libres; los objetos libres estn disponibles para representar los elementos insertados en el conjunto dinmico en el futuro. Mantenemos los objetos libres en una lista vinculada individualmente, lo que llamamos la lista libre. La lista libre slo utiliza la siguiente matriz, que almacena los siguientes indicadores dentro de la lista. La cabeza de la lista libre se lleva a cabo en el libre global variable. Cuando la dinmica establecer representado por lista enlazada L es no vaco, la lista libre puede estar entrelazada con la lista L, como se muestra en la Figura 10.7. Tenga en cuenta que cada objeto de la representacin es o bien en la lista L o en la lista libre, pero no en ambos. La lista libre acta como una pila: el siguiente objeto asignado es el ltimo en libertad. Podemos utilizar una implementacin de la lista de las operaciones de pila push y pop para poner en prctica los procedimientos para asignar y liberar objetos, respectivamente. Suponemos que la libre variable global utilizada en los siguientes puntos de procedimientos para el primer elemento de la lista libre.

La lista gratuita inicialmente contiene todos los objetos asignados n. Una vez que la lista libre se ha agotado, se ejecuta el procedimiento ALLOCATE-OBJETO seala un error. Incluso podemos atender varias listas enlazadas con una sola lista libre. La figura 10.8 muestra dos listas enlazadas y una lista gratuita entrelazados a travs de las matrices fundamentales, al lado, y prev. Los dos procedimientos se ejecutan en O (1) vez, lo que los hace muy prcticos. Podemos modificarlos para trabajar para cualquier coleccin homognea de objetos al permitir cualquiera de los atributos en el acto objeto como un atributo siguiente en la lista libre.

10.4

Representacin de los rboles arraigados

Los mtodos para la representacin de las listas dadas en la seccin anterior se extienden a cualquier estructura de datos homognea. En esta seccin, analizamos especficamente el problema de la representacin de los rboles arraigados por las estructuras de datos enlazadas. En primer lugar, observamos los rboles binarios, y luego se presenta un mtodo para rboles arraigados en la que los nodos pueden tener un nmero arbitrario de los nios. Nosotros representamos a cada nodo de un rbol por un objeto. Al igual que con las listas enlazadas, se supone que cada nodo contiene un atributo clave. Los atributos restantes de inters son punteros a otros nodos, y que varan segn el tipo de rbol.

rboles binarios La figura 10.9 muestra la forma en que utilizamos los atributos p, izquierda, y derecha para almacenar punteros a los padres, hijo de la izquierda, y el hijo derecho de cada nodo en un rbol binario T. Si x.p = NIL, entonces x es la raz. Si el nodo x no tiene hijo izquierdo, entonces x.left = NIL, y lo mismo para el hijo derecho. La raz de todo el rbol T es apuntado por el T.root atributo. Si T.root = NIL, entonces el rbol est vaco.

rboles enraizados con infinita ramificacin Podemos extender el esquema para representar un rbol binario a cualquier clase de rboles en los que el nmero de hijos de cada nodo es a lo sumo alguna constante k: sustituimos los atributos izquierdo y derecho de nios 1; nio 2;. . . ; K nio. Este sistema ya no funciona cuando es ilimitado el nmero de hijos de un nodo, ya que no sabemos cuntos atributos (matrices en la representacin de matriz mltiple) para asignar de antemano. Adems, aunque el nmero de nios k est limitada por una gran constante, pero la mayora de los nodos tienen un pequeo nmero de nios, podemos perder mucho de la memoria. Afortunadamente, hay un plan inteligente para representar rboles con un nmero arbitrario de nios. Tiene la ventaja de utilizar solamente el espacio O (n) para cualquier rbol de raz n-nodo. La izquierda-infantil, la representacin de derecha hermano aparece en la figura 10.10. Al igual que antes, cada nodo contiene un puntero p padres y puntos T.root a la raz del rbol T. En lugar de tener un puntero a cada uno de sus hijos, sin embargo, cada nodo x tiene slo dos punteros:

1. x.left-nio seala al nio ms a la izquierda del nodo x, y 2. puntos x.right-hermano al hermano de x inmediatamente a su derecha.

Si el nodo x no tiene hijos, tambin x.left hijo = NIL, y si el nodo x es el ms a la derecha hijo de su padre, y luego x.right-hermano = NIL.

Otras representaciones de rboles A veces nos representamos rboles arraigados en otras formas. En el captulo 6, por ejemplo, hemos representado un montn, que se basa en un rbol binario completo, por una sola matriz ms el ndice del ltimo nodo en el montn. Los rboles que aparecen en el captulo 21 se desplazan slo hacia la

raz, por lo que slo los punteros padres estn presentes, no hay punteros a los nios. Muchos otros esquemas posibles. Qu plan es el mejor depende de la aplicacin.

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