You are on page 1of 124

1 de 51

Tercer semestre

COLABORADORES

DIRECTOR DE LA FCA
Dr. Juan Alberto Adam Siade
SECRETARIO GENERAL
L.C. y E.F. Leonel Sebastin Chavarra

COORDINACIN GENERAL
Mtra. Gabriela Montero Montiel
Jefe de la Divisin SUAyED-FCA-UNAM
COORDINACIN ACADMICA
Mtro. Francisco Hernndez Mendoza
FCA-UNAM

AUTORES
Mtro. Juan Manuel Martnez Fernndez
Lic. Ramn Castro Liceaga
DISEO INSTRUCCIONAL
L.P. Joel Guzmn Mosqueda
CORRECCIN DE ESTILO
Mtro. Francisco Vladimir Aceves Gaytan
DISEO DE PORTADAS
L.CG. Ricardo Alberto Bez Caballero
Mtra. Marlene Olga Ramrez Chavero
L.DP. Ethel Alejandra Butrn Gutirrez
DISEO EDITORIAL
Mtra. Marlene Olga Ramrez Chavero
Tercer semestre

2 de 51

OBJETIVO GENERAL
Al finalizar el curso el alumno ser capaz de entender la abstraccin; implantar, en un
lenguaje de programacin, las estructuras de datos fundamentales y avanzadas y
realizar ordenamientos y bsquedas.

TEMARIO OFICIAL
(64 horas)
Horas
1. Fundamentos de las estructuras de datos

2. Estructuras de datos fundamentales

16

3. Estructuras de datos avanzadas

16

4. Mtodos de ordenamiento

12

5. Mtodos de bsqueda

12

3 de 51
Tercer semestre

INTRODUCCIN
Las computadoras fueron diseadas como una herramienta mediante la cual se puede
realizar operaciones de clculo complicadas en un tiempo mnimo. La mayora de sus
aplicaciones son las de almacenamiento, clasificacin y acceso de grandes cantidades
de informacin, como por ejemplo el caso de un buscador en Internet.

La informacin que se procesa en la computadora es un conjunto de datos que pueden


ser simples o estructurados. Los datos simples son aquellos que ocupan slo una
localidad de memoria, mientras que los estructurados son un conjunto de casillas de
memoria a las cuales hacemos referencia mediante un identificador nico.

Debido a que por lo general tenemos que tratar con grandes volmenes de datos, y no
con datos simples (enteros, reales, booleanos, etc.) que por s solos no nos dicen nada,
ni nos sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada
necesidad.

Las estructuras de datos son objetos con los cuales se representa el manejo y
ubicacin de la informacin en la memoria interna de la computadora. Se explican a
travs de modelos con los cuales se interpreta el manejo de la informacin en la
memoria interna de la computadora, por lo cual se administra el espacio en dicha
memoria.

4 de 51
Tercer semestre

ESTRUCTURA CONCEPTUAL

5 de 51
Tercer semestre

Unidad 1.
Fundamentos de las
estructuras de datos

6 de 51
Tercer semestre

OBJETIVO PARTICULAR
Al terminar la unidad, el alumno conocer las estructuras de datos, su relacin con los
tipos de datos y su importancia para la abstraccin de datos.

TEMARIO DETALLADO
(8 horas)
1. Fundamentos de las estructuras de datos
1.1. Definicin de estructura de datos
1.2. Tipos de datos
1.3. Tipos de datos abstractos

7 de 51
Tercer semestre

INTRODUCCIN
Los tipos de datos complejos se componen de varios tipos de datos simples ya sean
del mismo tipo o de distintos, segn las necesidades, pero aquellos se dividen en
estticos y dinmicos. En esta unidad estudiaremos los diferentes tipos de datos,
especialmente los abstractos y las estructuras ms simples alojadas en la memoria
principal que se estudian por dos razones fundamentales: la primera porque de ellas
se forman otras estructuras ms complejas y, la segunda, porque varios compiladores
actualmente tienen incluidos los tipos de datos estndar.

8 de 51
Tercer semestre

1.1. Definicin de estructuras de datos


La organizacin de la informacin en la memoria interna de la computadora (Random
Access Memory, RAM) se representa con estructuras de datos y el contenido de las
pginas se representa con tipos de datos simples con los cuales se puede acceder,
manejar y almacenar la informacin.

Definicin de estructuras de datos

Es la representacin conceptual de la organizacin interna de los datos en la


memoria interna de la computadora con el fin de optimizar el empleo del
espacio de dicha memoria. (Cf. Joyanes, 1996, p. 465)

Los Tipos de Datos son objetos que representan tipos de informacin determinada
almacenada y manejada en las pginas de memoria interna de la computadora y se
utilizarn para una aplicacin.

La organizacin interna de los datos es muy importante en virtud de que la memoria


interna de la computadora es un recurso limitado, que se comparte con otros procesos
en fracciones de segundo; si no se sabe administrar dicho espacio, tenemos un
desperdicio para otra aplicacin, es decir, se desaprovechar la capacidad y potencial
de la computadora. Baste un ejemplo, si empleamos en una localidad de memoria para
almacenar el nmero uno con formato real o float cuando a priori sabemos que no
ocuparemos las decimales, implicar un desperdicio para esa localidad; en cambio si
necesitamos calcular el promedio de las estaturas de los alumnos y definimos la
variable PROM como integer, el compilador truncar las decimales resultantes del
clculo, o en el mejor de los casos redondear el resultado.

9 de 51
Tercer semestre

Si el programador o el usuario no sabe desde el inicio cul tipo de dato se debe


emplear para una variable en una aplicacin, entonces puede aplicar otros tipos de
datos como el variant que ofrece el compilador de Visual Basic, aunque no es
recomendable, ya que emplea demasiada memoria interna al manejar el dato como de
un formato nico pero de gran tamao, y el programa emplear ms recursos de la
computadora y se podr garantizar su desempeo para grandes programas con gran
nmero de lneas de cdigo. La administracin del espacio en la memoria interna de
la computadora tambin es aplicable a la memoria externa as como a los dems tipos
de memoria empleados en la actualidad, en virtud de emplear los mismos mecanismos
para leer y manipular la informacin de los perifricos de la computadora hacia la
memoria RAM.

Los tipos de datos ofrecidos por defecto en los compiladores son llamados estndar o
primitivos. Estos los abordaremos ms adelante.

Ahora estudiaremos los datos simples en su forma conceptual y su forma de


representacin en la memoria interna de la computadora. La manera de concatenar
los tems (elementos) para integrar estructuras ms complejas con las cuales realizar
alguna aplicacin en particular. Las estructuras simples no pueden contener a otras
estructuras de informacin.

Los tipos de datos manejados por la computadora bsicamente son dos, los numricos
y los alfanumricos. Los primeros estn representados por los nmeros naturales y
reales (enteros y fraccionarios) los cuales tienen ciertos rangos, en los cuales su
capacidad de alojar informacin est representada en primer instancia con un entero
(mantisa) y un exponente (fraccin) que en notacin cientfica sera 1000 = 10 * 10 2 o
10 E 3. En el mbito de la computacin; adems de considerar la mantisa y la fraccin,
hay que representar el signo, que para el positivo se usa el cero (0) y los negativos se
representan con el nmero uno (1).

10 de
51
Tercer semestre

Las estructuras de datos son representaciones de la forma en que se organiza la


informacin en la memoria interna de la computadora para su manipulacin posterior.
Son modelos tericos de cmo se agrupan los datos en las pginas de memoria interna
(memoria RAM) de la computadora para despus ir construyendo estructuras ms
amplias.

Los tipos de datos estn ntimamente relacionados con las estructuras de datos, ya
que los tipos los ofrecen los compiladores actuales, posteriormente se les asignarn
nombres a variables, y las estructuras son organizaciones de datos que conforman
estructuras con propiedades y formatos englobados bajo identificadores asignados por
el usuario para emplearse en estructuras de programacin y as ofrecer una mayor
versatilidad que imponen las aplicaciones actuales del mundo real.

1.2. Tipos de datos


Al hablar de tipos de datos, nos referimos a los atributos o caractersticas de los datos,
que le indican a la computadora o al programador la clase de datos que se van a
procesar. Esto implica que los datos poseen ciertas restricciones, por ejemplo qu
valores pueden tomar y qu operaciones se pueden realizar para su procesamiento;
es decir, que existe una estrecha relacin entre los lenguajes de programacin y los
tipos de datos, ya que una forma de instruir y proporcionar informacin a una
computadora es precisamente a travs de un lenguaje de programacin.
En general, los tipos de datos que se pueden encontrar ms comnmente en los
lenguajes de programacin son los denominados enteros, los nmeros de coma
flotante o decimales, cadenas alfanumricas, etc., no descartando la posibilidad de
que algn lenguaje pudiese manejar terminologa diferente.

En este tema veremos cmo se relacionan diferentes y actuales lenguajes de


programacin, con el manejo de las estructuras de datos.
11 de
51
Tercer semestre

Los datos de tipo carcter se pueden unir y formar una cadena y despus otro tipo de
estructuras llamadas arreglos. Los de tipo entero pueden ser convertidos en su punto
decimal que estar en posiciones flotantes y no de manera fija como en el entero. En
el caso de Visual Basic hay otro tipo de dato particular como el Fix cuyo punto flotante
est fijo y el nmero de decimales se determinar como constante.
Los tipos de datos los podemos abordar como: tipos de datos simples estndar, que
son un conjunto de datos ms amplio que los tipos de datos primitivos, que son datos
necesarios para formar estructuras de datos; adems de los datos definidos por el
programador, tambin conocidos como datos incorporados . Veamos de qu se trata
cada uno.

Tipos de datos estndar

Los tipos de datos estndar son aquellos que no presentan una estructura, son
unitarios y nos permiten almacenar un solo dato.
Entero

El tipo entero es un subconjunto de los nmeros enteros, que dependiendo


del lenguaje que estemos usando, podr ser mayor o menor que 16 bits
(2^16=32768); es decir, se pueden representar desde el -32768 hasta el
32767. Para representar un nmero entero fuera de este rango se tendra
que usar un dato de tipo real.

Real

El tipo real define un conjunto de nmeros que puede ser representado con
la notacin de punto-flotante, por lo que nos permite representar datos muy
grandes o muy especficos.

Carcter

Cualquier signo tipogrfico. Puede ser una letra, un nmero, un signo de


puntuacin o un espacio. Generalmente, este tipo de dato est definido por
el conjunto ASCII.

Lgicos

Este tipo de dato, tambin llamado booleano, permite almacenar valores de


lgica booleana o binaria; es decir, representaciones de verdadero o falso.
Nota: La definicin del tipo lgico no es conocida en todos los lenguajes de
programacin como es el caso de C y PHP los cuales no manejan variables
de tipo booleano como tal. Esta discusin la tocaremos ms adelante.
12 de
51

Tercer semestre

Float

Este tipo de datos se emplean en aquellos datos fraccionarios que


requieren de cifras a la derecha del punto decimal o de entero con
varios decimales. De estos se desprende la necesidad de crear el
formato de representacin cientfica (10 E +12).

Definidos por el programador


Este tipo de datos nos ayuda a delimitar los datos que podemos manejar dentro de un
programa y nos sirve como una manera segura de validar la entrada/salida de ste.

Subrango

En este tipo de datos delimitamos el rango, menor y mayor, de los


posibles valores que puede tomar una variable, de esta manera
podemos asegurar que la entrada o salida de nuestro programa est
controlada.
Ejemplos:
type Tipo1 = 1.. 30
type Tipo2 = 1.. 10

Enumerativo

Los tipos de dato enumerativo pueden tomar valores dentro de un rango en


el que se especifica ordenadamente cada uno de dichos valores, al igual
que el tipo de subrango, nos permite restringir los valores de una variable.

Como ejemplo de esta jerarqua de datos, podemos mencionar los siguientes tipos de
datos en el lenguaje Visual Basic.

String

Datos que pueden tener texto o cualquier carcter.

Integer

Datos que pueden tener cualquier nmero entero, o sea, no


tiene punto decimal. Puede tener valores desde 32,768
hasta 32,767.

Long integer

Puede

tener

cualquier

nmero

entero,

desde

2,147,483,648 hasta 2,147,483,647.


Single-precision

Nmero con un mximo de seis (6) lugares decimales.

(floating point)

13 de
51
Tercer semestre

Double-precision

Nmero con un mximo de catorce (14) lugares decimales.

(floating point)
Variant

Este tipo de datos es especfico de Visual Basic y puede


tener cualquier tipo de datos, pues deja que el lenguaje
encuentre la mejor forma de guardar datos. Por esa razn,
toma ms memoria y hace los programas ms lentos que si
se usan los otros tipos de datos.

Currency

Otro tipo de floating point. Puede tener valores desde 922


trillones hasta 922 trillones.

Bolean

Tiene slo los valores True (cierto) o False (falso).

Byte

Tiene nmeros enteros desde 0 a 255.

Otro tipo de datos de este lenguaje, son los de tipo fecha (Date), que pueden tener varios
formatos, con o sin separador, como puede ser DDMMYY (da, mes y ao) con sus
diferentes combinaciones como AAAAMMDD (ao, mes y da).

La definicin del tipo booleano o lgico no es soportada o conocida en todos los


lenguajes de programacin. El tipo de dato lgico o booleano representa valores de
lgica binaria; es decir, dos valores que se expresa en falso o verdadero. Una
14 de
51
Tercer semestre

constante booleana o lgica, acepta el valor falso o verdadero (false o true), que se
representan con 0 y 1 respectivamente, en muchos lenguajes de programacin. El
valor de una constante booleana no cambia durante la ejecucin del programa.
Una variable booleana o lgica tambin acepta solamente uno de dos valores:
verdadero (true) o falso (false), pero el valor en cuestin puede cambiar durante la
ejecucin del programa.
En el siguiente ejemplo se muestra la implementacin de una variable de tipo Boolean
en lenguaje Visual Basic que almacena un nico parmetro de tipo s / no.

Dim runningVB As Boolean


' Checa si un programa es ejecutado en Visual Basic.
If scriptEngine = "VB" Then
runningVB = True
End If

En otros casos, para generar un dato o valor lgico a partir de otros tipos de datos,
tpicamente, se emplean los operadores relacionales (u operadores de relacin), por
ejemplo: 0 es igual a falso y 1 es igual a verdadero. Por ejemplo:

(3>2)= 1 = verdadero
(7>9)= 0 = falso

En el Lenguaje C, como no posee ninguna implementacin primitiva del tipo booleano,


para declarar variables de este estilo, hace falta definirlo previamente. La manera de
hacerlo es aadir entre las declaraciones de tipos la siguiente instruccin:

typedef enum {FALSE=0, TRUE=1} booleano;

sta define el tipo booleano y asigna a sus elementos FALSE y TRUE, los valores 0 y
1 respectivamente.
15 de
51
Tercer semestre

En Visual Basic, los booleanos o de tipo lgico son de tamao de un byte y slo podrn
contener un valor, ya sea un cero o un nmero uno; es decir falso o verdadero, y son
muy tiles en programacin para asignar un valor inicial a una bandera en un
programa de computadora, lo que podr cambiar dicho valor y entonces el programa
realizar otras acciones.

Operandos

Operador

Operacin

Resultado

35,9 (enteros)

>

35 > 9

verdadero

35,9 (enteros)

<

35 < 9

falso

35,9 (enteros)

==

35 = = 9

falso

35,9 (enteros)

!=

35 ! = 9

verdadero

5,5 (enteros)

<

5<5

falso

5,5 (enteros)

<=

5< =5

verdadero

5,5 (enteros)

!=

5!=5

falso

a, c

==

a = = c

falso

>=

a >= c

falso

<=

a < = c

verdadero

(caracteres)
a, c
(caracteres)
a, c
(caracteres)

El tipo de dato variant, es exclusivo de Visual Basic; consiste en un tipo de dato


especial que contiene datos numricos, de cadena o de fecha, as como tipos definidos
por el usuario, y los valores especiales Empty y Null. El tipo de datos variant tiene un
tamao de almacenamiento numrico de 16 bytes, puede contener datos hasta el
intervalo de un tipo decimal o un tamao de almacenamiento de caracteres de 22 bytes
(ms la longitud de cadena), y almacenar cualquier texto. La funcin VarType define
el tratamiento que reciben los datos de un variant. Todas las variables son del tipo
variant, a menos que se declaren explcitamente como de cualquier otro tipo. Los de
tipo variant se encuentran en el Compilador de Visual Basic y ocupan una gran
16 de
51
Tercer semestre

cantidad de memoria interna, por eso se deben ocupar lo menos posible en un


programa, con la salvedad de que no se sepa a priori el formato idneo de un campo
en una aplicacin en particular.

En aplicaciones especficas, como Access, los tipos de datos ofrecidos son an


mayores, como los de tipo MEMO (un pequeo campo de texto que puede contener
hasta 65.536 caracteres por campo), o los de tipo PICTURE u OBJECT, los cuales
pueden almacenar imgenes de cierto tamao.

Actualmente las computadoras procesan, en mayor grado, informacin simblica como


nombres, palabras, direcciones o imgenes. Los lenguajes de programacin modernos
cuentan cuando menos con una forma para representar la informacin simblica, como
es el caso del lenguaje de programacin Racket (formalmente llamado PLT Scheme o
Dr. Racket). Este lenguaje funcional soporta diversas formas de expresin simblica:
smbolos, cadenas, caracteres e imgenes en movimiento.

El siguiente es un ejemplo de programacin en Racket del juego de la guerra de los


mundos.

17 de
51
Tercer semestre

1.3. Tipos de datos abstractos


El concepto de Tipo de Dato Abstracto (TDA, Abstract Data Type), surge en 1974 por
John Guttag, pero fue hasta 1975 que por primera vez, Brbara Liskov, lo propuso para
el lenguaje de programacin llamado CLU 1 . Posteriormente fue implementado por
lenguajes modulares como Turbo Pascal y Ada, y en la actualidad son estructuras muy
utilizadas en el paradigma orientado a objetos.

Los Tipos de Datos Abstractos son modelos con los cuales se representan estructuras
con propiedades relativas a un tipo de dato que involucra objetos, los cuales tienen
atributos, y todos ellos servirn para desarrollar una aplicacin en particular.

Los TDA no hacen referencia a un tipo de dato especfico, sino que su finalidad es la
generalizacin de la definicin del objeto dentro del TDA con sus propiedades
establecidas. Los datos abstractos son el resultado de empacar un tipo de datos junto
con sus operaciones, de modo que pueda considerarse en trminos de sus
generalidades, sin que el programador tenga que preocuparse por una representacin
en memoria o la instruccin de sus operaciones.
Por ejemplo:

Para mayor informacin, ver: http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-561.pdf


(consultado el 28 de enero de 2013)
18 de
51
Tercer semestre

Al comenzar el diseo de un TDA (tipo abstracto), es necesario tener una


representacin genrica del objeto sobre el cual se quiere trabajar, sin establecer un
compromiso con ninguna estructura de datos concreta y el tipo de dato del lenguaje
de programacin seleccionado. Esto va a permitir expresar las condiciones, relaciones
y operaciones de los elementos modelados, sin restringirse a una representacin
interna concreta. En este orden, lo primero que se hace es dar nombre y estructura a
los elementos a travs de los cuales se puede modelar el estado interno de un objeto
abstracto, utilizando algn formalismo matemtico o grfico.

Siempre hay que tomar en cuenta que un TDA es un modelo abstracto para resolver
un problema en particular y generar el programa correspondiente. La finalidad es
aplicarse de forma general a los problemas semejantes, al originalmente planteado,
por lo que resulta independiente del compilador al cual se le encargar de interpretar
el programa fuente que cre el programador.

Un TDA se define con un nombre, un formalismo para expresar un objeto abstracto,


un invariante2 o un conjunto de operaciones sobre este objeto.

Parte de un sistema que no admite las variaciones que afectan a otras partes del
mismo.(http://www.wordreference.com/definicion/invariante, ref. 28/01/2013)
19 de
51
Tercer semestre

Veamos el siguiente esquema:


TDA <nombre>
<Objeto abstracto1>
<Invariante del TDA>
<Operaciones>
<Objeto abstracto2>
<Invariante del TDA>
<Operaciones>

20 de
51
Tercer semestre

Precondici
n

Object1
Funcionalidad

A
Postcondi
cin

X(I J)

Dominio

X(A,J)

Object2
Propiedad

Estructura de un TDA. Elaboracin propia.

En cuanto a la estructura de un TDA, podemos decir que la especificacin de las


operaciones consta de dos partes: primero se coloca la funcionalidad de cada una de
ellas (dominio y codominio de la operacin) y, luego su comportamiento, mediante dos
aserciones (precondicin y postcondicin) que indican la manera como se va
afectando el estado del objeto una vez ejecutada la operacin.

A continuacin se muestra un ejemplo de una estructura de un TDA y aplicacin de la


misma.
Ahora veamos de forma muy general un TDA para la Aplicacin Auto.
Tamao

Altura

Anchura

Largo

Centmetros

Motor
Centmetros

CAPACIDAD

Cbicos
TDA de Auto

21 de
51
Tercer semestre

El TDA Auto de la tabla anterior, se escribe en pseudocdigo de la siguiente forma:


TDA AUTO
<Object Tamao>
Altura. Centmetros
Anchura.
Largo.
<Object Motor>
Capacidad.
END AUTO

Si se definen ms objetos para este TDA, entonces se necesitarn ms renglones para


cada propiedad.

22 de
51
Tercer semestre

RESUMEN
En esta unidad estudiamos el concepto de lo que es una estructura de datos,
considerando los diferentes tipos de datos que se procesan.

Hemos visto que las Estructuras de Datos son modelos tericos que muestran la forma
en que la computadora maneja la informacin en la memoria interna. Son
organizaciones de datos que conforman estructuras con propiedades y formatos
englobados bajo identificadores asignados por el usuario para emplearse en
estructuras de programacin, simples o complejas y as ofrecer una mayor versatilidad
de manejo de informacin a las aplicaciones informticas actuales.

Establecimos que la forma en que se transmite la informacin o datos a la computadora


es por medio de un lenguaje de programacin, que soporte y sea capaz de
representarla an cuando sea abundante y compleja, de acuerdo con los avances de
la actualidad.

De igual modo, conceptualizamos los tipos de datos como un conjunto de valores que
se pueden tomar durante la ejecucin de un programa determinado.

Asimismo, se concibe a un TDA (Tipo de dato abstracto) como modelo matemtico


compuesto por una coleccin de operaciones definidas sobre un conjunto de datos
para su aplicacin en un modelo.

23 de
51
Tercer semestre

BIBLIOGRAFA

SUGERIDA
Autor
Joyanes (1996)

Captulo

Pginas

7. Estructuras de datos I

274-283

Joyanes Aguilar, Luis. (1996). Fundamentos de programacin: Algoritmos y estructura


de datos. (2 ed.) Mxico: McGraw-Hill [Vista previa de la 3 ed.]

24 de
51
Tercer semestre

Unidad 2.
Estructuras de
datos fundamentales

25 de
51
Tercer semestre

OBJETIVO PARTICULAR
Al terminar la unidad, el alumno conceptualizar los tipos de datos complejos, su
construccin a partir de datos simples y sus caractersticas principales para su
aplicacin en la solucin de problemas especficos.

TEMARIO DETALLADO
(16 horas)
2. Estructuras de datos fundamentales
2.1. Arreglos
2.1.1. Unidimensionales
2.1.2. Multidimensionales
2.1.3. Operaciones con arreglos
2.2. Pilas
2.2.1. Operaciones con pilas
2.3. Colas
2.3.1. Operaciones con colas
2.3.2. Bicolas
2.4. Listas
2.4.1. Listas simplemente enlazadas
2.4.2. Listas doblemente enlazadas
2.4.3. Listas circulares
2.4.4. Operaciones con listas

26 de
51
Tercer semestre

INTRODUCCIN
El manejo de los datos complejos se integran de varios tipos de datos simples, puede
ser procesando datos simples ya sea del mismo tipo o de varios tipos, segn sus
necesidades, para lo cual se dividen en Estticos y Dinmicos. Los tipos de datos
simples ocupan solo una casilla de memoria en los que podemos mencionar en
lenguaje C a los de tipo int, byte, short, long, doubl, float, char y boolean. Tenemos
tambin a los tipos de datos estructurados que hacen referencia a un grupo de casillas
de memoria como los Arreglos o vectores, archivos, rboles, registros, etc. En esta
unidad explicaremos las estructuras ya mencionadas.

27 de
51
Tercer semestre

2.1. Arreglos
Los arreglos son estructuras de datos compuestos en las que se utilizan uno o ms
subndices para identificar los elementos individuales almacenados, a los que es
posible tener acceso en cualquier orden (Cf. Joyanes, 1996).

El arreglo es una estructura de datos que hace referencia a un grupo de casillas de


memoria que se puede ver como una coleccin finita3, homognea4 y ordenada5 de
elementos.

Un arreglo tiene dos tipos de datos asociados, los numricos y los caracteres. Las dos
operaciones bsicas a realizar en un arreglo son la alimentacin y la extraccin. La
primera operacin, acepta un acceso a una posicin del arreglo con la ayuda de un
dato de tipo ndice, ya sea ordinario (entero), inicializndolo desde el 0. La segunda
operacin hace uso del ndice para llegar al elemento deseado para despus
eliminarlo.

El elemento ms pequeo de un arreglo del tipo ndice es su lmite inferior, y el ms


alto, su lmite superior.

Finita: quiere decir que indica el nmero mximo de elementos.


Homognea: Quiere decir que son del mismo tipo de dato (sea entero, real, carcter, etc.) Esta
caracterstica es fundamental en los arreglos ya que en esta estructura de datos no se permite
mezclar diferentes tipos.
5
Ordenada: quiere decir que llevan un orden consecutivo a travs de un ndice.
4

28 de
51
Tercer semestre

Ejemplo.

A=

34

45

12

05

93

(0)

(1)

(2)

(3)

(4)

ndices

Datos

2.1.1. Arreglos Unidimensionales


Es una estructura que utiliza el mismo tipo de dato en forma secuencial comnmente
denominada vector, por estar definida por una sola dimensin y sus nodos ledos en
una sola direccin. Una matriz de una dimensin se le llama Vector y est definida por
la notacin V = [0, 1, 2, 3, 4, 5].

Un vector es un arreglo unidimensional que slo utiliza un ndice para referenciar a


cada uno de los elementos. Su declaracin es la siguiente:

tipo nombre [tamao];

Veamos un ejemplo de programacin de un arreglo, usando lenguaje C:

#include <stdio.h>
main() /* Rellenamos el arreglo del 0 al 9 */
{
int vector[10],i;
for (i=0;i<10;i++) vector[i]=i;
for (i=0;i<10;i++) printf(" %d",vector[i]);
}

29 de
51
Tercer semestre

En este ejemplo definimos el arreglo, llamado vector, de tamao de 10 nmeros


enteros. Incluye la librera stdio.h (para manejo de valores de entrada y salida). Utiliza
dos instrucciones de ciclo for, una para grabar el arreglo con el incremento del ndice
y otro para mostrar los valores utilizando la instruccin printf del lenguaje C.

2.1.2. Arreglos Multidimensionales


Un arreglo tambin puede ser de ms de dos dimensiones: una matriz es un arreglo
multidimensional.

Por ejemplo, en lenguaje C se definen igual que los vectores, excepto que se requiere
un ndice por cada dimensin. Su sintaxis es la siguiente:

tipo nombre [tamao 1][tamao 2]...;

La representacin de arreglos en la forma de fila mayor puede extenderse a arreglos


de ms de dos dimensiones.

Para el caso de un arreglo con estructura tridimensional, estar especificado por medio
de tres subndices: El primer ndice precisa el nmero del plano; el segundo el de la
fila; y el tercero, el de la columna. Este tipo de arreglo es til cuando se determina un
valor mediante tres entradas.

30 de
51
Tercer semestre

Descripcin Grfica de un Arreglo de tres Dimensiones


Vase en: http://www.wikilearning.com/curso_gratis/aprende_c_con_paranoix-matriz_tridimensional/22916-17

El ltimo subndice vara rpidamente y no aumenta, sino hasta que todas las
combinaciones posibles de los subndices a su derecha hayan sido completadas.

2.1.3. Operaciones con arreglos


Las operaciones bsicas que se emplean en los arreglos son las siguientes:

Lectura/Escritura

El proceso de lectura de un arreglo consiste en leer y


asignar un valor a cada uno de sus componentes. Similar
a la lectura, se debe escribir el valor de cada uno de los
componentes.

Asignacin

En este caso no es posible asignar directamente un valor


a todo el arreglo; sino que se debe asignar el valor
deseado a cada componente.

Actualizacin

Este proceso se puede dar a travs de tres operaciones


bsicas: insercin o adicin de un nuevo elemento al
arreglo, eliminacin o borrado de un elemento del

31 de
51
Tercer semestre

arreglo y modificacin o reasignacin de un elemento


del arreglo.
Ordenacin

Es el proceso de organizar los elementos de un vector en

- Insercin

algn orden dado que puede ser ascendente o

- Eliminacin

descendente. Existen diferentes formas o mtodos para

- Modificacin

hacer este proceso: mtodo de burbuja, mtodo de

- Ordenacin

burbuja mejorado, ordenacin por seleccin, insercin o


mtodo de la baraja, mtodo Shell, Binsort o por urnas,
ordenacin por montculos o HeapSort, por mezcla o
MergeSort, mtodo de la sacudida o Shackersort, Rapid
Sort o Quick Sort, por rboles, etc6.

Bsqueda

Consiste en encontrar un determinado valor dentro del


conjunto de datos del arreglo para recuperar alguna
informacin asociada con el valor buscado. Existen
diferentes formas para hacer esta operacin: bsqueda
secuencial o lineal, bsqueda binaria, bsqueda HASH,
rboles de bsqueda7.

6
7

En la unidad 4 abordaremos a detalle estos mtodos.


Posteriormente, en la unidad 5, abordaremos estos mtodos a detalle.
32 de
51

Tercer semestre

Arreglos bidimensionales

En el caso de la matriz bidimensional, se representar grficamente como una tabla


con filas y columnas.

Por ejemplo, una matriz de 2X3 (2 filas por 3 columnas), se inicializa de este modo
usando el lenguaje C/C++:

int matriz[2][3] = {
{ 20,50,30 },
{ 4,15,166 }
};

Una matriz de 3X4 (3 filas por 4 columnas), usando los mismos lenguajes, se inicializa
de este modo:

int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

Donde quedaran asignados de la siguiente manera:


numeros[0][0]=1 numeros[0][1]=2

numeros[0][2]=3

numeros[0][3]=4

numeros[1][0]=5 numeros[1][1]=6

numeros[1][2]=7

numeros[1][3]=8

numeros[2][0]=9 numeros[2][1]=10 numeros[2][2]=11 numeros[2][3]=12

Otra manera de llenar el arreglo, es mediante una instruccin FOR anidada, como se
muestra en el siguiente cdigo:

33 de
51
Tercer semestre

/* Ejemplo de matriz bidimensional. */


#include <stdio.h>
main() /* Rellenamos una matriz de dos dimensiones */
{
int x,i,numeros[3][4]; /* rellenamos la matriz */
printf("Dime los valores de matriz 3X4\n");
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
}

En este ejemplo leemos los valores del arreglo con una instruccin scanf y los
mostramos con una instruccin printf. Ntese que en ambos casos utilizamos una
instruccin FOR anidada.

Arreglo de dos Dimensiones

Un arreglo de dos dimensiones ilustra claramente las diferencias lgica y fsica de un


dato, es una estructura de datos lgicos, til en programacin y en la solucin de
problemas. Sin embargo, aunque los elementos de dicho arreglo estn organizados
en un diagrama de dos dimensiones, el hardware de la mayora de las computadoras
no da este tipo de facilidad. El arreglo debe ser almacenado en la memoria de la
computadora y dicha memoria es usualmente lineal; es decir, las computadoras tienen
una arquitectura cuyo procesador ingresa la informacin secuencialmente hasta que
una pgina de memoria se completa para continuar con la siguiente.
34 de
51
Tercer semestre

Un mtodo para mostrar un arreglo de dos dimensiones en memoria es la


representacin fila mayor. Bajo esta representacin, la primera fila del arreglo ocupa
el primer conjunto de posiciones en memoria reservada para el arreglo; la segunda el
segundo y as sucesivamente.

2.2 Pilas
Una pila (stack) es un tipo especial de lista en la que la insercin y borrado de nuevos
elementos se realiza slo por un extremo que se denomina cima o tope (SUA
Informtica II, 1998, pp. 63 y ss.).

Definicin del tipo de dato abstracto pila

Una pila es una coleccin ordenada de elementos en la cual, en un extremo, pueden


insertarse o retirarse otros elementos, ubicados por la parte superior de la pila. Una
pila permite la insercin y eliminacin de elementos, por lo que realmente es un objeto
dinmico que cambia constantemente.

Vase en: http://commons.wikimedia.org/wiki/File:Pila.svg

Un ejemplo de pila o stack se puede observar en el mismo procesador; es decir, cada


vez que en los programas aparece una llamada a una funcin el microprocesador

35 de
51
Tercer semestre

guarda el estado de ciertos registros en un segmento de memoria, conocido como


Stack Segment, mismos que sern recuperados al regreso de la funcin.

2.2.1. Operaciones con pilas.


Los dos cambios que pueden hacerse en una pila, tienen nombres especiales; cuando
se agrega un elemento a la pila, ste es empujado (pushed) dentro de la pila; la
operacin pop, retira el elemento superior y lo regresa como el valor de una funcin;
la empty determina si la pila est o no vaca; y la stacktop determina el elemento
superior de la pila sin retirarlo (debe retomarse el valor del elemento de la parte
superior de la pila).

Asimismo, una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar. Sin
embargo las implementaciones modernas consideran otras operaciones adicionales
como son creacin de la pila, obtener el nmero de elementos de la pila, verificar el
elemento que est en el tope de la pila y saber si la pila se encuentra vaca.

Implantacin de una pila basada en un arreglo esttico.


La implantacin de una pila, al igual que otras estructuras de datos, puede estar
basada en estructuras estticas o dinmicas y ser desarrollada en cualquier lenguaje
de programacin que soporte dichas estructuras.

Utilizando la estructura esttica de un arreglo podemos implementar una pila, por


ejemplo en el lenguaje C++, considerando las siguientes operaciones y definicin del
arreglo:

put(), poner un elemento en la pila


get(), retirar un elemento de la pila
empty(), regresa 1 (TRUE) si la pila est vaca
size(), nmero de elementos en la pila
36 de
51
Tercer semestre

El atributo SP de la clase Stack es el apuntador de lectura/escritura; es decir, el SP


indica la posicin dentro de la pila en donde la funcin put() insertar el siguiente dato,
y la posicin dentro de la pila de donde la funcin get() leer el siguiente dato. Cada
vez que put() inserta un elemento, el SP se decrementa. Cada vez que get() retira un
elemento, el SP se incrementa.

La implementacin del arreglo para el lenguaje C++ quedara de la siguiente manera:

#define STACK_SIZE 256 /* capacidad mxima de la Pila*/


typedef char almacen[STACK_SIZE];

Operacin para insertar un elemento a una pila


Los nuevos elementos de la pila deben colocarse en su parte superior que se mueve
hacia arriba para dar lugar a un nuevo elemento ms alto; adems, los que estn en
este lugar pueden ser removidos (en este caso, la parte superior se desliza hacia abajo
para corresponder al nuevo elemento ms alto).
Ejemplo:
En una pelcula en movimiento de una pila se agrega el elemento G a la pila. A medida que
nuestra pelcula avanza, puede verse que los elementos F, G y H han sido agregados
sucesivamente a la pila. A esta operacin se le llama lista empujada hacia abajo.

bD

B
cA

Movimiento en la Pila
37 de
51
Tercer semestre

Operacin para revisar si una pila es vaca o no


Una pila puede utilizarse para registrar los diferentes tipos de signos de agrupacin.
En cualquier momento que se encuentre un signo de estos abriendo la expresin, es
empujado hacia la pila, y cada vez que se detecte el correspondiente signo terminal,
sta se examina. Si la pila est vaca, quiere decir que el signo de la agrupacin
terminal no tiene su correspondiente apertura, por lo tanto, la hilera es invlida. En C++
podemos definir una funcin vaca (empty) para que regrese 1 si no hay elementos en
la lista; es decir, si la lista est vaca.

int empty() { return ITEMS == 0; }

Operacin para obtener el ltimo elemento insertado en la pila


La operacin pop retira el ltimo elemento superior y lo regresa como un valor de la
funcin (en cada punto se aleja el elemento superior, porque la operacin slo puede
hacerse desde este lugar). El atributo ms importante consiste en que el ltimo
elemento insertado en una pila es el primero en ser retirado. En la siguiente funcin de
C++, cada vez que put() inserta un elemento el SP (indicador de posicin) se
decrementa.

/* insertar elemento a la pila */


int put(char d)
{
if ( SP >= 0) {
PILA[SP] = d;
SP --;
ITEMS ++;
}
return d;
}

38 de
51
Tercer semestre

Operacin para remover el ltimo elemento insertado en la pila


La operacin stackpop (avance de elementos) determina el elemento superior de la
pila, basta con retirarlo y reasignar el valor del elemento de la parte superior de la pila.

En la siguiente funcin, usando C++, cada vez que get() retira un elemento, el SP se
incrementa.
/* retirar elemento de la Pila */
int get()
{
if ( ! empty() ) {
SP ++;
ITEMS --;
}
return PILA[SP];
}
Implantacin de una Pila Dinmica
Esta implantacin es igual a la anteriormente mencionada, con la diferencia de que
una pila enlazada dinmicamente no tiene, de forma natural, el mecanismo de acceso
por ndices, por lo tanto el programador puede crear los algoritmos necesarios para
permitir tal comportamiento utilizando apuntadores o ligas a los nodos. Para tal efecto,
se crean estructuras conocidas como nodos o registros. Un registro en Lenguaje C o
C++, se define de la siguiente forma.
/* tipo de dato que contendr la Pila */
typedef char DATA_TYPE;

// declaracin de estructura nodo o registro


struct nodo {
DATA_TYPE data;
nodo *next;
};
39 de
51
Tercer semestre

En esta estructura nodo, de tipo carcter, se define un apuntador que liga a next
(siguiente).

La pila incorpora la insercin y supresin de elementos, por lo que sta es un objeto


dinmico constantemente variable. La definicin especifica que un extremo de la pila
se designa como tope de la misma. Pueden agregarse nuevos elementos en el tope
de la pila, o quitarse.
PILAS DINMICAS
1) Al principio la lista est vaca, en ese caso el SP es igual a NULL
y, en consecuencia, el puntero next tambin es NULL.
SP = NULL
+------+------+
| ???? | next |--> NULL
+------+------+
2) Despus de agregar el primer elemento la situacin se vera as:
SP = asignado
1
+------+------+
| data | next |--> NULL
+------+------+
3) Despus de agregar otro elemento la situacin se vera as:
SP = asignado
2
1
+------+------+ +------+------+
| data | next |--> | data | next |--> NULL
+------+------+ +------+------+
Vase en http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Estructuras_II

La implantacin de la clase Pila Dinmica (StackDim) quedar de la siguiente forma:

class StackDin {
// atributos
int ITEMS; /* nmero de elementos en la lista */
int ITEMSIZE; /* tamao de cada elemento */
40 de
51
Tercer semestre

nodo *SP;

/* puntero de lectura/escritura */

public:
// constructor de la pila dinmica
StackDin() : SP(NULL), ITEMS(0), ITEMSIZE(sizeof(DATA_TYPE)) {}
// destructor
~StackDin() {}
/* agregar componente a la lista */
DATA_TYPE put(DATA_TYPE valor)
{
nodo *temp;
temp = new nodo;
if (temp == NULL) return -1;
temp->data = valor;
temp->next = SP;
SP = temp;
ITEMS ++;
return valor;
}
int empty() { return ITEMS == 0; }
/* retirar elemento de la lista */
DATA_TYPE get()
{
nodo *temp;
DATA_TYPE d;
if ( empty() ) return -1;
d = SP->data;
temp = SP->next;
if (SP) delete SP;
SP = temp;
ITEMS --;
return d;
}
}; // fin de la clase StackDin
41 de
51
Tercer semestre

La implementacin de clases tambin se conoce como Programacin Orientada a


Objetos o POO. Es un paradigma de programacin que usa los objetos en sus
interacciones para disear aplicaciones y programas informticos. Las clases son
representaciones abstractas de los objetos que nos permiten definir las propiedades y
comportamiento de los mismos, como en este caso la representacin abstracta de una
Pila Dinmica.

Con esta forma de implantacin de Pilas concluimos este tema, para pasar al siguiente,
de igual importancia en el mbito de estructuras de datos, como son las Colas.

2.3. Colas
En la vida cotidiana es muy comn ver las colas como formas organizativas para
agilizar los servicios de una empresa u organizacin escolar. En informtica, una cola
representa una estructura de datos en la cual slo se pueden insertar nodos en uno
de los extremos de la lista y slo se pueden eliminar nodos en el otro extremo. Tambin
se le llama estructura FIFO (First In First Out), debido a que el primer elemento en
entrar ser tambin el primero en salir. Al igual que las pilas, las escrituras de los datos
son inserciones de nodos y las lecturas siempre eliminan el nodo ledo.
Las colas se utilizan en sistemas informticos, bancos, empresas, servicios,
transportes y operaciones de investigacin (entre otros), donde los objetos,
transacciones, personas o eventos, son tomados como datos que se almacenan y se
guardan mediante colas para su posterior procesamiento. Este tipo de estructura de
datos abstracta tambin se implementa en lenguajes orientados a objetos mediante
clases, en forma de listas enlazadas.

42 de
51
Tercer semestre

En este ejemplo vemos una representacin grfica de una cola.

Vase en: http://commons.wikimedia.org/wiki/File:Cola.svg

2.3.1 Operaciones con colas


Las operaciones que se pueden realizar con una cola son:

Crear: se crea la cola vaca (constructor).

Encolar (aadir, entrar, insertar): se aade un elemento a la cola. Se aade


al final de sta.

Desencolar (sacar, salir, eliminar): se elimina el elemento frontal de la cola;


es decir, el primer elemento que entr.

Frente (consultar, front): se devuelve el elemento frontal de la cola; es decir, el


primer elemento que entr.

Implantacin de cola dinmica


Siguiendo con el lenguaje C++, en esta estructura nodo de tipo carcter se define un
apuntador que liga a next (siguiente).
typedef char DATA_TYPE;
struct nodo {
DATA_TYPE data;
nodo *next;
};
43 de
51
Tercer semestre

Se crea la cola vaca y se inicializan los atributos.

// definicin de atributos
int ITEMS, ITEMSIZE;
nodo *cola, *cabeza;

public:
// constructor
QueueDin() : cola(NULL), cabeza(NULL), ITEMS(0),
ITEMSIZE(sizeof(DATA_TYPE)) {}
En la siguiente funcin de C++, cada vez que put() inserta un elemento a la
cola queda como cabeza y se incrementan los elementos (ITEMS) .
/* encolar un componente */
DATA_TYPE put(DATA_TYPE valor)
{
nodo *temp;
temp = new nodo;
if (temp == NULL) return -1;
ITEMS ++;
temp->data = valor;
temp->next = NULL;
if (cabeza == NULL)
{
cabeza = temp;
cola = temp;
} else
{
cola->next = temp;
cola = temp;
}
return valor;
}
44 de
51
Tercer semestre

En la siguiente funcin de C++, cada vez que get() saca un elemento de la cola la
cabeza se van recorriendo o disminuyendo los elementos (ITEMS)

/* desencolar un elemento */
DATA_TYPE get()
{
nodo *temp;
DATA_TYPE d;
if ( empty() ) return -1;
d = cabeza->data;
temp = cabeza->next;
if (cabeza) delete cabeza;
cabeza = temp;
ITEMS --;
return d;
}
Como ejercicio personal, puedes integrar los cdigos anteriores y hacer un programa
en C++ llamado ColaDinmica, y probarlo en un compilador para que tengas mayor
claridad de su funcionamiento.

Colas de prioridades
En ocasiones necesitaremos un algoritmo que nos ayude a seleccionar un elemento
de un grupo. A uno de los valores de la informacin agrupada en la estructura se le
llama prioridad, este es un valor entero, y el menor valor entero est asociado a la
estructura que tiene mayor prioridad. Prioridad se entiende como sinnimo de lo ms
importante. Puede haber varias estructuras con igual prioridad y en este sentido no
sern conjuntos.
Para efectos de estructuras de datos, una cola de prioridades, es una estructura en la
que los elementos se procesan en el orden indicado por una prioridad asociada a cada
uno de estos. En el caso de que varios elementos tengan la misma prioridad, el
45 de
51
Tercer semestre

procesamiento se atender de modo convencional segn la posicin en que tengan en


la estructura.

Vase en: http://www.udg.co.cu/cmap/estrdatos/colas/ColasPrioRepListasUnicas.htm

Como un ejemplo de este tipo de estructura, es la que aplican los bancos al atender a
clientes especiales. Otro ejemplo tpico es la programacin, formando colas de
prioridades en el sistema de tiempo compartido necesario para mantener un conjunto
de procesos que esperan servicio para trabajar. Los diseadores y programadores de
esta clase de sistemas asignan cierta prioridad a cada proceso.

La prioridad se define como un valor numrico asignando a altas prioridades valores


pequeos, las colas de prioridad nos permiten aadir elementos en cualquier orden y
recuperarlos de menor a mayor.

Las operaciones que se pueden realizar con colas de prioridades.


Las operaciones que se pueden realizar con una cola son:

Crear

Se crea la cola vaca.

Aadir

Se aade un elemento a la cola, con su correspondiente


prioridad.

Eliminar

Se elimina el elemento frontal de la cola.

Frente

Se devuelve el elemento frontal de la cola.

Destruye

Elimina la cola de memoria.

46 de
51
Tercer semestre

Implantacin dinmica de una cola de prioridades

En esta implementacin, se trata de crear tantas colas como prioridades haya, y


almacenar cada elemento en su cola utilizando clases en lenguaje de programacin
Java. Se crea clase principal ColaPrioridad que implementa colaPrioridadInterface.
Posteriormente, el constructor crea el objeto cola de la clase Celda y cola.sig
inicializada en null. Se define el mtodo pblico booleano vaca (empty) que regrese
1 si no hay elementos en la cola; es decir, si la cola est vaca. Tambin se define el
mtodo primero y primero_prioridad que devuelven el elemento frontal de la cola y
su prioridad respectiva. Con el mtodo public inserta se aade un elemento a la cola,
con su correspondiente prioridad. El mtodo suprime eliminar el elemento de la cola
en la memoria.

Como ejercicio personal, implementa ste programa en lenguaje de programacin


C++ que se encuentra en la siguiente ruta:
http://casicodigo.blogspot.mx/2012/11/cola-con-prrioridad-en-c.html

2.3.2. Bicolas (SUA Informtica II, 1998, pp.59 y ss.)


La doble cola o bicola es una variante de las colas simples. Esta es una cola de dos
dimensiones en la que las inserciones y eliminaciones pueden realizarse en cualquiera
de los dos extremos de la lista, pero no por la mitad. A diferencia de una cola simple,
en donde solo se necesitan un mtodo para leer y otro para escribir componentes en
la lista, en una doble cola debe haber dos mtodos para leer (uno para leer por el frente
y uno para leer por atrs) y dos mtodos para escribir (uno para escribir por el frente y
uno para escribir por atrs). Se conocen dos variantes de las dobles colas:

La doble cola con entrada restringida (DCER) donde se permite hacer eliminaciones
por cualquiera de los extremos mientras que las inserciones se realizan solo por el final
47 de
51
Tercer semestre

de la cola. La doble cola con salida restringida (DCSR) donde las inserciones se
realizan por cualquiera de los dos extremos, mientras que las eliminaciones solo por
el frente de la cola. Si bien estas estructuras estn ligadas a la computacin, impresin
y los sistemas de tiempo compartido, tambin las podemos observar en las vas de los
trenes.

Las operaciones bsicas que definen una bicola son:

Crear

Inicializa una bicola sin elementos.

Esvacia

Devuelve verdadero si la bicola no tiene elementos

InsertIzq

Aade un elemento por el extremo izquierdo


(EncolarIzquierda).

InserDer

Aade

un

elemento

por

el

extremo

derecho

(EncolarDerecha)
ElimnIzq

Devuelve el elemento izquierdo y lo retira de la bicola


(DesencolarIzquierda)

EliminDer

Devuelve el elemento derecho y lo retira de la bicola


(DesencolarDerecha)

Vase en : http://www.geocities.ws/profeprog/P2TP05.PDF

48 de
51
Tercer semestre

Implantacin de una Cola Dinmica doblemente enlazada

En el mbito de la Informtica, el trmino Implantar se le da la connotacin de adecuar


las caractersticas de un compilador, el cual no tiene definida o precargada una
estructura determinada para que, por medio de algoritmos y estructuras ya definidas
por el compilador, se pueda realizar alguna aplicacin requerida. En este caso,
tomando como base el Lenguaje C++, se implantar una cola doblemente encadenada
como una estructura en donde cada elemento puede ser insertado y recuperado por
la parte del frente (cabeza) o por la parte de atrs (cola) de la lista. A diferencia de una
cola simple, en donde slo se necesita un apuntador a un siguiente elemento, la
estructura del nodo para una doble cola debe poseer un apuntador a un posible
siguiente elemento y un apuntador a otro posible anterior elemento como se muestra
en la siguiente estructura.

typedef char DATA_TYPE;


struct nodo {
DATA_TYPE data;
nodo *next, *prev;
};

Para la clase DobleCola podemos definir los siguientes mtodos:


put_front(), poner un elemento en el frente de la cola
put_back(), poner un elemento en la parte trasera de la cola
get_front(), retirar un elemento de la parte frontal de la cola
get_back(), retirar un elemento de la parte trasera de la cola
empty(),

regresa 1 (TRUE) si la cola est vaca

size(),

nmero de elementos en la cola

Vase en. http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Estructuras_II

49 de
51
Tercer semestre

El mtodo put_back(), pone un elemento en la parte trasera de la cola:


DATA_TYPE put_back(DATA_TYPE valor)
{
nodo *temp;
temp = new nodo;
if (temp == NULL) return -1;
temp->data = valor;
items ++;
if (cabeza == NULL )
{
temp->next = NULL;
temp->prev = NULL;
cabeza = temp;
cola = temp;
} else
{
cola->next = temp;
temp->prev = cola;
cola = temp;
cola->next = NULL;
}
return valor;
}

El mtodo put_front(), coloca un elemento en la parte frontal de la cola:

DATA_TYPE put_front(DATA_TYPE valor)


{
nodo *temp;
temp = new nodo;
if (temp == NULL) return -1;
temp->data = valor;
50 de
51
Tercer semestre

items ++;
if (cabeza == NULL )
{
temp->next = NULL;
temp->prev = NULL;
cabeza = temp;
cola = temp;
} else
{
cabeza->prev = temp;
temp->next = cabeza;
cabeza = temp;
cabeza->prev = NULL;
}
return valor;
}

El mtodo empty(), regresa true si la cola est vaca:


int empty() { return items == 0; }

El mtodo get_front(), retira el elemento en la parte frontal de la cola:


DATA_TYPE get_front()
{
nodo *temp;
DATA_TYPE d;
if ( empty() ) return -1;
items --;
d = cabeza->data;
temp = cabeza->next;
if (cabeza) delete cabeza;
cabeza = temp;
return d;

51 de
51
Tercer semestre

El mtodo get_back(), retira un elemento de la parte trasera de la cola:


DATA_TYPE get_back()
{
nodo *temp;
DATA_TYPE d;
if ( empty() ) return -1;
items--;
d = cola->data;
temp = cola->prev;
if (cola) delete cola;
cola = temp;
return d;
}
Como hemos sealado anteriormente, se consideran listas lineales a las listas
enlazadas, pilas y colas, con todas sus variantes. En el siguiente tema detallaremos el
concepto de Listas.

2.4. Listas
Una lista lineal es un conjunto de elementos de un tipo dado que se encuentren
ordenados (pueden variar en nmero). Los elementos de una lista se almacenan
normalmente de manera contigua (un elemento detrs de otro) en posiciones de la
memoria (vase, SUA, 1998, pp. 37 y ss.).
Una lista enlazada es una estructura de datos fundamental que se utiliza para
implementar otras estructuras de datos como fue el caso de las pilas y las colas
simples y doble cola. Tiene una secuencia de nodos, en los que se guardan campos
de datos arbitrarios y una o dos referencias, enlaces o apuntadores al nodo anterior o
posterior.

52 de
51
Tercer semestre

2.4.1. Listas simplemente enlazadas


Una lista enlazada es un conjunto de elementos que contienen la posicin -o direccindel siguiente. Cada elemento de una lista enlazada debe tener al menos dos campos:
uno con el valor del elemento y otro (link) que contiene la posicin del siguiente
elemento o encadenamiento.
La lista enlazada bsica es la lista enlazada simple la cual tiene un enlace por nodo.
Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vaca, si es
el ltimo nodo.
Se define una lista como una secuencia de cero o ms elementos de un mismo tipo. El
formalismo encogido para representar este tipo de objeto abstracto es:
<e1, e2 ........., en>

Cada ejemplo modela un elemento del agrupamiento. As, e1 es el primero de la lista;


en, el ltimo; y la lista formada por los elementos <e2, e3,.....,en corresponde al resto
de la lista inicial.

2.4.2. Listas doblemente enlazadas


Un tipo de lista enlazada ms sofisticado es la lista doblemente enlazada o lista
enlazadas de dos vas. Cada nodo tiene dos enlaces: uno apunta al nodo anterior (o
al valor NULL si es el primer nodo); y otro apunta al nodo siguiente (o al valor NULL si
es el ltimo nodo).

53 de
51
Tercer semestre

En algn lenguaje de muy bajo nivel, como XOR-Linking, ofrece una va para
implementar listas doblemente enlazadas, usando una sola palabra para ambos
enlaces, aunque el uso de esta tcnica no suele utilizarse.

2.4.3. Listas circulares


Esta estructura se aplica tanto a listas simples como en listas doblemente enlazadas.
La lista circular consiste en que la referencia siguiente del ltimo nodo apunta al
primero en vez de ser null, de ah que sea circular.

Vase en
http://users.dcc.uchile.cl/~bebustos/apuntes/cc30a/Estructuras/http://users.dcc.uchile.cl/~bebustos/apuntes/cc30a/Estructuras/

En algunas listas circulares se aade un nodo especial de cabecera, de ese modo, se


evita la nica excepcin posible, la de que la lista est vaca.

54 de
51
Tercer semestre

2.4.4. Operaciones con listas


Las operaciones que pueden realizarse con listas lineales contiguas son:

1. Insertar, eliminar o localizar un elemento.


2. Determinar el tamao de la lista.
3. Recorrer la lista para localizar un determinado elemento.
4. Clasificar los elementos de la lista en orden ascendente o descendente.
5. Unir dos o ms listas en una sola.
6. Dividir una lista en varias sublistas.
7. Copiar la lista.
8. Borrar la lista.

Operaciones que normalmente se ejecutan con las listas enlazadas:

1. Recuperar informacin de un nodo especificado.


2. Encontrar un nodo nuevo que contenga informacin especfica.
3. Insertar un nodo nuevo en un lugar especfico de la lista.
4. Insertar un nuevo nodo en relacin con una informacin particular.
5. Borrar un nodo existente que contenga informacin especfica.

Implantacin de listas enlazadas


Las listas enlazadas pueden ser implementadas en muchos lenguajes. Como
mencionamos anteriormente, Lisp y Scheme (Dr. Racket) tiene estructuras de datos
ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes
imperativos u orientados a objetos tales como C o C++ y Java, respectivamente,
disponen de referencias para crear listas enlazadas como se muestra en el siguiente
ejemplo en C.

55 de
51
Tercer semestre

Implantacin de una lista enlazada en C.


#include <stdio.h>
#include <stdlib.h>
typedef struct ns {
int data;
struct ns *next;
} node;
node *list_add(node **p, int i) {
node *n = (node *)malloc(sizeof(node));
if (n == NULL)
return NULL;
n->next = *p;
*p = n;
n->data = i;
return n;
}
void list_remove(node **p) { /* borrar cabeza*/
if (*p != NULL) {
node *n = *p;
*p = (*p)->next;
free(n);
}
}
node **list_search(node **n, int i) {
while (*n != NULL) {
if ((*n)->data == i) {
return n;
}
n = &(*n)->next;
}
return NULL;
}
void list_print(node *n) {
if (n == NULL) {
printf("lista esta vaca\n");
}
while (n != NULL) {
56 de
51
Tercer semestre

printf("print %p %p %d\n", n, n->next, n->data);


n = n->next;
}
}
int main(void) {
node *n = NULL;
list_add(&n, 0); /* lista: 0 */
list_add(&n, 1); /* lista: 1 0 */
list_add(&n, 2); /* lista: 2 1 0 */
list_add(&n, 3); /* lista: 3 2 1 0 */
list_add(&n, 4); /* lista: 4 3 2 1 0 */
list_print(n);
list_remove(&n);
/* borrar primero(4) */
list_remove(&n->next); /* borrar nuevo segundo (2) */
list_remove(list_search(&n, 1)); /* eliminar la celda que
contiene el 1 (primera) */
list_remove(&n->next);
/* eliminar segundo nodo del
final(0)*/
list_remove(&n);
/* eliminar ultimo nodo (3) */
list_print(n);
return 0;
}

En esta implantacin de lista enlazada en C se definen las libreras stdio.h para utilizar
instrucciones de salida como printf y stdlib.h, para facilitar el manejo dinmico de la
memoria con la funcin malloc. Se define la funcin list_add para agregar nuevos
elementos a la lista. En algunos compiladores no requieren un casting del valor del
retorno para malloc. La funcin list_remove eliminar los nodos de la lista. Se define
la funcin list_search para buscar nodos en la lista. Se define la funcin list_print
para mostrar los nodos de la lista. Al final del programa tenemos la funcin main() o
principal que ejecuta diferentes operaciones realizadas en esta lista enlazada.

57 de
51
Tercer semestre

Implantacin de listas en Dr. Racket.


Los lenguajes de programacin tales como Lisp y Scheme (Dr. Racket), tienen listas
enlazadas simples ya construidas y la programacin de estas estructuras es mucho
ms sencilla.

Este lenguaje nos especifica que formar listas es algo que todos hacemos, ya que es
una estructura de longitud arbitraria con un nmero indeterminado de datos, por
ejemplo: cuando planeamos una fiesta se hace una lista de invitados, en un acuario se
hace una lista de las especies disponibles de peces, etc.

Vase en http://www.eng.utah.edu/~cs1410-20/f10/lecture7.pdf

Este ejemplo del acuario nos muestra las diferentes combinaciones de peces,
empezando con la lista vaca empty. Esta es la base por la cual se puede construir
una lista mayor, mediante la operacin cons. Por ejemplo:
(cons 'piraa empty)

; Se construye una lista con el elemento piraa


; en este lenguaje los comentarios inician con punto y coma
58 de
51
Tercer semestre

La caja cons contiene dos campos: first y rest (el primer elemento y el resto de la lista).
En el ejemplo de los peces, el campo first contiene 'piraa y el campo rest contiene
empty.

Una vez que se cuenta con una lista que contiene un elemento, se pueden construir
con dos o ms elementos, empleando cons nuevamente.

(cons 'piraa (cons 'angel (cons 'globo empty)))


; Se construye una lista con tres elementos

Su campo rest contiene una caja que contiene una caja a su vez (pueden incluir
estructuras ms complejas).

Para analizar mejor la relacin que tiene first, rest y cons, se pueden emplear
ecuaciones similares a las ecuaciones que gobiernan la adicin, resta, creacin de
estructuras y extraccin de campos.

Ejemplos:

> (first (cons 'piraa empty))


'piraa
> (rest (cons 'globo empty))
empty

59 de
51
Tercer semestre

RESUMEN
En esta unidad estudiamos las estructuras de datos fundamentales, ya que el manejo
de los datos complejos se integra a partir de datos simples. stos se dividen en
estticos y dinmicos, a fin de optimizar el uso de memoria a travs del procesamiento
de estructuras de datos adecuadas. Las estructuras de datos estticas se identifican
como aquellas que, desde la compilacin, reservan un espacio fijo de elementos en
memoria como son los arreglos, vectores de una dimensin y matriz de n dimensiones.
Por otro lado, las estructuras de datos dinmicas son las que, en tiempo de ejecucin,
vara el nmero de elementos y uso de memoria a lo largo del programa; entre ellas
estn las lineales: son estructuras de datos bsicas porque se caracterizan en que
todos sus elementos estn en secuencia, en forma relacionada y lineal, uno luego del
otro. Donde cada nodo puede estar formado por uno o varios elementos que pueden
pertenecer a cualquier tipo de dato de los cuales normalmente son tipos bsicos; las
listas, que pueden ser listas simples enlazadas, doblemente enlazadas o enlazadas
circulares.
En las listas simples enlazadas siempre tienen un enlace o relacin por nodo, este
enlace apunta al siguiente o al valor NULL (indicador de que la lista esta vaca, si es
el ltimo nodo). En la lista doblemente enlazada tenemos una estructura de datos en
forma de lista enlazada de dos vas donde cada nodo tiene dos enlaces uno apunta al
nodo anterior, o apunta al valor NULL si es el primer nodo; y otro que apunta al nodo
siguiente, o apunta al valor NULL si es el ltimo nodo. En una lista enlazada circular,
el primer y el ltimo nodo estn enlazados en forma de anillo o crculo. Esto se puede
hacer tanto para listas enlazadas simples como para las doblemente enlazadas.

60 de
51
Tercer semestre

Este conjunto de estructuras de datos se caracterizan por ser estructuras de datos


fundamentales que puede ser usadas para implementar otras estructuras ms
complejas, que por su programacin, dependen de las estructuras fundamentales
como son las pilas y las colas. Una de las estructuras lineales ms prctica es la pila
en la que se pueden agregar o quitar elementos nicamente por uno de los extremos
y se eliminan en el orden inverso al que se insertaron, debido a esta caracterstica se
le conoce tambin como ltimas entradas, primeras salidas, en ingls LIFO (last input,
first output). En las colas los elementos se insertan por un sitio y se sacan por el otro,
en el caso de la cola simple se insertan por el final y se sacan por el principio, tambin
son llamadas como primeras entradas, primeras salidas, en ingls FIFO (first in first
out). Podemos mencionar dos variantes de estructuras de datos colas como son colas
circulares y de prioridades.
En las colas circulares se considera que despus del ltimo elemento se accede de
nuevo al primero. De esta forma se reutilizan las posiciones extradas, el final de la
cola es a su vez el principio, crendose un crculo o circuito cerrado. Las colas con
prioridad se implementan mediante listas o arreglos ordenados. Puede darse el caso
que existan varios elementos con la misma prioridad, en este caso saldr primero
aquel que primero lleg (FIFO).
Si bien la implantacin esttica a travs del manejo de arreglos es muy natural, para
estas estructuras de datos, recomendamos una implantacin dinmica para pilas,
colas y listas enlazadas, considerando que es la forma ms eficiente y apropiada para
la optimizacin del uso de memoria principal.

61 de
51
Tercer semestre

BIBLIOGRAFA

SUGERIDA
Autor

Captulo

Olimpiadas de

Estructura

Informtica

datos

Pginas
de http://www.olimpiadadeinformatica.org.mx/arc
hivos/apuntes/EstructurasDeDatos.htm

Cair, Osvaldo; Silvia Guardati. (2006) Estructura de datos. (3 ed.) Mxico: McGrawHill.
Toledo Salinas, Ana Mara. (2005). Qu es pilas?, (22/03/05), disponible en lnea.

62 de
51
Tercer semestre

Unidad 3.
Estructuras de datos avanzadas

63 de
51
Tercer semestre

OBJETIVO PARTICULAR
Al finalizar la unidad, el alumno conocer las estructuras de datos avanzadas y sus
principales aplicaciones en la solucin de problemas especficos mediante el uso
dinmico de la memoria.

TEMARIO DETALLADO
(16 horas)
3. Estructura de datos avanzadas
3.1. rboles
3.1.1. rboles binarios de bsqueda
3.1.2. Recorridos
3.1.3. Operaciones con rboles binarios de bsqueda
3.2. Grafos
3.2.1. Grafos dirigidos
3.2.2. Grafos ponderados
3.2.3. Operaciones con grafos

64 de
51
Tercer semestre

INTRODUCCIN
En esta unidad veremos dos de las estructuras ms importantes por el nmero de
aplicaciones que tienen en la vida real: los rboles y los grafos.

Los rboles y grafos son estructuras de datos que de alguna manera les llamamos
complejos porque permiten organizar y mantener informacin flexible y dinmica en
una computadora. Esta forma sale de la idea de organizar informacin con lpiz y papel
usando nodos y flechas entre los nodos (a esas flechas tambin se les llama arcos, a
los nodos tambin se les llama vrtices). Los grafos y rboles en papel son muy
utilizados en informtica y teora de redes, son muy apropiados para capturar slo una
parte de la informacin de objetos, situaciones y otros tipos de informacin relacional.

En la computadora, adems de permitir organizar informacin, resultan ser estructuras


tiles para resolver ciertos tipos de problemas de abstraccin (por ejemplo, pueden
emplearse rboles AVL para mantener informacin ordenada de forma eficiente).

65 de
51
Tercer semestre

3.1. rboles
La organizacin de la informacin en la memoria interna de la computadora se
representa con estructuras de datos y el contenido de las pginas se representa con
tipos de datos simples con los cuales se pueden acceder, manejar y almacenar la
informacin.

Definiciones
a) Son un conjunto no vaco de vrtices (nodos) y aristas (enlaces) que cumple una
serie de requisitos (Sedgewick, 2000, p. 40).
b) Son Estructuras de Datos no lineales. Es una coleccin de nodos donde cada uno,
adems de almacenar informacin, guarda la direccin de sus sucesores (Guardati,
2007, p. 313).

c) Los rboles, a diferencia de las Listas, sirven para representar Estructuras


Jerrquicas, hecho que no se puede realizar con las Listas Lineales y mucho menos
con los Arreglos. Las Pilas y Colas, aunque representan cierta jerarqua, estn
limitadas a emplear una sola dimensin (Drozdek, 2007, p. 214).

d) Un rbol se puede representar como Conjuntos Venn, Anidacin de Parntesis,


Grafos y como una Estructura Jerrquica.

Elementos del rbol

Nodo Raz, Nodos Hijos, Nodos Hermanos, Altura, Recorridos, Direccin.

Todo rbol tiene un solo Nodo Raz.

Los rboles pueden tener o no Nodos Hijos. En caso de tenerlos, pueden existir
Nodos Hermanos.
66 de
51

Tercer semestre

Si nicamente tiene un Nodo Raz, su Altura = 0 y su Nivel = 1.

Los Recorridos pueden ser en preorden, postorden y en orden.

Un rbol puede recorrerse en direccin Top-Down de arriba abajo, de abajo


arriba, (Down-Top). A partir de su rama Izquierda o a partir de su rama Derecha.

Para mayor claridad se representa la siguiente figura.

Elementos de un rbol

Diagrama de Venn del rbol

67 de
51
Tercer semestre

Llenos
Binarios
Completos
Equilibrados
Por su
estructura
Degenerados

Balanceados

Tipos de
rboles

Binarios
Por su
recorrido

Binarios de
bsqueda
Multicamino

B
B+
B*
B+ Prefijos
De Bits
2-4
R

Clasificacin de los rboles. Elaboracin propia.

3.1.1. rboles binarios de bsqueda


Un rbol binario T se define como un conjunto finito de elementos, llamados nodos, de
forma que:

a) T es vaco (en cuyo caso se llama rbol nulo o rbol vaco) o


b) T contiene un nodo distinguido R, llamado raz de T, y los restantes nodos
de T forman un par ordenado de rboles binarios disjuntos T1 y T2. (Cair
y Guardati, 2006, p. 184)
Si T contiene una raz R, los dos rboles T1 y T2 se llaman, respectivamente, subrboles izquierdo y derecho de la raz R. Si T1 no es vaco, entonces su raz se llama
sucesor izquierdo de R; y anlogamente, si T2 no es vaco, su raz se llama sucesor
derecho de R.
68 de
51
Tercer semestre

Obsrvese que:
a) B es un sucesor izquierdo y C un sucesor derecho del nodo A.
b) El subrbol izquierdo de la raz A consiste en los nodos B, D, E y F, y el subrbol
derecho de A consiste en los nodos C, G, H, J, K y L.

Representacin Grfica de rbol Binario


Fuente: http://google.com/imagenes

* Cualquier nodo N de un rbol binario T tiene 0, 1 2 sucesores. Los nodos A, B, C


y H tienen dos sucesores, los nodos R y J slo tienen un sucesor, y los nodos D, F,
G, L y K no tienen sucesores. Los nodos sin sucesores se llaman nodos terminales.

* La definicin anterior del rbol binario T es recursiva, ya que T se define en trminos


de los sub-rboles binarios T1 y T2. Esto significa, en particular, que cada nodo N
de T contiene un subrbol izquierdo y uno derecho. Adems, si N es un nodo
terminal, ambos rboles estn vacos.
* Dos rboles binarios T y T se dicen que son similares si tienen la misma estructura
o, en otras palabras, si tienen la misma forma. Los rboles se dice que son copias
si son similares y tienen los mismos contenidos en sus correspondientes nodos.

69 de
51
Tercer semestre

3.1.2. Recorridos.
Las dos maneras ms usuales de representar un rbol binario en memoria son:

Por medio de datos tipo puntero, tambin conocidos como variables dinmicas

Por medio de arreglos

Los nodos del rbol binario se representan como registros. Cada uno de ellos contiene
como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los
dos restantes se utilizarn para apuntar los subrboles izquierdo y derecho,
respectivamente, del nodo en cuestin.

Dado el nodo T

IZQ

INFO

DER

En l se distinguen tres campos:


IZQ:

es el campo donde se almacenar la direccin del subrbol izquierdo del nodo


T.

INFO: representa el campo donde se almacena la informacin del nodo. En este


campo se pueden almacenar tipos simples o complejos de datos.
DER:

es el campo donde se almacena la direccin del subrbol derecho del nodo T.

70 de
51
Tercer semestre

Ejemplo de representacin de un rbol binario:


Considrese un rbol binario que representa la expresin matemtica (A * B) + (C / D)
^ 3.5. Su representacin en memoria es la siguiente (Cair y Guardati, 2006, p. 196):
+

3.
5

+
*
A

^
B

/
3.5
C

71 de
51
Tercer semestre

3.1.3. Operaciones con rboles binarios de bsqueda


Las operaciones de acuerdo con su empleo generarn Estructuras de rboles de
Bsqueda, Binarios, B+, equilibrados y degenerados (con una sola rama, una subrama
y un nodo terminal) y de aqu comienza su recorrido, partiendo del Nodo Raz para ir
por las ramas, nodos internos, hasta llegar a los nodos Terminales. Estas operaciones
son:
Insertar un elemento en un rbol ABB, eliminar un elemento de un rbol ABB, buscar
un elemento en un rbol ABB, comprobar si un rbol est vaco, contar el nmero de
nodos, calcular la altura de un rbol.

Implantacin de un rbol binario de bsqueda (ABB)

A continuacin, se propone la implementacin en Lenguaje C de algunas de las


operaciones fundamentales para rboles ABB. Para esta implantacin, slo
necesitamos una estructura para referirnos, tanto a cualquiera de los nodos como al
rbol completo. La declaracin de tipos es la siguiente:

typedef struct _nodo {


int dato;
struct _nodo *derecho;
struct _nodo *izquierdo;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;

72 de
51
Tercer semestre

Como ejercicio personal, puedes integrar los cdigos que te sugiere la siguiente
pgina: http://c.conclase.net/edd/?cap=007c, para insertar un elemento y eliminar un
elemento de un rbol. Posteriormente obtener toda la aplicacin completa para
comprender mejor su funcionamiento.

Con la implementacin de estas funciones bsicas para ABB pasamos al tema de


grafos.

3.2. Grafos
Un Grafo Simple G = (V,E) consiste en un conjunto de V de vrtices y un conjunto
posiblemente vaco E de aristas (edges), siendo cada arista un conjunto de dos
vrtices de V (Drozdek, 2007, p. 376).
Los grafos son Estructuras de Datos no lineales, en las cuales cada elemento puede
tener cero o ms sucesores y cero o ms predecesores. Estn formados por nodos
(vrtices: representan informacin) y por arcos (aristas: relaciones entre la
informacin) (Guardati, 2007, p. 391).

73 de
51
Tercer semestre

Representacin de un Grafo

Tipos de Grafos (vase, Sedgewick, 2000, pp. 515-547 y Guardati, 2007, pp. 393-446)

Definicin del tipo de dato abstracto grafo


Los datos contienen, en algunos casos, relaciones entre ellos que no son
necesariamente jerrquicas. Por ejemplo, supongamos que unas lneas areas
realizan vuelos entre las ciudades conectadas por lneas, la estructura de datos que
refleja esta relacin recibe el nombre de grafo. (Vase, Cair y Guardati, 2006, pp.
277-328).
74 de
51
Tercer semestre

Se suelen usar muchos nombres al referirnos a los elementos de una estructura de


datos. Algunos de ellos son elemento, tem, asociacin de tems, registro, nodo
y objeto. El nombre que se utiliza depende del tipo de estructura, el contexto en que
usamos esa estructura y quin la utiliza.
En la mayora de los textos de estructura de datos se utiliza el trmino registro al
hacer referencia a archivos y nodo cuando se usan listas enlazadas, rboles y grafos.

Tambin un grafo es una terna G = (V, A, j), en donde V y A son conjuntos finitos y j
es una aplicacin que hace corresponder a cada elemento de A un par de elementos
de V. Los elementos de V y de A se llaman, respectivamente, "vrtices" y "aristas" de
G, y j asocia entonces a cada arista con sus dos vrtices.

Esta definicin da lugar a una representacin grfica, en donde cada vrtice es un


punto del plano, y cada arista es una lnea que une a sus dos vrtices.

Si el dibujo puede efectuarse sin que haya superposicin de lneas, se dice que G es
un grafo plano. Por ejemplo, el siguiente es un grafo plano:

Enlaces equivalentes en un nodo del Grafo

75 de
51
Tercer semestre

3.2.1. Grafos dirigidos


En un grafo generalizado, su direccin puede estar especificada o no. Por el contrario,
en el grafo dirigido o tambin conocido como digrafo, el conjunto de sus aristas tienen
una direccin definida y est determinado por un par de conjuntos G=(V,A) donde V
es un conjunto vaco llamado vrtices o nodos y A es un conjunto de pares ordenados
de elementos de V llamados aristas o arcos que van del primer al segundo nodo dentro
del par.

Vase en: http://commons.wikimedia.org/wiki/File:Directed.svg

3.2.2. Grafos ponderados


Los grafos ponderados son muy tiles para medir las distancias en un mapa. Por
ejemplo el caso de un repartidor de muebles que tiene que recorrer varias ciudades de
Mxico conectadas entre s por las carreteras que hay entre la Ciudad de Mxico,
Guadalajara y Monterrey, su misin es optimizar la distancia recorrida (minimizar el
tiempo, prever trfico y atascos). El grafo correspondiente tendr como vrtices estas
ciudades y como aristas la red de carreteras y la valoracin, peso o ponderacin ser
la distancia que hay entre ellas. Para tal efecto, es preciso atribuir a cada arista un
nmero especfico, ponderacin, peso o coste segn el contexto, y se obtiene as un
grafo valuado o ponderado.
Un grafo ponderado o grafo con valores o pesos es un grafo G (V, E), en el que a cada
arista se le asigna un valor real no negativo o peso. Sobre el conjunto de aristas se
76 de
51
Tercer semestre

introduce una funcin peso ( w: E->R+ ) donde el peso de un subgrafo de un grafo


ponderado es la suma de los pesos de todas sus aristas.

Vase:
http://docencia.udea.edu.co/regionalizacion/teoriaderedes/informaci%F3n/C3_minimos.pdf

3.2.3. Operaciones con grafos


Bsqueda en grafos
Para efectuar una bsqueda de los vrtices de un grafo, se pueden emplear dos
estrategias diferentes, (vase, Snchez, 2008), bsqueda en profundidad o en
anchura:

Bsqueda
profundidad (BEP)

en Se comienza en cualquier vrtice y en cada paso se


avanza a un nuevo vrtice adyacente siempre que se
pueda. Cuando todos los adyacentes a X hayan sido
visitados, se retrocede al vrtice desde el que se alcanz
X y se prosigue. As se consigue etiquetar (visitar) todos
los vrtices del componente conexo en que se encuentre
el vrtice inicial.
Esta tcnica se utiliza cuando necesitamos encontrar
respuesta a un problema sobre un grafo sin condiciones de
optimizacin.

77 de
51
Tercer semestre

La idea en general de la bsqueda en profundidad


comenzando en un nodo A es la siguiente:

Primero examinamos el nodo inicial A. Luego examinamos


cada nodo N de un camino P que comience en A; o sea,
procesamos un vecino de A, luego un vecino de un vecino
de A y as sucesivamente, hasta llegar a un punto muerto
o final del camino P, y de aqu volvemos atrs por P hasta
que podamos continuar por otro camino P y as
sucesivamente.

Este algoritmo es similar al del recorrido en orden de un


rbol binario, y tambin a la forma en que se debe pasar a
travs de un laberinto. Observa que se hace uso de una
pila en lugar de una cola, y ste es el detalle fundamental
que hace la diferencia para realizar la bsqueda en
profundidad.
Implantacin de un grafo

Algoritmo para la bsqueda en profundidad:


Este algoritmo realiza la bsqueda en profundidad el grafo
G comenzando en un nodo A.

1. Inicializar todos los nodos al estado de preparado.


(ESTADO=1)
2. Meter el nodo inicial A en la pila y cambiar su estado a
estado de espera.
(ESTADO=2).
3. Repetir los pasos 4 y 5 hasta que la pila est vaca.

78 de
51
Tercer semestre

4. Sacar el nodo N en la cima de la pila. Procesar el nodo


N y cambiar su estado al de procesado.
(ESTADO=3).
5. Meter en la pila todos los vecinos de N que estn en
estado de preparados.
(ESTADO=1) y cambiar su estado a estado de espera
(ESTADO=2).
[ fin de bucle del paso 3 ]
6. Salir.

Bsqueda en anchura A diferencia con la BEP ahora se visitan todos los vecinos
(BEA)

de un vrtice antes de pasar al siguiente. Por tanto no hay


necesidad de retroceder. Una vez etiquetados todos los
vecinos de un vrtice X, se contina con el primer vrtice
alcanzado despus de X en la bsqueda.

Esta tcnica se utiliza para resolver problemas en los que


se pide hallar una solucin ptima entre varias.
En general la bsqueda en anchura comenzando de un
nodo de partida A es la siguiente:

Primero examinamos el nodo de partida A.

Luego examinamos todos los vecinos de A y as


sucesivamente. Con el uso de una cola, garantizamos que
ningn nodo sea procesado ms de una vez y usando un
campo ESTADO que nos indica el estado actual de los
nodos.

Algoritmo para la bsqueda en anchura


79 de
51
Tercer semestre

Este algoritmo realiza la bsqueda en anchura en un grafo


G comenzando en un nodo de partida A.
1. Inicializar todos los nodos al estado de preparados.
(ESTADO=1).
2. Poner el nodo de partida A en la COLA y cambiar su
estado a espera.
(ESTADO=2).
3. Repetir pasos 4 y 5 hasta que la COLA est vaca.
4. Quitar el nodo del principio de la cola, N. Procesar N y
cambiar su estado a procesado.
(ESTADO=3).
6. Aadir a COLA todos los vecinos de N que estn en
estado de preparados.
(ESTADO=1)
y cambiar su estado al de espera
(ESTADO=2).
[ fin del bucle del paso 3 ]
7. Salir.

Caminos mnimos en grafos


Para lograr el propsito del recorrido mnimo dentro de un grafo G, es necesaria
para nuestro caso en particular (puesto que no es la nica tcnica existente), la
utilizacin del algoritmo de Warshall -para el camino mnimo-se expresa de la
forma siguiente:
Sea G un grafo con m nodos, 1

, 2 , ..., m supngase que queremos

encontrar la matriz de caminos P para el grafo G. Warshall dio un algoritmo para

80 de
51
Tercer semestre

este propsito que es mucho ms eficiente que calcular las potencias de la


matriz de adyacencia A y aplicar la proposicin:

A A A ... A
2

donde sea A la matriz de adyacencia y P = Pij la matriz de caminos


de un grafo G entonces, Pij = 1 si y solo s hay un nmero positivo
en la entrada ij de la matriz

Este algoritmo de Warshall se usa para calcular el camino mnimo y


existe un algoritmo similar para calcular el camino mnimo de G
cuando G tiene peso.
Vase en: http://www.monografias.com/trabajos/grafos/grafos.shtml
nota: tomado del libro Estructura de datos, serie schaum Mcgraw-Hill, pagina: 322, capitulo: 8 Grafos y
sus aplicaciones, autor: Seymour Lipschutz.

Implantacin de Grafos

Como vimos, un grafo es un conjunto de nodos o vrtices que se encuentran


relacionados con unas aristas. Estos vrtices tienen un valor y, en ocasiones, las
aristas tambin, conocido como costo.

Aprovechando la implementacin grfica de los Applets de Java en sus clases en la


librera de java swing (import javax.swing.*;), desarrolla una aplicacin que dibuje un
grafo en el esquema de la Programacin Orientada a Objetos implementando tres
clases: Principal (ser la clase principal), PanelDibujo (dibuja el grafo) y Grafo
(almacena el valor de cada grafo) apoyndote del ejemplo que se propone en la
siguiente pgina de internet:
81 de
51
Tercer semestre

Pgina: http://www.myjavazone.com/2010/12/estructura-de-datos-grafos.html

Las clases quedarn en un paquete (carpeta) llamado Clases.

// Clase Principal
package Clases;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.*;
public class Principal extends JApplet{
PanelDibujo pd;
int max=0;
JTextField valor;
public void init(){
pd=new PanelDibujo();
add(pd);
JPanel pdatos=new JPanel();
JButton agregar=new JButton("Agregar Nodo");
agregar.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {
if(max<10){
try{
Grafo gf=new Grafo(""+Integer.parseInt(valor.getText()));
pd.getVgrafos().add(gf);
pd.repaint();
repaint();
max++;
}catch(NumberFormatException ne){
JOptionPane.showMessageDialog(null, "Digite un numero valido");
}
82 de
51
Tercer semestre

}
}
});
valor=new JTextField(5);
pdatos.add(new JLabel("Valor Vertice" + ""));
pdatos.add(valor);
pdatos.add(agregar);
add(pdatos,BorderLayout.SOUTH);
}
}

// Clase PanelDibujo
package Clases;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Vector;
import javax.swing.*;
public class PanelDibujo extends JPanel {
int x=150;
int y=150;
int ancho=30;
int alto=30;
public Vector<Integer> xvs;
public Vector<Integer> yvs;
public Vector<Grafo> vgrafos;
int indice=0;
public PanelDibujo(){
vgrafos=new Vector(); xvs=new Vector<Integer>();
yvs=new Vector<Integer>();
setDoubleBuffered(true);
}
public void paintComponent(Graphics grafico){
super.paintComponents(grafico);
Graphics2D g=(Graphics2D)grafico;
if(vgrafos.size()!=0){
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
83 de
51
Tercer semestre

g.setColor(Color.BLACK);
int radio = 100;
float angulo = 360/10;
angulo = (float) Math.toRadians(angulo);
for(int i=indice;i<vgrafos.size();i++){
int xv=(int)(x+radio*Math.cos(i * angulo));
int yv=(int) (y- radio * Math.sin(i * angulo));
xvs.add(xv);
yvs.add(yv);
indice++;
}
}
for(int i=0;i<vgrafos.size();i++){
for(int j=0;j<vgrafos.size();j++){
g.setStroke(new BasicStroke(2));
g.setColor(Color.BLACK);
g.drawLine(xvs.get(i)+15,yvs.get(i)+15,xvs.get(j)+15,yvs.get(j)+15);
g.setColor(Color.WHITE);
g.fillOval(xvs.get(i), yvs.get(i), ancho, alto);
g.setColor(Color.BLACK);
g.drawOval(xvs.get(i),yvs.get(i), ancho, alto);
g.drawString(""+vgrafos.get(i).obtenerDato(),xvs.get(i)+((ancho/2)-3),
yvs.get(i)+((alto/2)+3));
g.setColor(Color.WHITE);
g.fillOval(xvs.get(j), yvs.get(j), ancho, alto);
g.setColor(Color.BLACK);
g.drawOval(xvs.get(j),yvs.get(j), ancho, alto);
g.drawString(""+vgrafos.get(j).obtenerDato(),xvs.get(j)+((ancho/2)-3),
yvs.get(j)+((alto/2)+3));
}
}
}
public Vector<Grafo> getVgrafos() {
return vgrafos;
}
public void setVgrafos(Vector<Grafo> vgrafos) {
this.vgrafos = vgrafos;
}
}

// Clase Grafo
package Clases;
import java.util.Vector;

84 de
51
Tercer semestre

public class Grafo {


private String dato;
public Grafo(String s){
dato=s;
}
public String obtenerDato(){
return dato;
}
}

Vase en: http://www.myjavazone.com/2010/12/estructura-de-datos-grafos.html

Una imagen correspondiente a esta implementacin sera la siguiente:

85 de
51
Tercer semestre

RESUMEN
En esta unidad hemos definido las estructuras de rbol e identificado sus elementos y
los tipos de rboles ofrecidos por los compiladores ms comunes, de igual modo,
entendimos que un rbol binario T se define como un conjunto finito de elementos,
llamados nodos, de forma que:

T es vaco (en cuyo caso se llama rbol nulo o rbol vaco)

T contiene un nodo distinguido R, llamado raz de T

Y los restantes nodos de T forman un par ordenado de rboles binarios disjuntos T1 y


T2. Las Operaciones, de acuerdo con su empleo, generarn estructuras de rboles de
bsqueda, binarios, B+, equilibrados y degenerados (con una sola rama, una subrama
y una nodo terminal), y de aqu comienza su recorrido, partiendo del nodo raz para ir
por las ramas, nodos internos, hasta llegar a los nodos terminales.

Por otra parte, tambin abordamos el tema de los grafos, que se han definido como
Estructuras de Datos no lineales, en las cuales cada elemento puede tener cero o ms
sucesores, y cero o ms predecesores; estn formados por nodos (vrtices:
representan informacin) y por arcos (aristas: relaciones entre la informacin). La
teora de Grafos se aplica hoy en da en muchos campos, tales como en Internet, redes
sociales, etc., ya que cada computador es un vrtice y la conexin entre ellos son las
aristas; adems se puede usar para hallar la ruta ms corta en empresas de transporte
y en muchas otras reas.

86 de
51
Tercer semestre

BIBLIOGRAFA

SUGERIDA
Autor

Captulo

Pginas

Lipschutz (1988)

337 y ss.

Guardati (2007)

--

Guardati B, Silvia. (2007). Estructura de datos orientada a objetos. Mxico: Pearson


Lipschutz, Seymour. (1988). Estructura de datos. Mxico: McGraw-Hill.

87 de
51
Tercer semestre

Unidad 4.
Mtodos de ordenamiento

88 de
51
Tercer semestre

OBJETIVO PARTICULAR
Al concluir la unidad, el alumno identificar los diferentes mtodos para la clasificacin
de datos, identificar sus caractersticas y los criterios para seleccionar el ms
adecuado a un conjunto de datos determinado.

TEMARIO DETALLADO
(12 horas)
4. Mtodos de ordenamiento
4.1. Intercambio Directo (Bubblesort)
4.2. Intercambio Inverso
4.3. Shaker Sort
4.4. Insercin Directa
4.5. Seleccin Directa
4.6. Shell
4.7. Quick Sort
4.8. Criterios de seleccin de mtodos de ordenamiento

89 de
51
Tercer semestre

INTRODUCCIN
Una de las operaciones ms importantes en el manejo de datos es su ordenamiento.
Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar o
clasificar la informacin. El sort, ordenacin, es reagrupar un grupo de datos en una
secuencia especfica de orden ya sea de mayor a menor o menor a mayor. Muchas de
estas operaciones las vemos en las hojas de clculo como Excel, en pginas de
Internet y Bases de Datos. Nos centraremos en los mtodos ms populares,
analizando la cantidad de comparaciones que suceden, el tiempo que demora y
ejemplificando con pseudocdigo o cdigo en lenguaje de programacin.

90 de
51
Tercer semestre

4.1. Intercambio directo (Bubble Sort)


El bubble sort, tambin conocido como ordenamiento burbuja, funciona de la siguiente
manera: Se va comparando cada elemento del arreglo con el siguiente; si un elemento
es mayor que el que le sigue, entonces se intercambian; esto producir que en el
arreglo quede como su ltimo elemento, el ms grande. Este proceso deber repetirse
recorriendo todo el arreglo hasta que no ocurra ningn intercambio. Los elementos que
van quedando ordenados ya no se comparan. "Baja el ms pesado".

Consiste en comparar pares de elementos adyacentes e intercambiarlos entre s hasta


que estn todos ordenados este mtodo tambin es conocido como intercambio
directo.

Ejemplo:
Sea un arreglo de 6 nmeros de empleados: {40,21,4,9,10,35}:

Primera pasada:
{21,40,4,9,10,35} <-- Se cambia el 21 por el 40.
{21,4,40,9,10,35} <-- Se cambia el 40 por el 4.
{21,4,9,40,10,35} <-- Se cambia el 9 por el 40.
{21,4,9,10,40,35} <-- Se cambia el 40 por el 10.
{21,4,9,10,35,40} <-- Se cambia el 35 por el 40.

Segunda pasada:
{4,21,9,10,35,40} <-- Se cambia el 21 por el 4.
{4,9,21,10,35,40} <-- Se cambia el 9 por el 21.
{4,9,10,21,35,40} <-- Se cambia el 21 por el 10.
91 de
51
Tercer semestre

Ya estn ordenados, pero para comprobarlo habra que acabar esta segunda
comprobacin y hacer una tercera.

Para su implementacin generalmente definimos una funcin donde A=arreglo y


N=tamao como sigue:

int bubblesort(int A[],int N){


int i,j,AUX;
for(i=2;i<=N;i++){ //avanza
for(j=N;j>=i;j--){ //retrocede
if(A[j-1]>A[j]){ //si a > p intercambio
AUX=A[j-1];
A[j-1]=A[j];
A[j]=AUX;
}
}
}
return 1;
}

En esta implementacin de la funcin bubblesort utilizamos un for anidado con los


ndices i y j para ir comparando y ordenando los elementos durante el recorrido del
arreglo.

92 de
51
Tercer semestre

Implementacin completa en Lenguaje C++ del BubbleSort

// Ordenamiento por el mtodo de Bubble Sort


#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std; //inicializa librerias std (standares) en c++
int llenavector(int A[],int N){
int c;
int x;
cout<<"Ingrese 10 numeros de empleados:"<<endl;
for(c=1;c<=N;c++){
cin>>x;
A[c]=x;
}
return 1;
}

int bubblesort(int A[],int N){


int i,j,AUX;
for(i=2;i<=N;i++){
for(j=N;j>=i;j--){
if(A[j-1]>A[j]){
AUX=A[j-1];
A[j-1]=A[j];
A[j]=AUX;
}
}
}
return 1;
}
int salida(int A[],int N){
int c;
for(c=1;c<=N;c++){
printf("%d, ",A[c]);
}
return 1;
}
int main()
93 de
51
Tercer semestre

{
int A[10];
llenavector(A,10);
printf("ORDENAMIENTO BUBBLE SORT \n");
printf("Numeros a ordenar: \n");
salida(A,10);
printf("\n\nNumeros ordenados: \n");
bubblesort(A,10);
salida(A,10);
getch();
}

El programa lee un arreglo de 10 elementos, los muestra desordenados y al final los


ordena invocando a la funcin llamada bubblesort.
Anlisis de eficiencia del mtodo de intercambio directo
Este mtodo es el ms fcil de implementar; sin embargo con mayor volumen de datos
es el ms ineficiente.

En el mtodo bubble Sort tendremos consecutivas comparaciones entre pares de


nmeros de tal manera que en la primera pasada tendremos (n-1) comparaciones y
en la segunda (n-2) y as sucesivamente hasta llegar a 2 y 1 comparaciones entre
elementos dependiendo de tamao del arreglo. Expresado en otros trminos, esta
operacin se reduce a: BS = (n2 -n)/2 donde BS es el mtodo bubble Sort. El nmero
de elementos a ordenar dependen de si el arreglo est ordenado, desordenado o en
orden inverso. Esto es: Para un arreglo ordenado = 0, para uno desordenado = 0.75
* (n2 - n) y para uno con orden inverso ser = 1.5 * (n2 - n). El tiempo necesario para
ejecutar el algoritmo Bubble Sort es proporcional a n2, donde n es el nmero de
elementos del arreglo. Mientras ms elementos contenidos en el arreglo, mayor ser
el nmero de comparaciones y menor la calidad de este mtodo.

94 de
51
Tercer semestre

4.2. Intercambio inverso


El mtodo por intercambio inverso es otra modalidad de intercambio, as tenemos que:

Ordenando los elementos del arreglo usando el mtodo bubblesort, se transporta en


cada pasada el elemento ms pequeo a la parte izquierda del arreglo A de N
elementos.

Un ejemplo de pseudocdigo para este proceso sera:


bubblesort1(A,N)
Inicio
Declarar i,j,aux:entero
Para i = 2 hasta N haga
Para j = i hasta 2 inc (-1) haga
Si (A[j-1]>A[j]) entonces
Aux = A[j-1]
A[j-1] = A[j]
A[j] = aux
Fin si
Fin para
Fin para
Fin

Intercambio inverso contrario al anterior


El intercambio inverso es una mejora al mtodo bubble Sort que consiste en la
modalidad de que en cada pasada del arreglo el valor ms grande se lleva a la derecha
en lugar de la izquierda. Se tienen dos etapas, en la primera se trasladan los elementos
ms pequeos hacia la izquierda almacenando en una variable el ltimo elemento
intercambiado. En la segunda, se trasladan los elementos ms grandes hacia la parte

95 de
51
Tercer semestre

derecha del arreglo almacenando en otra variable la posicin del ltimo elemento
intercambiado.

Un pseudocdigo para este proceso sera:


bubblesort2(A,N)
Inicio
Declarar i,j,aux:entero
Para i = 1 hasta N-1 haga
Para j = 1 hasta N-i haga
Si (A[j]>A[j+1]) entonces
Aux = A[j]
A[j] = A[j+1]
A[j+1] = aux
Fin si
Fin para
Fin para
Fin

Traduce este pseudocdigo a un programa en lenguaje C/C++ llamado sortInverso.cpp


en el compilador de tu preferencia.

96 de
51
Tercer semestre

4.3. Shaker Sort


La idea bsica de este algoritmo consiste en mezclar las dos formas en que se puede
realizar el mtodo bubblesort.

El mtodo Shaker Sort, tambin lo puedes encontrar como "Sacudida" o "Cocktail" y


es una versin mejorada del mtodo Bubble Sort, ya que utiliza un algoritmo de
intercambio que le permite alterar ambos extremos del arreglo a la vez, con lo cual, en
el primer paso ordena los datos del arreglo de derecha a izquierda y se trasladan los
elementos ms pequeos hacia la parte izquierda del arreglo, almacenando en una
variable la posicin del ltimo elemento intercambiado. En el siguiente paso se efecta
un ordenamiento contrario y se trasladan los elementos ms grandes hacia la parte
derecha del arreglo, almacenando en otra variable la posicin del ltimo elemento
intercambiado y as sucesivamente hasta ordenar la lista completa.

El cdigo de la funcin Shaker Sort queda de la siguiente manera en lenguaje C.


void ShakerSort (itemType a[], int N)
{
int i, j, izq, der, aux;
izq = 2; der = N; j = N;
do
{
for(i = der; i >= izq; i--)
if (a[i - 1] > a[i])
{ swap (a, i, i -1);
j = i;
97 de
51
Tercer semestre

}
izq= j + 1;
for(i = izq; i <= der; i++)
if (a[i -1] > a[i])
{ swap (a, i, i -1)
j = i;
}
der= j - 1;
} while (izq <= der);
}

Como ejercicio personal, desarrolla un programa en C/C++ que contenga esta


funcin la cual puedes consultar en la siguiente ruta de Internet.
http://es.scribd.com/doc/40292011/Metodos-de-to-en-c

4.4. Insercin directa


El mtodo de la baraja o insercin directa se basa en tomar el primer elemento de la
parte izquierda desordenada del arreglo y busca la posicin que le corresponde dentro
de la seccin ordenada. Se toma el primer elemento de la parte no ordenada y se
almacena en una variable auxiliar (aux). Se compara empezando por el final de la parte
ordenada, hasta que se encuentra un elemento menor. Entonces se desplaza una
posicin a la derecha, todos los elementos que han resultado mayores que el que
queremos insertar y se coloca el valor de la variable auxiliar (aux) en el lugar
encontrado.

A partir de ste cdigo desarrolla un programa correspondiente al Mtodo de insercin


directa (InsercionDirecta.cpp) y prubalo en el compilador de C/C++ de tu preferencia.
98 de
51
Tercer semestre

int array[N];
int i,j,aux;
// Define un arreglo de 10 nmeros
// Dar valores a los elementos del arreglo
for(i=1;i<N;i++) // i contiene el nmero de elementos de la sublista.
{ // Se intenta aadir el elemento i.
aux=array[i];
for(j=i-1;j>=0;j--) // Se recorre la sublista de atrs a adelante para buscar
{ // la nueva posicin del elemento i.
if(aux>array[j]) // Si se encuentra la posicin:
{
array[j+1]=aux; // Ponerlo
break; // y colocar el siguiente nmero.
}
else // si no, sigue buscndola.
array[j+1]=array[j];
}
if(j==-1) // si se ha mirado todas las posiciones y no se ha encontrado la correcta
array[0]=aux; // es que la posicin es al principio del todo.
}

99 de
51
Tercer semestre

4.5. Seleccin directa


El proceso de este algoritmo consiste en buscar el menor elemento en el arreglo y
colocarlo en primera posicin. Luego se busca el segundo elemento ms pequeo del
arreglo y se coloca en segunda posicin. El proceso contina hasta que todos los
elementos del arreglo hayan sido ordenados. El mtodo se basa en los siguientes
principios:

1. Seleccionar el menor elemento del arreglo.


2. Intercambiar dicho elemento con el primero.
3. Repetir los pasos anteriores con los (n-1), (n-2) elementos y as sucesivamente
hasta que slo quede el elemento mayor.

Se requiere hacer el ordenamiento de tres claves de empleados con el mtodo de


seleccin directa: 44, 52, 11, 37, 49, por lo tanto, n=5 claves

1 pasada: En esta pasada se busca entre los ltimos elementos el menor de todos, y
lo intercambiaremos con la primera posicin.
44, 52, 11, 37, 49 Para buscar el menor, necesitaremos una instruccin for que
recorra los n ltimos elementos.
44, 52, 11, 37, 49

El menor es el 11, colocado en tercera posicin.

44, 52, 11, 37, 49

Lo intercambiamos con el de la primera posicin.

11, 52, 45, 37, 49

Ya tenemos uno en orden. Nos quedan los n-1 ltimos.

2 pasada: En la segunda pasada buscamos entre los ltimos n-1 (es decir, 4)
elementos el menor de todos, y lo intercambiaremos con la segunda posicin.
11, 52, 44, 37, 49

Recorremos los cuatro ltimos y el menor es el 37.

11, 37, 44, 52, 49

Lo intercambiamos con la segunda posicin y ya hay dos

en orden.
100 de
51
Tercer semestre

3 pasada: En esta pasada buscamos entre los ltimos n-2 (es decir, 3) elementos el
menor de todos, y lo intercambiaremos con la tercera posicin.
11, 37, 44, 52, 49

El menor es el 44, en tercera posicin.

11, 37, 44, 52, 49

El 44 ya estaba en 3 posicin, as que al intercambiarlo

con l mismo, se queda como est. Ya tenemos tres en orden.


4 y ltima pasada: buscamos entre los ltimos n-3 (es decir, 2) elementos el menor
de todos, y lo intercambiaremos con la cuarta posicin.
11, 37, 44, 52, 49

El menor es el 49, en quinta posicin.

11, 37, 44, 49, 52

Lo intercambiamos con la cuarta posicin. Ya hay cuatro

en orden.
11, 37, 44, 49, 52

El ltimo est necesariamente en orden tambin.

Las claves quedarn ordenadas.

Vease: http://latecladeescape.com/algoritmos/1122ordenacion-por-selecciondirecta-selectionsort
Con base en lo anterior, podemos implementar en Lenguaje C o C++ la siguiente
funcin:

void seleccion_directa(int n)
{
int i,j,min,k;
int cambio;
for(i=0;i<n;i++)
{
min=arr[i];
k=0;
cambio=0;
for(j=i+1;j<n;j++)
{
if (arr[j]<min)
{
min=arr[j];
k=j;
cambio=1;}
101 de
51
Tercer semestre

}
if (cambio )
{
arr[k]=arr[i];
arr[i]=min;
}
}

4.6. Shell
A continuacin comentamos el mtodo Shell sort.

El mtodo Shell Sort tambin lo puedes encontrar como mtodo de insercin con
incrementos decrecientes creado por Donald Shell y consiste en realizar mltiples
recorridos al arreglo y en cada pasada ordena un nmero igual de elementos.
Cada elemento se compara con los que le siguen a su izquierda. Si el elemento a
insertar es menor, se tiene que ejecutar muchas comparaciones antes de colocarlo en
su lugar definitivamente. El mtodo Shell agiliza los saltos contiguos resultantes de las
comparaciones por saltos de mayor tamao y con eso se obtiene una ordenacin ms
rpida. El mtodo se basa en tomar como salto N/2 (siendo N el nmero de elementos)
y luego reduciendo a la mitad el arreglo en cada repeticin hasta que el salto o
distancia vale 1.

Ejemplo: Supongamos que tenemos que ordenar un vector de claves de 6 empleados


por el Mtodo Shell Sort.

60, 11,

55,

22,

33,

44,

10

En el primer recorrido se realizan 3 saltos reordenando la lista como:


22, 11, 44, 55, 10, 33, 55, 60 haciendo los intercambios: (60,22), (55,44), (60,10)
102 de
51
Tercer semestre

En el segundo recorrido se realizan 3 saltos reordenando la lista como:


10, 11, 44, 22, 33, 55, 60 haciendo los intercambios: (22,10)

En el tercer recorrido se realizan 3 saltos reordenando la lista como:


10, 11, 44, 22, 33, 55, 60 haciendo ningn intercambio

En el cuarto recorrido se realizan 1 saltos reordenando la lista como:


10, 11, 22, 33, 44, 55, 60 haciendo los intercambios: (44,22), (44,33)

En el quinto recorrido se realizan 1 saltos reordenando la lista como:


10, 11, 22, 33, 44, 55, 60 haciendo ningn intercambio por lo tanto el vector quedar
ordenado.

Referente a la eficiencia de este mtodo podemos decir que, el tamao del conjunto
de datos utilizados en las comparaciones tiene un impacto significativo en la eficiencia
del algoritmo. Algunas implementaciones de este algoritmo tienen una funcin que
permite calcular el tamao ptimo del set de datos para un arreglo determinado. Su
implementacin original, requiere O(n2) comparaciones e intercambios en el peor
caso; sin embargo, el Shell Sort es una versin mejorada del ordenamiento por
insercin comparando elementos separados por un espacio de varias posiciones. Esto
permite que un elemento haga "pasos ms grandes" hacia su posicin esperada. Los
pasos mltiples sobre los datos, se hacen con tamaos de espacio cada vez ms
pequeos. El ltimo paso del Shell Sort simplemente es un ordenamiento por insercin;
pero para entonces, ya est garantizado que los datos del arreglo estn ordenados.

103 de
51
Tercer semestre

A partir de ste fragmento de cdigo en C/C++ transfrmalo en una funcin llamada


ShellSort e implementa el programa ShellSort.cpp para un vector de 10 claves de
empleados y prubalo en el compilador de C/C++ de tu preferencia.
int array[N];
int salto,cambios,aux,i;
for(salto=N/2;salto!=0;salto/=2) // El salto va desde N/2 hasta 1.
for(cambios=1;cambios!=0;) // Mientras se intercambie algn elemento:
{
cambios=0;
for(i=salto;i<N;i++) // se da una pasada
if(array[i-salto]>array[i]) // y si estn desordenados
{
aux=array[i]; // se reordenan
array[i]=array[i-salto];
array[i-salto]=aux;
cambios++; // y se cuenta como cambio.
}
}

Vase en: http://es.scribd.com/doc/48004260/ESTRUCTURA-de-DATOS-III-Algoritmos-DeOrdenamiento

104 de
51
Tercer semestre

4.7. Quick sort


El mtodo Quick sort o de ordenacin rpida utiliza un algoritmo recursivo, es decir,
implementa una funcin que se llama a s misma. El Quick sort es un algoritmo del
estilo divide y vencers. El algoritmo de recursin consiste en una serie de cuatro
pasos:

1. Si hay menos de un elemento por ordenar, retorna inmediatamente (termina).


2. Tomar un elemento del vector que sirve como muestra.
3. Dividir el arreglo en dos partes, una con los elementos mayores y una con los
elementos menores a la muestra.
4. Repite recursivamente el algoritmo para las dos mitades del arreglo original hasta
que queda ordenado.
Vase en http://es.scribd.com/doc/48004260/ESTRUCTURA-de-DATOS-III-Algoritmos-DeOrdenamiento

Ejemplo de la funcin Quicksort recursiva.

void Quicksort_Recursivo(int ini, int fin)


{
int izq,der,x,aux;
x=arr[ini];
izq=ini;der=fin;
while(izq<der)
{
while(arr[izq]<=x &&izq<der) izq++;
while(arr[der]>x)
der--;
if (izq<der)
{
aux= arr[izq];
arr[izq]=arr[der];
105 de
51
Tercer semestre

arr[der]=aux;
}
}
arr[ini]=arr[der];
arr[der]=x;
if(ini<der-1) Quicksort_Recursivo (ini,der-1);
if(der+1 <fin) Quicksort_Recursivo (der+1,fin);
}
}
}

4.8. Criterios de seleccin


de mtodos de ordenamiento
Uno de los criterios para seleccionar el mtodo que vamos a utilizar es el volumen de
datos por procesar; es decir, que para mayor volumen hay que implementar mtodos
de ordenamientos rpidos y recursivos que consuman poca memoria.

Otro de los criterios para seleccionar el mtodo que vamos a utilizar, es considerar si
se requiere el ordenamiento interno o externo. Cuando hablamos de ordenamiento
interno, se lleva a cabo completamente en memoria principal. Todos los objetos que
se ordenan caben en la memoria principal de la computadora. En cambio, en el
ordenamiento externo no cabe toda la informacin en memoria principal y es necesario
ocupar memoria secundaria. El ordenamiento ocurre transfiriendo bloques de
informacin a la memoria principal en donde se ordena el bloque y se regresa ya
ordenado, a la memoria secundaria.

Por ltimo, podemos considerar el clculo de la eficiencia del mtodo.

106 de
51
Tercer semestre

RESUMEN
En esta unidad partimos del mtodo de ordenamiento bubble sort, ya que es un
algoritmo de ordenamiento de datos simple y popular. Se utiliza frecuentemente como
un ejercicio de programacin, porque es relativamente fcil de entender y
comprendimos cmo implementar el mtodo de clasificacin shaker en aplicaciones
de estructuras de datos. La idea bsica de este algoritmo consiste en mezclar las dos
formas en que se puede realizar el mtodo bubble sort. El algoritmo de la variable que
almacena el extremo izquierdo del arreglo es mayor que el contenido de la variable
que almacena el extremo derecho.

El anlisis del mtodo de la clasificacin shaker, y en general el de los mtodos


mejorados y logartmicos, son muy complejos. Respecto al mtodo de ordenacin por
insercin directa, es el que generalmente utilizan los jugadores de cartas cuando
ordenan stas, de ah que tambin se conozca con el nombre de mtodo de la baraja,
as como el mtodo de seleccin directa, que se implementa en aplicaciones de
estructuras de datos; de igual manera, el mtodo Shell sort implica un algoritmo que
realiza mltiples pases a travs de la lista, y en cada pasada ordena un nmero igual
de tems.

El mtodo bubble Sort, insercin y seleccin, tiene una complejidad normal de entrada
n que puede resolverse en n2 pasos. Mientras que el mtodo Quicksort tiene una
complejidad mayor que incluye una bsqueda binaria, logartmica y recursiva, por tanto
es el algoritmo de ordenamiento ms rpido teniendo una complejidad O(n log2 n)
siendo posiblemente el algoritmo ms rpido.

107 de
51
Tercer semestre

BIBLIOGRAFA

SUGERIDA
Autor

Captulo

Martin, David (2007).

Sorting

Algorithm

Animations

Pginas
http://www.sortingalgorithms.com/

Kruse, Robert L; Tondo, Clovis; Leung, Bruce. (1997). Data Structures & Program
Design in C. (2nd ed.) Prentice Hall

Joyanes Aguilar, L; Zahonero Martnez, I. (1998). Estructuras de Datos, Algoritmos,


Abstraccin y objetos (ejemplos en Pascal). Mxico: McGraw-Hill.

Martnez, R; Quiroga, E. (2002). Estructura de Datos, Referencia prctica con


orientacin a objetos. Mxico: Thomson Learning.
Cair B, Osvaldo; Guardati, S. (2002). Estructuras de Datos. (2a ed.) Mxico: McGrawHill.

108 de
51
Tercer semestre

Unidad 5.
Mtodos de bsqueda

109 de
51
Tercer semestre

OBJETIVO PARTICULAR
Al concluir la unidad, el alumno identificar y aplicar los mtodos de bsqueda y podr
seleccionar el ms adecuado para un conjunto de datos determinado.

TEMARIO DETALLADO
(12 horas)
5. Mtodos de bsqueda
5.1. Bsqueda secuencial
5.2. Bsqueda Binaria
5.3. Bsqueda por transformacin de llaves (Hash)
5.3.1. Funciones Hash
5.3.2. Resolucin de colisiones
5.4. Bsqueda en rboles binarios

110 de
51
Tercer semestre

INTRODUCCIN
Una de las actividades ms importantes de la informtica es la bsqueda de los datos.
El ejemplo ms concreto lo vivimos a diario cuando tenemos que hacer consultas en
cualquiera de los buscadores de Internet.

La bsqueda de un elemento dentro de un arreglo es una de las operaciones ms


importantes en el procesamiento de la informacin, y permite la recuperacin de datos
previamente almacenados. El tipo de bsqueda se puede clasificar como interna o
externa, segn el lugar en el que est almacenada la informacin (en memoria o en
dispositivos externos). Todos los algoritmos de bsqueda tienen dos finalidades:

Determinar si el elemento buscado se encuentra en el conjunto en el que se


busca.

Si el elemento est en el conjunto, hallar la posicin en la que se encuentra.

Centrndonos en la bsqueda interna. Como principales algoritmos de bsqueda en


arreglos tenemos la bsqueda secuencial, la binaria y la bsqueda utilizando tablas de
hash.

111 de
51
Tercer semestre

5.1. Bsqueda secuencial


El mtodo de bsqueda secuencial consiste en recorrer y examinar cada uno de los
elementos del arreglo hasta encontrar el o los elementos buscados, o hasta que se
han mostrado todos los elementos del arreglo.

La implementacin en lenguaje C de este algoritmo es la siguiente:


for(i=j=0;i<N;i++)
if(array[i]==elemento)
{
buscado[j]=i;
j++;
}
Este algoritmo se puede optimizar cuando el arreglo est ordenado, en cuyo caso la
condicin de salida cambiara a:
for(i=j=0;array[i]<=elemento;i++)

o cuando slo interesa conocer la primera ocurrencia del elemento en el arreglo.


for(i=0;i<N;i++)
if(array[i]==elemento)
break;

En este ltimo caso, cuando slo interesa la primera posicin, se puede utilizar un
centinela (bandera); esto es, dar a la posicin siguiente al ltimo elemento de arreglo
el valor del elemento, para estar seguros de que se encuentra el elemento, y no tener
que comprobar a cada paso si seguimos buscando dentro de los lmites del arreglo:
112 de
51
Tercer semestre

array[N]=elemento;
for(i=0;;i++)
if(array[i]==elemento)
break;

Si al acabar el bucle, i vale N es que no se encontr el elemento. El nmero medio de


comparaciones que hay que hacer antes de encontrar el elemento buscado es de
(N+1)/2.

5.2. Bsqueda binaria


La bsqueda binaria divide un arreglo por su elemento medio en dos subarreglos ms
pequeos y compara el elemento a buscar con este elemento medio. Si estos
elementos coinciden, la bsqueda termina. Si el elemento es menor, entonces se
busca en el primer subarreglo, y si es mayor se buscar en el segundo subarreglo.

El mtodo de bsqueda binaria requiere que el arreglo de datos se encuentre ordenado


y es ms eficiente que el de bsqueda secuencial ya que este mtodo se basa en ir
comparando el elemento central del arreglo con el valor buscado. Si ambos coinciden,
finaliza la bsqueda. Si no ocurre as, el elemento buscado ser mayor o menor en
sentido estricto que el central del arreglo. Si el elemento buscado es mayor se procede
a hacer la bsqueda binaria en la parte del subarreglo superior, si el elemento buscado
es menor que el contenido de la casilla central, se debe cambiar el segmento a
considerar al segmento que est a la izquierda de tal sitio central.
Ejemplo: Se requiere buscar la clave 33 de un empleado por el mtodo de bsqueda
binaria en un arreglo de 9 elementos. 10, 22, 33, 40, 55, 66, 77, 80, 99.
El primer paso toma el elemento central que es 55 y se divide en dos
113 de
51
Tercer semestre

El elemento buscado 33 es menor que el central 55, debe estar en el primer subarreglo:
10, 22, 33, 40
Se divide el subrrango en dos quedando el 22
Como el elemento buscado es mayor que el central, debe estar en el segundo
subarreglo: 33, 40
Se vuelve a dividir este subrrango y como el elemento buscado coincide con el central
33, lo hemos encontrado.
Si al final de la bsqueda todava no lo hemos encontrado, y el subarreglo por dividir
est vaco {}, el elemento no se encuentra en el arreglo.
Eficiencia de este mtodo.
Este mtodo es ms eficiente que el de bsqueda secuencial o lineal para casos de
grandes volmenes de datos y para mejorar su velocidad se puede implementar en
forma recursiva, siendo una funcin que divide el arreglo en dos ms pequeos
elementos.

El mtodo realiza log(2,N+1) comparaciones antes de encontrar el elemento, o antes


de descubrir que no est. Este nmero es muy inferior que el necesario para la
bsqueda lineal para casos grandes.
Este mtodo tambin se puede implementar de forma recursiva, siendo la funcin
recursiva la que divide al arreglo en dos ms pequeos.

A partir del ejemplo de la pgina:


http://mygnet.net/codigos/c/metodos_de_busqueda/busqueda_binaria_de_forma_r
ecursiva_sobre_un_vector_ordenado_dot_muy_completo.2936, implementa un
programa de Bsqueda binaria en forma recursiva sobre un vector ordenado en
lenguaje C en el compilador de tu preferencia.

114 de
51
Tercer semestre

5.3. Bsqueda por transformacin


de llaves (Hash)
En informtica, el trmino Hash trata de la implementacin de una funcin o mtodo
que permite generar claves o llaves que representen sin errores a un documento,
registro, archivo, base de datos etc. Esta tcnica es til para resumir o identificar un
dato a travs de la probabilidad, utilizando un mtodo, algoritmo o funcin hash.
El mtodo por transformacin de claves o llaves (Hash) consiste en asignar un ndice
a cada elemento mediante una transformacin de elementos, esto se hace mediante
una funcin de conversin llamada funcin hash. Hay diferentes funciones para
transformar el elemento y el nmero obtenido es el ndice del elemento.

Elementos

ndices

Transformacin

Jos Luis

78

Jos Luis-5589343464

Mara

55

Mara-5577003423

Pedro
Ral

12
42

Pedro-5598334388
Ral-5589233390

Un ejemplo de una tabla Hash que asocia elementos con telfonos.

En este ejemplo el nuevo ndice obtenido nos permite el acceso a las personas por su
nmero telefnico almacenados a partir de una clave especial generada.

5.3.1. Funcin Hash


La funcin Hash tiene como entrada un conjunto de cadenas que transforma en un
rango de salida finito, normalmente cadenas de longitud fija. La idea bsica de un valor
115 de
51
Tercer semestre

hash es que sirva como una representacin compacta de la cadena de entrada. Por
esta razn decimos que estas funciones resumen datos del conjunto dominio.

Funciona transformando la clave con una funcin hash en un hash, un nmero que
identifica la posicin donde la tabla hash localiza el valor deseado.

La manera ms simple de transformar el elemento es asignarlo directamente; es decir,


al 0 le corresponde el ndice 0, al 1 el 1, y as sucesivamente, pero cuando los
elementos son muy grandes, empezamos a tener problemas con el manejo de la
informacin, ya que se puede desperdiciar espacio de almacenamiento y la
recuperacin de datos se vuelve ms lenta y compleja. La funcin de hash ideal
debera ser biyectiva; esto es, que a cada elemento le corresponda un ndice, y que a
cada ndice le corresponda un elemento; pero no siempre es fcil encontrar esa
funcin, e incluso a veces es intil, ya que se puede no saber el nmero de elementos
a almacenar. La funcin de hash depende de cada problema y de cada finalidad, y se
pueden utilizar con nmeros o cadenas.

De las funciones Hash ms utilizadas podemos mencionar las siguientes:


Restas sucesivas; en esta funcin se emplean claves numricas entre las que existen
huecos de tamao conocido, obtenindose direcciones consecutivas. Aritmtica
modular; en esta funcin el ndice de un nmero es resta de la divisin de ese nmero
entre un nmero N prefijado, preferentemente primo. Mitad del cuadrado; Consiste en
elevar al cuadrado la clave y coger las cifras centrales. Truncamiento; Consiste en
ignorar parte del nmero y utilizar los elementos restantes como ndice. Plegamiento;
Consiste en dividir el nmero en diferentes partes, y operar con ellas (normalmente
con suma o multiplicacin). Estas funciones slo son sugerencias y que con cada
problema se puede implementar una nueva funcin hash que incluso se puede crear
con base en un algoritmo.

116 de
51
Tercer semestre

5.3.2. Resolucin de colisiones


Cuando hay un conflicto entre direcciones, por ejemplo en las direcciones IPs de una
red, se presenta un estado de colisin. Una colisin es la asignacin de una misma
direccin a dos o ms claves diferentes. Cuando sucede este conflicto entre claves,
entonces se busca el mejor mtodo de resolucin de colisiones que lleve a la solucin
de este problema.
Hay diferentes maneras de resolucin de colisiones, una de ellas es crear un arreglo
de apuntadores, donde cada apuntador seale el principio de una lista enlazada. De
esta manera, cada elemento que llega a incorporarse, se pone en el ltimo lugar de la
lista de ese ndice con una clave nueva. El tiempo de bsqueda se reduce
considerablemente, y no hace falta poner restricciones al tamao del arreglo, ya que
se pueden aadir nodos dinmicamente a la lista.

Otro mtodo de resolucin de colisiones es el mtodo de prueba lineal, que consiste


en que una vez que se detecta la colisin se debe recorrer el arreglo secuencialmente
a partir del punto de colisin, buscando al elemento. El proceso de bsqueda concluye
cuando el elemento es hallado, o bien cuando se encuentra una posicin vaca. Por
ejemplo si la posicin 97 ya estaba ocupada, el registro con clave 54405-97 es
colocado en la posicin 98, la cual se encuentra disponible. Una vez que el registro ha
sido insertado en esta posicin, otro registro que genere la posicin 97 o la 98 es
insertado en la posicin disponible siguiente.
Implementacin de Bsqueda por transformacin de llaves Hash
La implementacin utiliza el paradigma orientado a objetos, modo grfico, en la versin
de Visual Studio Lenguaje de Programacin C Sharp o C#. Como podrs observar, en
este ejemplo la sintaxis es muy similar a C y Java.

117 de
51
Tercer semestre

En el ambiente de programacin de Visual Studio crea una ventanita con las siguientes
caractersticas:

Name=textBox1

Text=Buscar

Da Clic en el botn e ingresa el siguiente cdigo en C Sharp.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Hash
{
public partial class Form1 : Form
{
private int[] datos = new int[5] {1679, 4567, 1165, 0435, 5033 };
private int[] hash = new int[7];
private int[] enlace = new int[7];
public Form1()
{
InitializeComponent();
for (int b = 0; b <= 6; b++)
{
enlace[b] = -9999;
}
//Reacomodo por hash
int r, aux=0;
for (int i = 0; i <= 4; i++)
118 de
51
Tercer semestre

{
r= datos[i] % 7;
if (datos[i] == 0)
{
hash[r] = datos[i];
}
else
{
for(int s=0;s<=6;s++)
{
if(hash[s]==0)
{
aux=s;
}
}
hash[aux]=datos[i];
enlace[r] = aux;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
int temp,r;
temp = int.Parse(textBox1.Text.ToString());
r = temp % 7;
if (temp == hash[r])
{
MessageBox.Show("Se encuentra en \nel renglon:" + r.ToString(),
"Resultado");
}
else
{
while(enlace[r] != -9999)
{
if (temp == hash[enlace[r]])
{
MessageBox.Show("Se encuentra en \nel renglon:" +
enlace[r].ToString(), "Resultado");
r = enlace[r];
}
}
}
}
}
}

119 de
51
Tercer semestre

Ejecuta tu aplicacin.
Imgenes del programa corriendo:

5.4. Bsqueda en rboles binarios


La bsqueda en rboles binarios es un mtodo de bsqueda simple, dinmico y
eficiente considerado como uno de los fundamentales en informtica.

Un rbol binario tiene las siguientes caractersticas:

Es el que en cada nodo tiene a lo ms un hijo a la izquierda y uno a la derecha.

Es una estructura de datos jerrquica.

La relacin entre los elementos es de uno a muchos.

Ejemplo:

rbol Binario de Bsqueda (ABB)


Este tipo de rbol permite almacenar informacin ordenada.
120 de
51
Tercer semestre

Reglas a cumplir:

Cada nodo del rbol puede tener 0, 1 2 hijos.

Los descendientes izquierdos deben tener un valor menor al padre.

Los descendientes derechos deben tener un valor mayor al padre.

Ejemplo de recorrido para buscar el nodo 25.

En el ejemplo, se requieren tres pasos para encontrar el nodo deseado. En caso de


encontrar el elemento, se regresar el valor buscado dependiendo de si se encontr
en el descendiente izquierdo o derecho. En caso contrario, se regresar FALSE para
indicar que no se encontr el nodo, como se muestra en la funcin de C llamada
Buscar.
int Buscar(Arbol a, int dat) {
pNodo actual = a;
while(!Vacio(actual)) {
if(dat == actual->dato) return TRUE;
else if(dat < actual->dato) actual = actual->izquierdo;
else if(dat > actual->dato) actual = actual->derecho;
}
return FALSE; /* No est en rbol */
}
121 de
51
Tercer semestre

RESUMEN
En esta unidad identificaste los diferentes mtodos de bsqueda aplicados a las
estructuras de datos para el desarrollo de sus aplicaciones, entendimos que todos los
algoritmos de bsqueda tienen dos finalidades:

Determinar si el elemento buscado se encuentra en el conjunto en el que se


busca.

Si el elemento est en el conjunto, hallar la posicin en la que se encuentra.

En la bsqueda secuencial hay que recorrer y examinar cada uno de los elementos
del arreglo hasta encontrar el o los elementos buscados, o hasta que se han mostrado
todos los elementos del arreglo.

Para la bsqueda binaria, el arreglo debe estar ordenado. Este tipo de bsqueda
consiste en dividir el arreglo por su elemento medio en dos subarrays ms pequeos,
y comparar el elemento con el del centro. Este mtodo tambin se puede implementar
de forma recursiva, siendo la funcin recursiva la que divide al arreglo en dos ms
pequeos.

Otro mtodo de bsqueda es el de transformacin de llaves Hash que consiste en


asignar un ndice a cada elemento mediante una transformacin del elemento, esto se
hace mediante una funcin de conversin llamada funcin hash.

122 de
51
Tercer semestre

BIBLIOGRAFA

SUGERIDA

Autor
Luis Joyanes Aguilar

Captulo

Pginas

Fundamentos de Programacin:

355p

Algoritmos y Estructura de Datos

Cair, Osvaldo; Guardati, Silvia. (2006). Estructura de datos. (3 ed.) Mxico: McGrawHill.

Joyanes Aguilar, Luis. (1990). Problemas de metodologa de la programacin. Madrid:


McGraw-Hill, 1990
----------------------. (2008). Fundamentos de la programacin. Madrid: McGraw-Hill.

Rodrguez Baena, Luis; Fernndez Azuela, Matilde y Joyanes Aguilar, Luis. (2003).
Fundamentos de Programacin: algoritmos, estructuras de datos y
objetos. (2 ed.). Madrid: McGraw-Hill.

Tenenbaum, Aaron M. (1993). Estructuras de datos en C. Mxico: Prentice Hall.

123 de
51
Tercer semestre

124 de
51
Tercer semestre

You might also like