Sie sind auf Seite 1von 70

INDICE

INTRODUCCIN A LAS ESTRUCTURAS DE DATOS.


Clasificacin de las estructuras de datos
Tipos de datos abstractos (TDA).
Manejo de memoria
Memoria esttica
Memoria dinmica
Anlisis de algoritmos
Complejidad en el tiempo
Complejidad en el espacio
Eficiencia de los algoritmos
RECURSIVIDAD.
Definicin
Procedimientos recursivos
Ejemplos de casos recursivos

ESTRUCTURAS LINEALES
Pilas
Representacin en memoria
Operaciones bsicas
Aplicaciones
Colas
Representacin en memoria
Operaciones bsicas
Tipos de colas: Cola simple, Cola
circular y Colas dobles.
Aplicaciones: Colas de prioridad.
Listas
Operaciones bsicas
Tipos de listas.
Listas simplemente enlazadas, listas doblemente enlazadas y listas
circulares.
Aplicaciones.
ESTRUCTURAS NO LINEALES.
rboles

Clasificacin de rboles
Operaciones bsicas sobre rboles binarios
Aplicaciones
Grafos
Representacin de grafos
Operaciones bsicas
METODOS DE ORDENAMIENTO
Algoritmos de Ordenamiento Internos
Burbuja.
Quicksort.
ShellSort.
Radix
Algoritmos de ordenamiento Externos
Intercalacin
Mezcla Directa
Mezcla Natural
METODOS DE BSQUEDA
Bsqueda secuencial
Bsqueda binaria

Bsqueda por funciones de HASH

1. Introduccin a las estructuras de datos.


Clasificacin de las estructuras de datos.
Una estructura de datos es una clase de datos que se puede caracterizar por su
organizacin y operaciones definidas sobre ella. Algunas veces a estas estructuras
se les llama tipos de datos.
En ellas encontramos las siguientes:
ESTRUCTURAS LGICAS DE DATOS:
En un programa, cada variable pertenece a alguna estructura de datos explcita o
implcitamente definida, la cual determina el conjunto de operaciones validas para
ella. Las estructuras de datos que se discuten aqu son estructuras de datos
lgicas. Cada estructura de datos lgica puede tener varias representaciones
fsicas diferentes para sus almacenamientos
ESTRUCTURAS PRIMITIVAS Y SIMPLES:
Son primitivas aquellas que no estn compuestas por otras estructuras de datos,
por ejemplo, enteros, booleanos y caracteres. Otras estructuras de datos se
pueden construir de una o mas primitivas. Las estructuras de datos simples que
consideramos se construyen a partir de estructuras primitivas y son: cadenas,
arreglos y registros. A estas estructuras de datos las respaldan muchos lenguajes
de programacin.
ESTRUCTURAS LINEALES Y NO LINEALES:
Las estructuras de datos simples se pueden combinar de varias maneras para
formar estructuras ms complejas. Los dos cases principales de estructuras de
datos son las lineales y las no lineales, dependiendo de la complejidad de las
relaciones lgicas que representan. Las estructuras de datos lineales incluyen
pilas, colas y listas ligadas lineales. Las estructuras de datos no lineales incluyen
grafos y rboles.

Datos estticos: su tamao y forma es constante durante la ejecucin de un


programa y por tanto se determinan en tiempo de compilacin. El ejemplo tpico
son los arrays. Tienen el problema de que hay que dimensionar la estructura de
antemano, lo que puede conllevar desperdicio o falta de memoria.
Datos dinmicos: su tamao y forma es variable (o puede serlo) a lo largo de un
programa, por lo que se crean y destruyen en tiempo de ejecucin. Esto permite
dimensionar la estructura de datos de una forma precisa: se va asignando
memoria en tiempo de ejecucin segn se va necesitando.

Tipos de datos abstractos (TDA).


Tipo de dato abstracto
Un tipo de dato abstracto (TDA) o tipo abstracto de datos (TAD) es un modelo
matemtico compuesto por una coleccin de operaciones definidas sobre un
conjunto de datos para el modelo. En el mundo de la programacin existen
diversos lenguajes que se han ido creando con el paso del tiempo y que se han
perfeccionado debido a las necesidades de los programadores de la poca a la
que pertenecen. Los primeros lenguajes de programacin eran de tipo lineal, ya
que un programa se recorra desde un punto marcado como Inicio hasta llegar a
un punto Fin. Con el tiempo se fueron creando nuevos lenguajes y en nuestros
das los ms utilizados son los llamados orientados a objetos.
Definicin 2:
Los tipos de datos abstractos (TDA) encapsulan datos y funciones que trabajan
con estos datos. Los datos no son visibles para el usuario en un tipo de dato
abstracto y el acceso a los datos es exclusivamente bajo el llamado a funciones,
tambin llamadas mtodos. As, el tipo de dato abstracto es especificado por los
mtodos, no por los datos. En C++, los tipos de datos abstractos son
representados por clases, las cuales presentan a pequea deficiencia: el dato que
representa el estado de un objeto de este tipo de dato abstracto es visible
(algunas veces no accesible) en la parte prvate de la clase declarada para cada

programa, la clase es reconocida mediante la va#include. Ejemplos de tipos de


datos abstractos son: stack, que, etc. Los TDA por lo general manejan memoria
dinmica, esto es, la asignacin dinmica de memoria es una caracterstica que le
permite al usuario crear tipos de datos y estructuras de cualquier tamao de
acuerdo a las necesidades que se tengan en el programa
Los lenguajes orientados a objetos (LOO) tienen la caracterstica de que no son
lenguajes lineales, sino que se forman de diversas funciones, las cuales son
llamadas en el orden en que el programa mismo las pide o el usuario determina.
Para entender mejor cmo funcionan los lenguajes orientados a objetos, vamos a
introducir un concepto fundamental en las Estructuras de Datos denominado
Abstraccin de Datos y que es parte importante de estos Lenguajes y de la
manera en que funciona la mayora del software comercial de nuestros das.
El concepto de tipo de dato abstracto (TDA, Abstract Data Type), fue propuesto
por primera vez hacia 1974 por John Guttag y otros, pero no fue hasta 1975 que
por primera vez Liskov lo propuso para el lenguaje CLU. El lenguaje Turbo Pascal
fue determinante para la comn aceptacin de los TDA con la introduccin de las
Units, si bien estas no cumplen con las caractersticas bsicas de un tipo de dato
abstracto como por ejemplo la encapsulacin de los datos.
El lenguaje Ada pudo implementar exitosamente los TDAs con sus Packages. Vale
recordar que estos dos ltimos lenguajes soportan formalmente la Programacin
modular. Con mucha frecuencia se utilizan los trminos TDA y Abstraccin de
Datos de manera equivalente, y esto es debido a la similitud e interdependencia
de ambos. Sin embargo, es importante definir por separado los dos conceptos.
Como ya se mencion, los Lenguajes de Programacin Orientados a Objetos son
lenguajes formados por diferentes mtodos o funciones y que son llamados en el
orden en que el programa lo requiere, o el usuario lo desea.
La abstraccin de datos consiste en ocultar las caractersticas de un objeto y
obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro

programa. Esto es similar a una situacin de la vida cotidiana. Cuando yo digo la


palabra perro, usted no necesita que yo le diga lo que hace el perro.
La idea es que los usuarios de un TDA tengan que preocuparse slo por la
interfaz, pero no por la implementacin, ya que esta puede ir cambiando con el
tiempo y, si no existiera encapsulacin, afectar a los programas que usan el dato.
Esto se basa en el concepto de Ocultacin de informacin, una proteccin para el
programa de decisiones de diseo que son objeto de cambio.
La solidez de un TDA reposa en la idea de que la implementacin est escondida
al usuario. Solo la interfaz es pblica. Esto significa que el TDA puede ser
implementado de diferentes formas, pero mientras se mantenga consistente con la
interfaz, los programas que lo usan no se ven afectados.
Hay una diferencia, aunque a veces sutil, entre el Tipo de Dato Abstracto y la
Estructura de Datos usada en su implementacin. Por ejemplo, un TDA de una
lista puede ser implementado mediante un Arreglo o una Lista Enlazada o hasta
un rbol binario de bsqueda. Una lista es un Tipo de Dato Abstracto con
operaciones bien definidas (agregar elemento, agregar al final, agregar al
principio, recuperar, eliminar, etc) mientras una lista enlazada es una estructura de
datos basada en punteros o referencias (dependiendo del lenguaje) que puede ser
usada para crear una representacin de una Lista. La Lista Enlazada es
comnmente usada para representar una TDA Lista, y a veces, hasta confundida.
Un ejemplo es la clase Linked List de Java, la cual ofrece una gran cantidad de
mtodos que no corresponden a una Lista Enlazada pura, sino a un fuerte TDA.
De forma similar, un TDA rbol binario de bsqueda puede ser representado de
muchas maneras: rbol binario, rbol AVL, rbol rojo-negro, Arreglo, etc. A pesar
de la implementacin un rbol binario siempre tiene las mismas operaciones
(insertar, eliminar, encontrar, etc.)
Separar la interfaz de la implementacin no siempre significa que el usuario ignora
totalmente la implementacin de la rutina, pero lo suficiente para no depender de

ningn aspecto de la implementacin. Por ejemplo, un TDA puede ser creado


usando un script o cualquiera que pueda ser decompilado (como C).
En la terminologa de Lenguaje Orientado a Objeto, un TDA es una clase; una
instancia de un TDA o clase, es un objeto. Adems es utilizado constantemente
por programadores de computadoras.

Ejemplos de TDAS.

Usar el TDA permite aprovechar el nivel de abstraccin en el desarrollo de un


problema. Por ejemplo: Resolver el problema de verificacin si la suma y
multiplicacin de 2nmeros complejos producen el mismo nmero complejo.
Solucin en segundo lenguaje:
INICIO

//

Programa

principal

X,

COMPLEJOA

Booleano

CREAR_COMPLEJO(3,-5) Y = CREAR_COMPLEJO(8,-3)A = VERIFICAR1(X,Y)Si


A = verdadero entonces imprimir Son iguales la suma y la multiplicacin Sino
imprimir NO son iguales la suma y la multiplicacin FsiFINfuncin VERIFICAR1
(X,Y: COMPLEJO): Booleano // Funcin Verificar1Z1,Z2 COMPLEJOZ1 = SUMAR
(X,Y)Z2 = MULTIPLICAR (X,Y)RETORNAR IGUAL (Z1,Z2)f. funcin funcin
VERIFICAR2 (X,Y: COMPLEJO): Booleano // Funcin Verificar2 RETORNAR
IGUAL (SUMAR (X,Y), MULTIPLICAR (X,Y) )f. funcin Se provee al lector de otra
versin funcin VERIFICAR2 que realiza la misma operacin sobre los nmeros
complejos. Note que VERIFICAR1 no es una operacin del TDA.
Algunos ejemplos del uso de TDAs en programacin son:

Conjuntos: Implementacin de conjuntos con sus operaciones bsicas


(unin, interseccin y diferencia), operaciones de insercin, borrado,
bsqueda...

rboles Binarios de Bsqueda: Implementacin de rboles de elementos,


utilizados para la representacin interna de datos complejos. Aunque
siempre se los toma como un TDA separado son parte de la familia de los
grafos.

Pilas y Colas: Implementacin de los algoritmos FIFO y LIFO.

Grafos: Implementacin de grafos; una serie de vrtices unidos mediante


una serie de arcos o aristas.

1.4 Manejo de Memoria.


La administracin de memoria de una computadora es una tarea fundamental
debido a que la cantidad de memoria es limitada.
El sistema operativo es el encargado de administrar la memoria del sistema y
compartirla entre distintos usuarios y/o aplicaciones.
El RTS (Run Time System) de un lenguaje de programacin administra la memoria
para cada programa en ejecucin.
La ejecucin de un programa requiere que diversos elementos se almacenen en la
memoria:

Cdigo del programa (instrucciones)

Datos

Permanentes

Temporales

Direcciones para controlar de flujo de ejecucin del programa

Memoria esttica y dinmica


A la asignacin de memoria para algunos elementos fijos del programa que es
controlada por el compilador se le llama asignacin de memoria esttica.
A la asignacin y posible recuperacin de memoria durante la ejecucin de un
programa y bajo su control, se le llama asignacin de memoria dinmica.

Memoria Esttica.
Para implementar alguna estructura de datos, primero es necesario tener muy
claro cmo va a ser el manejo de memoria. La diferencia entre estructuras
estticas y dinmicas est en el manejo de memoria.
En la memoria esttica durante la ejecucin del programa el tamao de la
estructura no cambia. La estructura que maneja memoria esttica son los
vectores.
Un vector es una coleccin finita, homognea y ordenada de elementos. Es finita
porque todo arreglo tiene un lmite, homognea porque todos los elementos son
del mismo tipo y ordenada porque se puede determinar cul es el ensimo
elemento.
Un vector tiene dos partes: Componentes e ndices Los componentes hacen
referencia a los elementos que forman el arreglo y los ndices permiten referirse a
los componentes del arreglo en forma individual.
Los arreglos se clasifican en:
- Unidimensionales (vectores o listas)

- Bidimensionales (matrices o tablas)


- Multidimensionales.
Los arreglos tienen localidades de memoria continuas y para determinar el espacio
que deben ocupar, se requiere conocer la posicin inicial del arreglo en la memoria
y el tipo de datos primitivo del que fue declarado, como se aprecia en la siguiente
tabla.
Tipo de dato primitivo

Tamao en Bytes de memoria

byte

char

short

int

float

long

double

Para determinar la direccin fsica de un elemento de un arreglo unidimensional en


la memoria se requiere la siguiente frmula:
Direccin de memoria = Direccin inicial en la memoria + Posicin del arreglo o
ndice * Tamao en bytes del tipo de dato primitivo
Ejemplo. Si tenemos un arreglo de 5 elementos enteros y queremos determinar la
direccin de memoria que ocupa cada uno, tomando en cuenta que la direccin
inicial del arreglo es 1300, el resultado sera es siguiente:

arregl

10

20

30

40

50

o
ndice 0

direcc

13

13

13

13

13

in

00

04

08

12

16

arreglo[0] = 1300 + 0 * 4 = 1300


arreglo[1] = 1300 + 1 * 4 = 1304
arreglo[2] = 1300 + 2 * 4 = 1308
arreglo[3] = 1300 + 3 * 4 = 1312
arreglo[4] = 1300 + 4 * 4 = 1316
Ejercicio. Encontrar las direcciones de memoria fsica que ocupara cada uno de
los elementos de un vector de n elementos de tipo flotante si conocemos que la
direccin inicial del mismo es la 1345.
Ejercicio. Encontrar cual es la direccin fsica que ocupan los siguientes elementos
A, M, R, H, G y O de un arreglo que contiene el alfabeto en forma ordenada de la
A a la Z y su direccin inicial es la 65.
Ejercicio. Si contamos con dos vectores almacenados en la memoria de n
elementos enteros cada uno y queremos calcular la suma de los vectores,
almacenando el resultado en un tercer vector, encuentre las direcciones de
memoria que ocuparn cada uno de los arreglos si se encuentran en una forma
consecutiva y la direccin inicial del primero es la 30.
Arreglos Bidimensionales.
Un arreglo bidimensional (matriz o tabla), es un conjunto de elementos
homogneos definidos bajo una estructura finita, controlado por dos ndices y su
representacin es por un conjunto de renglones y columnas, en forma de una
malla.

Para determinar la direccin fsica de un elemento de un arreglo bidimensional en


la memoria se puede seguir una de las siguientes formulas:
Por renglones.
Direccin de memoria = Direccin inicial en la memoria + (Numero de columnas
del arreglo * Posicin del arreglo en rengln o ndice de rengln + Posicin del
arreglo en columna o ndice de columna) * Tamao en bytes del tipo de dato
primitivo
Ejemplo. Si tenemos un arreglo de 3 renglones y 3 columnas con elementos
enteros y queremos determinar la direccin de memoria que ocupa cada uno,
tomando en cuenta que la direccin inicial del arreglo es 2700, el resultado sera
es siguiente:

arreglo

direcci

270

270

270

271

271

272

272

272

273

n
0

40

70

70

50

80

80

60

90

90

arreglo[0][0] = 2700 + (3 * 0 + 0) * 4 = 2700


arreglo[0][1] = 2700 + (3 * 0 + 1) * 4 = 2704
arreglo[0][2] = 2700 + (3 * 0 + 2) * 4 = 2708
arreglo[1][0] = 2700 + (3 * 1 + 0) * 4 = 2712
arreglo[1][1] = 2700 + (3 * 1 + 1) * 4 = 2716

arreglo[1][2] = 2700 + (3 * 1 + 2) * 4 = 2720


arreglo[2][0] = 2700 + (3 * 2 + 0) * 4 = 2724
arreglo[2][1] = 2700 + (3 * 2 + 1) * 4 = 2728
arreglo[2][2] = 2700 + (3 * 2 + 2) * 4 = 2732

Ejercicio. Determinar cual es la direccin de memoria fsica que ocupan los


elementos de la diagonal principal de una matriz, si su direccin inicial es 1971.
Ejercicio. Buscar cuales son las direcciones de memoria fsica que ocupan todos
los elementos pares de una matriz, si inicia en la direccin 2001.
Ejercicio. Encontrar cuales son las direcciones de memoria fsica donde se
encuentra el elemento mayor de una matriz, si su direccin inicial es la 2004.
Por columnas.

Direccin de memoria = Direccin inicial en la memoria + (Numero de renglones


del arreglo * Posicin del arreglo en columna o ndice de columna + Posicin del
arreglo en rengln o ndice de rengln) * Tamao en bytes del tipo de dato
primitivo

Ejemplo. Tomamos como base el ejemplo anterior, pero ahora con columnas
quedara de la siguiente manera:

arreglo

direcci

270

271

272

n
0

40

50

60

70

70

80

80

90

90

270

271

272

270

272

273

arreglo[0][0] = 2700 + (3 * 0 + 0) * 4 = 2700


arreglo[1][0] = 2700 + (3 * 0 + 1) * 4 = 2704
arreglo[2][0] = 2700 + (3 * 0 + 2) * 4 = 2708
arreglo[0][1] = 2700 + (3 * 1 + 0) * 4 = 2712
arreglo[1][1] = 2700 + (3 * 1 + 1) * 4 = 2716
arreglo[2][1] = 2700 + (3 * 1 + 2) * 4 = 2720
arreglo[0][2] = 2700 + (3 * 2 + 0) * 4 = 2724
arreglo[1][2] = 2700 + (3 * 2 + 1) * 4 = 2728
arreglo[2][2] = 2700 + (3 * 2 + 2) * 4 = 2732

Ejercicio. Encuentre las direcciones de memoria fsica de los elementos impares


de una matriz, si su direccin inicial es la 1979.
Ejercicio. Determinar cules son las direcciones de memoria donde se encuentran
las vocales de una matriz, si su direccin inicial es la 2312.
Con los arreglos unidimensionales o bidimensionales se pueden desarrollar una
serie de operaciones tales como:
-

Lectura / Escritura.

Asignacin.

Actualizacin:

Insercin.

Eliminacin.

Modificacin.

Ordenamiento.

Bsqueda.

De las operaciones anteriores la insercin, eliminacin y modificacin son


operaciones que solo se aplican a un elemento y no a todos de forma global.

Memoria Dinmica.
En la memoria dinmica durante la ejecucin del programa el tamao de la
estructura puede cambiar.
La memoria dinmica, es el espacio de almacenamiento que solicita una clase o
mtodo en tiempo de ejecucin. De esa manera, a medida que el proceso requiere
de ms espacio se solicita al sistema operativo, sin que el proceso se preocupe
por donde sern asignados los datos, ni que espacios de memoria nos entregara
el sistema operativo.

As como existen estructuras de datos estticas (arreglos), tambin existen


estructuras de datos dinmicas (listas y rboles), estas ltimas son generadas a
partir de un tipo de dato conocido como referencia (direccin de memoria). Para
utilizar las referencias se requiere de un elemento llamado nodo. Dato Dir Nodo
con una referencia Dir Dato Dir Nodo con dos referencias Las estructuras de datos
que usan nodos pueden ser lineales o no lineales, dentro de las lineales se
encuentran las listas simples y dobles y en las no lineales encontramos los
rboles.

1.5 Anlisis de Algoritmos.


El anlisis de algoritmos es una parte importante de la Teora de complejidad
computacional ms amplia, que provee estimaciones tericas para los recursos
que necesita cualquier algoritmo que resuelva un problema computacional dado.
Estas estimaciones resultan ser bastante tiles en la bsqueda de algoritmos
eficientes.

1.5.1 Complejidad en el tiempo.


Una medida que suele ser til conocer es el tiempo de ejecucin de un programa
en funcin de N, lo que denominaremos T(N).
Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano),
o calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por
el tiempo requerido por cada instruccin.
Sencillo pedazo de programa como:
S1; for (int i= 0; i < N; i++) S2;
Requiere:
T(N)= t1 + t2*N
Siendo t1 el tiempo que lleve ejecutar la serie S1 de sentencias, y t2 el que lleve
la serie S2.
Prcticamente todos los programas reales incluyen alguna sentencia condicional,
haciendo que las sentencias efectivamente ejecutadas dependan de los datos
concretos que se le presenten.
Esto hace que ms que un valor T(N) debamos hablar de un rango de valores
Tmin(N) T(N) Tmax(N)
Los extremos son habitualmente conocidos como caso peor y caso mejor.
Entre ambos se hallara algn caso promedio o ms frecuente.
Cualquier frmula T(N) incluye referencias al parmetro N y a una serie de
constantes Ti que dependen de factores externos al algoritmo como pueden ser
la calidad del cdigo generado por el compilador y la velocidad de ejecucin de
instrucciones del ordenador que lo ejecuta.

Dado que es fcil cambiar de compilador y que la potencia de los ordenadores


crece a un ritmo vertiginoso (en la actualidad, se duplica anualmente),
intentaremos analizar los algoritmos con algn nivel de independencia de estos
factores; es decir, buscaremos estimaciones generales ampliamente vlidas.

1.5.2 Complejidad en el espacio


Es la memoria que utiliza un programa para su ejecucin. Lo que implica que la
eficiencia en memoria de un algoritmo lo indica la cantidad de espacio requerido
para ejecutarlo, es decir, el espacio memoria que ocupan todas las variables
propias del algoritmo.
Es la memoria que utiliza un programa para su ejecucin; es decir, el espacio de
memoria que ocupan todas las variables propias del algoritmo.
Esta se divide en Memoria Esttica y Memoria Dinmica.

Memoria esttica. Para calcularla se suma de memoria que ocupan las


variables declaradas en el algoritmo.

Memoria dinmica. Su clculo no es tan simple ya que depende de cada


ejecucin del algoritmo

1.5.3 Eficiencia de algoritmos


Medida del uso de los recursos computacionales requeridos por la ejecucin de un
algoritmo en funcin del tamao de las entradas. La eficiencia de los algoritmos,
principio de invariancia, operaciones con rdenes de complejidad, funciones
annimas, anlisis de algoritmos, el caso especial de los algoritmos recursivos,
anlisis de los algoritmos de ordenacin. T(n) Tiempo empleado para ejecutar el
algoritmo con una entrada de tamao n
Tipos de anlisis
Cmo medimos el tiempo de ejecucin de un algoritmo?
Mejor caso

En condiciones ptimas (no se usa por ser demasiado optimista).


Peor caso
En el peor escenario posible (nos permite acotar el tiempo de ejecucin).
Caso promedio
Caso difcil de caracterizar en la prctica.
Anlisis probabilstico
Asume una distribucin de probabilidad sobre las posibles entradas.
Anlisis amortizado
Tiempo medio de ejecucin por operacin sobre una secuencia de ejecuciones
sucesivas.

UNIDAD II: RECURSIVIDAD.


2.1Definicin
Recurrencia, recursin o recursividad es la forma en la cual se especifica un
proceso basado en su propia definicin. Siendo un poco ms precisos, y para
evitar el aparente crculo sin fin en esta definicin:
Un problema que pueda ser definido en funcin de su tamao, sea este N, pueda
ser dividido en instancias ms pequeas (< N) del mismo problema y se conozca
la solucin explcita a las instancias ms simples, lo que se conoce como casos
base, se puede aplicar induccin sobre las llamadas ms pequeas y suponer que
estas quedan resueltas.
Para que se entienda mejor a continuacin se exponen algunos ejemplos:
Factorial: Se desea calcular (el factorial de, que se define como el producto de
todos los enteros positivos de a). Se puede definir el problema de forma recurrente
como; como es menor que podemos aplicar induccin por lo que disponemos del
resultado. El caso base es que es.

Algoritmo de ordenacin por fusin: Sea v un vector de n elementos, podemos


separar el vector en dos mitades. Estas dos mitades tienen tamao n/2 por lo que
por induccin podemos aplicar la ordenacin en estos dos sub problemas. Una
vez tenemos ambas mitades ordenadas simplemente debemos fusionarlas. El
caso base es ordenar un vector de cero o un elemento, que est trivialmente
ordenado y no hay que hacer nada.

2.2 PROCEDIMIENTOS RECURSIVOS


Un Procedimiento recursivo es aquel que se llama as mismo, solo que no regresa
valor.
Cada mtodo (funcin o procedimiento), tiene ciertas reglas, las cuales se
mencionan a continuacin:
La Funcin Recursiva Debe tener ciertos argumentos llamados valores
base para que esta ya no se refiera a s misma.
El Procedimiento Recursivo es donde Cada vez que la funcin se refiera a
s misma debe estar ms cerca de los valores base.
Propiedades de procedimientos recursivos
Debe existir criterio base para que este se llame a s mismo.
Cada vez que el procedimiento se llame a si mismo debe estar ms cerca
del criterio base.
El Mtodo De Las Tres Preguntas
Se usa para verificar si hay dentro de un programa funciones recursivas, se debe
responder a 3 preguntas.
La

pregunta

caso

base:

Hay salida NO recursiva del procedimiento o funcin y la rutina funciona


correctamente para este caso base?
La
pregunta
llamador

ms

pequeo

Cada llamada al procedimiento o funcin se refiere a un caso ms


pequeo del problema original?

La
Suponiendo

pregunta
que

las

llamadas

caso
recursivas

funcionan

general
correctamente

funciona correctamente todo el procedimiento o funcin?


Escritura de procedimiento y funciones recursivas (pasos a seguir para hacer
programas recursivos).
Recursividad
Se puede utilizar el siguiente mtodo para escribir cualquier rutina recursiva.
Primero obtener una funcin exacta del problema a resolver.
A continuacin, determinar el tamao del problema completo que hay que
resolver, este tamao determina los valores de los parmetros en la
llamada inicial al procedimiento o funcin.
Resolver el caso base en el que el problema puede expresarse no
recursivamente, esto asegura una respuesta afirmativa a la pregunta base.
Por ltimo, resolver el caso general correctamente en trminos de un caso
ms pequeo del mismo problema, es decir una respuesta afirmativa a las
preguntas 2 y 3 del mtodo de las 3 preguntas.
Un ejemplo de caso recursivo es la sucesin de Fibonacci
Es la siguiente sucesin infinita de nmeros naturales:

Esta sucesin la podemos representar de esta manera en java, aplicando la


recursividad

1.2 Ejemplo de Fibonacci en caso recursivo (cdigo en

Una vez ejecutado nos quedara de esta manera el cdigo, en este programa
necesitamos el Fibonacci de un nmero ingresado desde la lnea de cdigo.

1.3 Fibonacci en java ejecutado

A continuacin presentamos el cdigo:


package fibonaccirecursivo;
public class FibonacciRecursivo {
public static void main(String[] args) {
long num=5;

System.out.println("Serie Fibonacci");
System.out.println("El Fibonacci es "+fibo(num));
}
public static long fibo (long num){
if (num==0 || num==1){
return num;
}
else{
return fibo(num-1)+fibo(num-2);
}
}
}
Otro ejemplo el de las torres de Hani
El de torres de Hani primero presentamos el algoritmo de cmo funciona la
sucesin
Entrada: Tres

pilas

de

nmeros origen, auxiliar, destino,

con

la

pila origen ordenada


Salida: La pila destino
1. si origen

entonces

1. mover el disco 1 de pila origen a la pila destino (insertarlo arriba de


la pila destino)
2. terminar

2. si no
1. hanoi(

,origen,destino, auxiliar)

//mover todas las fichas

menos la ms grande (n) a la varilla auxiliar


3. mover disco n a destino

//mover la ficha grande hasta la varilla

final
4. hanoi (auxiliar, origen, destino)

//mover todas las fichas restantes,

1...n1, encima de la ficha grande (n)


5. terminar

Ahora en java

1.4 Programa en java de torres de Hani

Una vez escrito el programa procedemos a la ejecucin

1.5 Ejecucin de las torres de Hani en java

El cdigo del programa


package hanoi;
import java.util.*;
public class Hanoi {

public void Hanoi(int num, int inicio,int temp, int fin)


{
if(num == 1)
{
System.out.print("Moviendo de la torre 1,ala torre 3");

}
else
{
Hanoi(num-1, inicio, fin,temp);
System.out.println("Moviendose de la torre de inicio"+inicio+"ala torre
final"+fin);
Hanoi(num-1, temp,inicio,fin);
}
}
}
Programa principal

package hanoi;
import java.util.Scanner;
public class Principal extends Hanoi{
public static void main(String[] args) {
int n=0;
Scanner leer = new Scanner(System.in);
Hanoi h = new Hanoi();
System.out.println("Ingrese el numero de aros");
n = leer.nextInt();
h.Hanoi(n, 1,2,3);

}
}

2.3 Ejemplos de casos recursivos


Ejemplo: Factorial
Escribe un programa que calcule el factorial (!) de un entero no negativo.
1!= 1
2!= 2 2+1
3!= 6 3*2*1
4!= 24 4*3*2*1
5!= 120 5*4*3*2*1
Solucin recursiva
Aqu podemos ver la secuencia que toma el factorial.
N!

si N = 0 (base)
(N-1) !* N>0 (recursin)

Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de la


construccin. La base no recursiva y es el punto tanto de partida como de
determinacin de la definicin.
Cmo funciona la recursividad?
Si (n>0) Entonces -------

f(n)=1;

else
Si(n>0) Entonces---------
F(4)= = 24
F(4)= 4*6
F(3)= 3*2
F(2)= 2*1

N*f(n-1);

F(1)= 1+1
1

UNIDAD III: ESTRUCTURAS LINEALES


3.1 Pilas
Una pila, es una estructura de datos en la que el ltimo elemento en entrar es el
primero en salir, por lo que tambin se denominan estructuras LIFO (Last In, First
Out) o tambin estructuras lineales con una poltica UEPS (Ultimo en entrar,
primero en salir).
En esta estructura slo se tiene acceso a la cabeza o cima de la pila, tambin solo
se pueden insertar elementos en la pila cuando esta tiene espacio y solo se
pueden extraer elementos de la pila cuando tenga valores.

Operaciones asociadas con la pila


Crear la pila
Ver si la pila esta vaca
Insertar elementos en la pila
Eliminar un elemento de la pila
Vaciar la pila

Representacin grfica de la operacin de una pila

Las operaciones bsicas en una pila son push y pop

- Push me permite insertar un elemento a la pila

- Pop extrae un elemento de la pila

La forma de implementar una pila es a travs de:

- Por medio de un arreglo unidimensional

- A travs de la clase Stack de la java.util.*

- Con una lista de elementos.

3.1.1 Representacin en memoria


Memoria esttica.
Las tcnicas de asignacin de memoria esttica son sencillas. La asignacin de
memoria puede hacerse en tiempo de compilacin y los objetos estn vigentes
desde que comienza la ejecucin del programa hasta que termina. En los
lenguajes que permiten la existencia de subprogramas, y siempre que todos los
objetos de estos subprogramas puedan almacenarse estticamente se aloja en la
memoria esttica un registro de activacin correspondiente a cada uno de los

subprogramas. Estos registros de activacin contendrn las variables locales,


parmetros formales y valor devuelto por la funcin.
Memoria Dinmica
La memoria dinmica es un espacio de almacenamiento que se solicita en tiempo
de ejecucin. De esa manera, a medida que el proceso va necesitando espacio
para ms lneas, va solicitando ms memoria al sistema operativo para guardarlas.
El medio para manejar la memoria que otorga el sistema operativo, es el puntero,
puesto que no podemos saber en tiempo de compilacin dnde nos dar huecos
el sistema operativo (en la memoria de nuestro PC).
Un dato importante es que como tal este tipo de datos se crean y se destruyen
mientras se ejecuta el programa y por lo tanto la estructura de datos se va
dimensionando de forma precisa a los requerimientos del programa, evitndonos
as perder datos o desperdiciar memoria si hubiramos tratado de definirla
cantidad de memoria a utilizar en el momento de compilar el programa. Cuando se
crea un programa en el que es necesario manejar memoria dinmica el sistema
operativo divide el programa en cuatro partes que son: texto, datos (estticos), pila
y una zona libre o heap. En el momento de la ejecucin habr tanto partes libres
como partes asignadas al proceso por lo cual si no se liberan las partes utilizadas
de la memoria y que han quedado inservibles es posible que se agote esta parte
y por lo tanto la fuente de la memoria dinmica. Tambin la pila cambia su tamao
dinmicamente, pero esto no depende del programador sino del sistema operativo.

3.1.2 Operaciones bsicas


Las dos operaciones principales de una pila a aadir elementos a la pila y
tomando elementos de la pila.
La

operacin

de

insercin

agrega

un

elemento

una

pila.

Tomamos un elemento de la pila con una operacin de pop.


La otra operacin principal para llevar a cabo en una pila est viendo el primer
elemento.

La operacin Pop devuelve el primer elemento, pero la operacin tambin se


elimina de la pila. Queremos ver slo el primer elemento sin llegar a eliminar. Esta
operacin se llama ojeada en C#.
La otra operacin principal para llevar a cabo en una pila est viendo el primer
elemento. La operacin Pop devuelve el primer elemento, pero la operacin
tambin se elimina de la pila. Queremos ver slo el primer elemento sin llegar a
eliminar. Esta operacin se llama ojeada en C#.
Insercin (Push)
si sp=mximo entonces
mensaje (overflow)
en caso contrario
sp<-- sp+1
pila[sp]<-- valor

Eliminacin (Pop)

si sp=0 entonces
mensaje (underflow)
en caso contrario
x<--pila[sp]
sp<--sp-1

3.1.3 Aplicaciones
Las operaciones que se presentan en esta aplicacin son las siguientes:
OPERACIN PUSH

Esta operacin sirve para insertar un elemento e en la pila S, lo vamos a escribir


como:
push(S,e)
Despus de hacer esta operacin sucede que:
El elemento en la cima de la pila S ahora es e.

LA OPERACIN POP
Para retirar un elemento de la pila S y asignarlo a una variable del mismo tipo que
el tipo de los elementos de la pila, usaremos la operacin pop escribindola como:
v=pop(S);
En donde v es una variable que almacena el valor del elemento que estaba en la
cima de S. Hacer esta operacin tiene algunas implicaciones:
1. La variable v debe ser del mismo tipo que los elementos almacenados en la
pila.
2. Solamente se puede retirar un elemento de la pila a la vez.
3. Antes de la operacin, e era el elemento en la cima, ahora ya no lo es ms.
El apuntador ``cima'' decrece en una unidad.
LA OPERACIN STACKEMPTY
Esta operacin toma como argumento una estructura del tipo stack (pila) y
devuelve un valor booleano, devuelve un true si la pila est vaca y devuelve un
false si la pila tiene al menos un elemento.
LA OPERACIN STACKTOP
La operacin stacktop(S) devuelve el valor del elemento en la cima de la pila S.
Para hacer esta operacin escribiremos:

v=stacktop(S)
Las implicaciones de usar esta operacin son:
1. Se hace una copia del elemento que est en la cima
2. En realidad se hacen dos operaciones, primero se hace v=pop(S), luego un
push(S,v), porque despus de la operacin stacktop, la pila S queda sin
cambio alguno.

Para ver aplicaciones con pilas, en pseudocdigo queda de la siguiente forma:


// Insercin en Pilas de forma tradicional
principal()
{
// declaracion de variables
top = 0; Pila[10]=0; Dato=0;N=10;
do
{
pedir " de el numero a insertar :";
Leer Dato;
// Verificar si hay lugar en pila
si(top >= N) entonces
{ Desplegar " Pila llena";}
sino
{

pila[top]=Dato;
top = top + 1;

}
preguntar " Desea otra insercion en pila :",

Leer otro;
}while(otro != "No");
}

3.2Colas
La estructura de datos tipo cola consiste en un conjunto ordenado de elementos
del mismo tipo en el que solo podemos introducir elementos en la cola por un
extremo (Cola.Poner) y sacarlos por el extremo contrario (Cola.Sacar). La
estructura cola es del tipo FIFO (First In, First Out), es decir, el primer elemento
que ha entrado en la cola sera el primero en salir.

3.2.1 Representacin en memoria

Las colas, al igual que las pilas, no existen como estructuras de datos estndar en
lenguajes de programacin. Este tipo de estructura de datos se puede representar
mediante el uso de:
Arreglos
Listas
Cuando se implementan con arreglos unidimensionales, es importante definir
tamao mximo para la cola y dos variables auxiliares. Una de ellas para que
almacene la posicin del primer elemento de la cola FRENTE y otra para que gua
la posicin del ltimo elemento de la cola FINAL.
En las figuras, podemos observar que por el frente siempre eliminaremos, ya sea
este al lado izquierdo o derecho e igual siempre aadiremos por el lado del final.

3.2.2 Operaciones bsicas

Inicializar Cola: crear una cola vaca.

Cola Vaca: averiguar si una cola esta vaca.

Cola Llena: averiguar si una cola est llena.

Poner Cola: aadir un elemento en la cola.

Sacar Cola: sacar un elemento de la cola.

Inicializar Cola (Cola)


Funcin: Inicializar una cola en estado vaco.
Entrada: Cola a inicializar.
Salida: Cola inicializada.
Precondiciones: Ninguna.
Postcondiciones: Cola vaca.
Cola Vacia (Cola)

Funcin: Averiguar si la cola esta vaca.


Entrada: Cola a comprobar.
Salida: Valor booleano que indica si la cola esta vaca.
Precondiciones: Ninguna.
Post condiciones: Indica si la cola esta vaca.
Cola Llena (Cola)
Funcin: Averiguar si la cola est llena.
Entrada: Cola a comprobar.
Salida: Valor booleano que indica si la cola est llena.
Precondiciones: Ninguna.
Postcondiciones: Indica si la cola est llena.
Poner Cola (Cola, Nuevo Elemento)
Funcin: Aadir Nuevo Elemento a la cola.
Entrada: Elemento a aadir y cola (Nuevo Elemento, Cola).
Salida: Cola con Nuevo Elemento aadido (Cola).
Precondiciones: Cola no est llena.
Postcondiciones: Cola convenientemente actualizada.
Sacar Cola (Cola, Elemento Sacado)
Funcin: Sacar Elemento Sacado de la cola.

Entrada: Cola (Cola).


Salida: Cola y Elemento Sacado (Cola, Elemento Sacado).
Precondiciones: Cola no est vaca.
Postcondiciones: Cola convenientemente actualizada.

3.2.3Tipos de colas: Cola simple, Cola circular y Colas


dobles.
Cola doble
La bicola o doble cola es un tipo de cola especial que permiten la insercin y
eliminacin de elementos de ambos extremos de la cola. Puede representarse a
partir de un vector y dos ndices, siendo su representacin ms frecuente una lista
circular doblemente enlazada.
Esta estructura es una cola bidimensional en que las inserciones y eliminaciones
se pueden realizar en cualquiera de los dos extremos de la bicola. Grficamente
representamos una bicola de la siguiente manera:

Existen dos variantes de la doble cola:


Doble cola de entrada restringida.
Doble cola de salida restringida.
La primera variante slo acepta inserciones al final de la cola, y la segunda acepta
eliminaciones slo al frente de la cola
Algoritmo de Inicializacin
F < -- 1
A <-- 0
Algoritmo para Insertar
Si A=mximo entonces mensaje (overflow) en caso contrario

A <--A+1
cola[A]<-- valor
Algoritmo para Extraer
Si F&gtA entonces
mensaje (underflow)
en caso contrario
mensaje (frente/atrs)
si frente entonces
x <-- cola[F]
F <-- F+1
en caso contrario
x <-- cola[A]
A <-- A-1

Esta estructura es un conjunto de elementos donde a cada uno de ellos se les


asigna una prioridad, y la forma en que son procesados es la siguiente:
Un elemento de mayor prioridad es procesado al principio.
Dos elementos con la misma prioridad son procesados de acuerdo al orden en
que fueron insertados en la cola.
Algoritmo para Insertar
x <--1
final<--verdadero
para i desde 1 hasta n haz
Si cola[i]&gtprioridad entonces
x <--i
final <--falso
salir
si final entonces

x <--n+1
para i desde n+1 hasta x+1
cola[i] <--prioridad
n <-- n+1
Algoritmo para Extraer
Si cola[1]=0 entonces
mensaje(overflow)
en caso contrario
procesar <--cola[1]
para i desde 2 hasta n haz
cola[i-1] <--cola[1]
n <-- n-1

Las operaciones que nosotros podemos realizar sobre una cola son las siguientes:

Insercin.

Extraccin.

Las inserciones en la cola se llevarn a cabo por atrs de la cola, mientras que las
eliminaciones se realizarn por el frente de la cola (hay que recordar que el
primero en entrar es el primero en salir).
Existen dos variantes de la doble cola: Doble cola de entrada restringida.- Este
tipo de doble cola acepta solamente la insercin de elementos por un extremo;
mientras que puede eliminar por ambos. Doble cola de salida restringida.- Este
tipo de doble cola acepta solamente la eliminacin de elementos por un extremo;
mientras que puede insertar por ambos.

Cola Circular
Una cola circular o anillo es una estructura de datos en la que los elementos estn
de forma circular y cada elemento tiene un sucesor y un predecesor. Los
elementos pueden cosultarse, aadirse y eliminarse unicamente desde la cabeza
del anillo que es una posicin distinguida. Existen dos operaciones de rotaciones,
una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento
sucesor, o el predecesor, respectivamente, de la cabeza actual. Para solucionar el
problema de desperdicio de memoria se implementaron las colas circulares, en las
cuales existe un apuntador desde el ltimo elemento al primero de la cola. La
representacin grfica de esta estructura es la siguiente:

La condicin de vaco en este tipo de cola es que el apuntador F sea igual a cero.
Las condiciones que debemos tener presentes al trabajar con este tipo de
estructura son las siguientes:

Over flow, cuando se realice una insercin.

Under flow, cuando se requiera de una extraccin en la cola.

Vacio

ALGORITMO DE INICIALIZACIN
F < -- 0
A<-- 0
ALGORITMO PARA INSERTAR
Si (F+1=A) (F=1 y A=mximo) entonces
mensaje (overflow)
en caso contrario
inicio
si A=mximo entonces
A<--1
cola[A]<-- valor
en caso contrario
A <--A+1
cola[A]<-- valor
si F=0 entonces
F <-- 1
fin
ALGORITMO PARA EXTRAER
Si F=0 entonces
mensaje (underflow) en caso contrario
x <-- cola[F]
si F=A entonces
F <-- 0
A<-- 0
en caso contrario
si F=mximo entonces

F <--1 en caso contrario F <-- F+1

3.2.4 Aplicaciones.
Las Colas tambin se utilizan en muchas maneras en los sistemas operativos para
planificar el uso de los distintos recursos de la computadora. Uno de estos
recursos es la propia CPU (Unidad Central de Procesamiento).
Si est trabajando en una sistema multiusuario, cuando le dice a la computadora
que ejecute un programa concreto, el sistema operativo aade su peticin a su
"cola de trabajo".
Cuando su peticin llega al frente de la cola, el programa solicitado pasa a
ejecutarse. Igualmente, las colas se utilizan para asignar tiempo a los distintos
usuarios de los dispositivos de entrada/salida (E/S), impresoras, discos, cintas y
dems. El sistema operativo mantiene colas para peticiones de imprimir, leer o
escribir en cada uno de estos dispositivos.

3.3 Listas
Una lista lineal es una estructura en la que las inserciones, supresiones, y la
recuperacin puede ocurrir en cualquier posicin en la lista.
Por lo tanto, cuando la lista es esttica, se puede implementar mediante el uso de
un arreglo lineal Cuando la lista se lleva a cabo o realizado mediante el uso de
una matriz, que es una lista contigua.
Por contiguas, queremos decir que los elementos se colocarn consecutivamente
uno tras otro a partir de alguna direccin, llamada direccin base. La ventaja de
una lista implementada mediante una matriz es que es accesible al azar.
La desventaja de esta lista es que las inserciones y de supresiones requieren
movimiento de las entradas, por lo que es ms costoso. Una lista esttica se
puede implementar utilizando una matriz mediante la asignacin del i-simo
elemento de la lista en la entrada i de la matriz.
Estas son consideradas como los arreglos, dentro de estos tenemos:

Arreglos Unidimensionales: Son aquellos que tienen una sola dimensin,


conocidos tambin como vectores o listas.
Arreglos Bidimensionales: Son aquellos que tienen dos dimensiones. Conocidos
tambin como Matriz o Tabla.

3.3.1 Operaciones bsicas


Las operaciones sobre este tipo de listas son las siguientes:
Aadir un elemento a una lista doblemente enlazada vaca.
Insertar un elemento en la primera posicin de la lista.
Insertar un elemento en la ltima posicin en la lista.
Insertar un elemento a continuacin de un nodo cualquiera de una lista.
Buscar o localizar elementos.
Borrado de elementos.
Eliminar nico elemento de una lista doblemente enlazada
Eliminar el primer elemento de la lista doblemente enlazada.
Eliminar el ltimo elemento de una liara doblemente enlazada.
Eliminar un elemento intermedio de una lista doblemente enlazada.
BUSCAR O LOCALIZAR ELEMENTOS
Para recorrer una lista se proceder de un modo parecido al que se usa con las
listas lineales, pero se tiene que tener encuentra que la lista no siempre tiene que
estar en uno de sus extremos.
LOS PASOS DE LA BSQUEDA SON LOS SIGUIENTES
Retroceder hasta el comienzo de la lista, asignar el valor de la lista
anterior mientras lista anterior no sea NULL.
WHILE (ANTERIOR! = NULL O -999).
Se abre un ciclo en donde al menos la condicin debe de ser que el ndice no sea
NULL.(ciclos pasos repetitivos).

Dentro del bucle (ciclo) asignaremos a la lista el valor del nodo siguiente al actual.

3.3.2 Tipos de listas: Listas simplemente enlazadas, listas


doblemente enlazadas y listas circulares.
Listas simples enlazadas
Es una lista enlazada de nodos, donde cada nodo tiene un nico campo de
enlace. Una variable de referencia contiene una referencia al primer nodo, cada
nodo (excepto el ltimo) enlaza con el nodo siguiente, y el enlace del ltimo nodo
contiene NULL para indicar el final de la lista. Aunque normalmente a la variable
de referencia se la suele llamar top, se le podra llamar como se desee.

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 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 algn lenguaje de muy bajo nivel, XOR-Linking ofrece una va para
implementar listas doblemente enlazadas, usando una sola palabra para ambos
enlaces, aunque esta tcnica no se suele utilizar.
Listas enlazadas circulares
En una lista enlazada circular, el primer y el ltimo nodo estn unidos juntos. Esto
se puede hacer tanto para listas enlazadas simples como para las doblemente
enlazadas. Para recorrer una lista enlazada circular podemos empezar por

cualquier nodo y seguir la lista en cualquier direccin hasta que se regrese hasta
el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden
ser vistas como listas sin comienzo ni fin. Este tipo de listas es el ms usado para
dirigir buffers para ingerir datos, y para visitar todos los nodos de una lista a partir
de uno dado.

Una lista enlazada circular que contiene tres valores enteros


Listas enlazadas simples circulares
Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que
el siguiente nodo del ltimo apunta al primero. Como en una lista enlazada simple,
los nuevos nodos pueden ser solo eficientemente insertados despus de uno que
ya tengamos referenciado. Por esta razn, es usual quedarse con una referencia
solamente al ltimo elemento en una lista enlazada circular simple, esto nos
permite rpidas inserciones al principio, y tambin permite accesos al primer nodo
desde el puntero del ltimo nodo.
Listas enlazadas doblemente circulares
En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares
a los de la lista doblemente enlazada, excepto que el enlace anterior del primer
nodo apunta al ltimo y el enlace siguiente del ltimo nodo, apunta al primero.
Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden
ser hechas desde cualquier punto con acceso a algn nodo cercano. Aunque
estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin,
un puntero de acceso externo puede establecer el nodo apuntado que est en la
cabeza o al nodo cola, y as mantener el orden tan bien como en una lista
doblemente enlazada.

3.3.3 Aplicaciones.

Aplicaciones de las listas enlazadas


Las listas enlazadas son usadas como mdulos para otras muchas estructuras de
datos, tales como pilas, colas y sus variaciones.
El campo de datos de un nodo puede ser otra lista enlazada. Mediante este
mecanismo, podemos construir muchas estructuras de datos enlazadas con listas;
esta prctica tiene su origen en el lenguaje de programacin Lisp, donde las listas
enlazadas son una estructura de datos primaria (aunque no la nica), y ahora es
una caracterstica comn en el estilo de programacin funcional.
A veces, las listas enlazadas son usadas para implementar vectores asociativos, y
estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este
uso de las listas enlazadas; hay mejores formas de implementar stas estructuras,
por ejemplo con rboles binarios de bsqueda equilibrados. Sin embargo, a veces
una lista enlazada es dinmicamente creada fuera de un subconjunto propio de
nodos semejante a un rbol, y son usadas ms eficientemente para recorrer sta
serie de datos. Ventajas
Como muchas opciones en programacin y desarrollo, no existe un nico mtodo
correcto para resolver un problema. Una estructura de lista enlazada puede
trabajar bien en un caso pero causar problemas en otros. He aqu una lista con
algunas de las ventajas ms comunes que implican las estructuras de tipo lista. En
general, teniendo una coleccin dinmica donde los elementos estn siendo
aadidos y eliminados frecuentemente e importa la localizacin de los nuevos
elementos introducidos se incrementa el beneficio de las listas enlazadas.

UNIDAD IV: ESTRUCTURAS NO LINEALES


4.1 rboles

Un rbol es una estructura de datos homognea, dinmica y no lineal, en la que


cada nodo (elemento) puede tener varios nodos posteriores, pero slo puede tener
un nodo anterior.

Un rbol es dinmico porque su estructura puede cambiar durante la


ejecucin de un programa. Y no lineal, ya que cada nodo del rbol puede contener
varios nodos que dependan de l.
La estructura de un rbol se forma de nodos y arcos (lnea que une dos nodos), el
primero de los nodos del rbol recibe el nombre de raz, del cual se desprenden
los nodos interiores y de stos los nodos llamados hoja, que son los nodos que se
encuentran al final del rbol; todos ellos en conjunto forman un rbol.
Adems de comprender el concepto y la estructura de un rbol, debemos tomar en
cuenta otros conceptos bsicos que pueden ser tiles en el momento de construir
o programar un rbol, estos conceptos los clasificaremos en tres rubros:
-

Relacin con otros nodos,

Posicin dentro del rbol y

Tamao del rbol

En relacin con otros nodos:


-

Padre, es el nodo del cual se derivan otros nodos.

Hijo, es el nodo que depende de otro.

Hermano, es el nodo que se encuentra al lado del nodo hijo y que dependen

del mismo nodo padre.


En cuanto a la posicin dentro del rbol:

Raz, es el primero de los nodos y el nico que no contiene un padre.

Hoja, es el nodo que se encuentra al final del rbol.

Interior, es un nodo que no es raz ni hijo y se encuentre ellos.

En relacin a su tamao:
-

Orden, es el nmero potencial de nodos hijos que tiene un nodo

padre (orden 2).


-

Grado, es el nmero mximo de hijos que tiene un nodo (grado 2).


Nivel, es el nmero de arcos que deben ser recorridos para llegar a un

determinado nodo ms uno (nivel 3).


-

Altura, es el nmero de niveles que deben pasar para llegar al final del

rbol o de la ramificacin (altura 3).


-

Peso, es el nmero de nodos del rbol sin contar la raz (peso 6).
Camino, es la serie de nodos que tienes que pasar para llegar hasta

un nodo.
-

Longitud de camino, es el nmero de arcos ms uno que debe cruzar

para llegar a un nodo.


-

Rama, es el camino que se forma desde el nodo raz hasta un nodo

hoja.

4.1.1 Clasificacin de rboles


Los rboles se clasifican de la siguiente manera:
-

rboles binarios.

Distintos

Similares

Equivalentes

Equilibrado

Completo

rboles Multicaminos.

B+

B*

2-4

Un rbol binario es una estructura de datos homognea, dinmica y no lineal en


donde a cada nodo le pueden seguir como mximo dos nodos hijos (que pueden
estar vacos), y cada hijo se designa ya sea como hijo izquierdo o como hijo
derecho.
Un rbol binario es distinto cuando su estructura es diferente a la de otros rboles
binarios.

Un rbol binario es similar cuando su estructura es idntica a la de otros rboles


binarios, pero la informacin que guardan los nodos es diferente entre s.

Un rbol binario es equivalente cuando su estructura e informacin de sus nodos


es idntica a la de otros rboles binarios.

Un rbol binario es equilibrado es aquel que todos sus nodos cumplen con la
propiedad:
altura (subrbol izquierdo) altura (subrbol derecho) <= 1

Ejemplo. Si usamos los rboles anteriores para determinar si son o no


equilibrados.
El primero tiene una altura izquierda de 2 y derecha 1, 2-1 <= 1, la condicin es
verdadera, por lo tanto es un rbol equilibrado.
El segundo tiene una altura izquierda de 2 y derecha 0, 2-0 <= 1, la condicin es
falsa, por lo tanto es un rbol no equilibrado.

Un rbol binario es completo cuando todos sus nodos excepto los del ltimo nivel,
tienen dos hijos y todas las hojas estn en el mismo nivel. Para calcular el nmero
de nodos de un rbol completo se aplica la formula:

Nmero de nodos = 2altura - 1

Ejemplo. La altura de este rbol anterior es 3, aplicando la frmula del nmero de


nodos seria.
Nmero de nodos = 23 1 = 8 1 = 7
Un rbol multicamino es una estructura de datos homognea, dinmica y no
lineal, en donde a cada nodo le pueden seguir una cantidad n de nodos hijos, y
cada hijo se designa por el nmero de hijo que le corresponde.

4.1.2 Operaciones bsicas sobre rboles binarios


Las operaciones que se pueden aplicar a un rbol binario son las siguientes:
-

Creacin de un rbol

Insercin de un nodo nuevo.

Eliminacin de un nodo.

Recorrido del rbol.

Balanceo del rbol.

Salvo que trabajemos con rboles especiales, como los que veremos ms
adelante, las inserciones sern siempre en punteros de nodos hoja o en punteros
libres de nodos rama. Con estas estructuras no es tan fcil generalizar, ya que

existen muchas variedades de rboles. De nuevo tenemos casi el mismo


repertorio de operaciones de las que disponamos con las listas:
Aadir o insertar elementos.
Buscar o localizar elementos.
Borrar elementos.
Moverse a travs del rbol.
Recorrer el rbol completo.
Los algoritmos de insercin y bor
rado dependen en gran medida del tipo de rbol
que estemos implementando, de modo que por ahora los pasaremos por alto y
nos centraremos ms en el modo de recorrer rboles.

4.1.3 Aplicaciones
Un ejemplo de estructura en rbol es el sistema de directorios y ficheros de un
sistema operativo. Aunque en este caso se trata de rboles con nodos de dos
tipos, nodos directorio y nodos archivo, podramos considerar que los nodos hoja
son archivos y los nodos rama son directorios. Otro ejemplo podra ser la tabla de
contenido de un libro, por ejemplo de este mismo manual, dividido en captulos, y
cada uno de ellos en subcaptulos. Aunque el libro sea algo lineal, como una lista,
en el que cada captulo sigue al anterior, tambin es posible acceder a cualquier
punto de l a travs de la tabla de contenido. Tambin se suelen organizar en
forma de rbol los organigramas de mando en empresas o en el ejrcito, y los
rboles genealgicos

Grafos
Es un conjunto de puntos y un conjunto de lneas, cada una de las cuales une un
punto con otro. Los puntos se llaman nodos o vrtices de un grafo y las lneas se
llaman aristas o arcos.

Representacin de grafos
Hay tres maneras de representar un grafo en un programa: mediante matrices,
mediante listas ymediante matrices dispersas.
Representacin mediante matrices:

La forma ms fcil de guardar la

informacin de los nodos es


mediante la utilizacin de un vector que indexe los nodos, de manera que
los arcos entre los nodos se
pueden ver como relaciones entre los ndices. Esta relacin entre ndices
se puede guardar en una
matriz, que llamaremos de adyacencia.

Representacin mediante listas:

En las listas de adyacencia lo que haremos

ser guardar por cada nodo, adems de la informacin que pueda contener el
propio nodo, una lista dinmica con los nodos a los que se puede acceder desde
l. La informacin de los nodos se puede guardar en un vector, al igual que antes,
o en otra lista dinmica.

Representacin mediante matrices dispersas:

Para evitar uno de los problemas

que tenamos con las listas de adyacencia, que era la dificultad de obtener las
relaciones inversas, podemos utilizar las matrices dispersas, que contienen tanta
informacin como las matrices de adyacencia, pero, en principio, no ocupan tanta
memoria como las matrices, ya que al igual que en las listas de adyacencia, slo
representaremos aquellos enlaces que existen en el grafo

Operaciones bsicas
Insertar vrtice
La operacin de insercin de un nuevo vrtice es una operacin muy sencilla,
nicamente consiste en aadir una nueva entrada en la tabla de vrtices
(estructura de datos que almacena los vrtices) para el nuevo nodo. A partir de
ese momento el grafo tendr un vrtice ms, inicialmente aislado, ya que ningna
arista llegar a l
Insertar arista
Esta operacin es tambin muy sencilla. Cuando se inserte una nueva arista en el
grafo, habr que aadir un nuevo nodo a la lista de adyacencia (lista que
almacena los nodos a los que un vrtice puede acceder mediante una arista) del
nodo origen, as si se aade la arista (A,C), se deber incluir en la lista de
adyacencia de A el vrtice C como nuevo destino.
Eliminar vrtice
Esta operacin es inversa a la insercin de vrtice. En este caso el procedimiento
a realizar es la eliminacin de la tabla de vrtices del vrtice en s. A continuacin
habr que eliminar las aristas que tuviesen al vrtice borrado como origen o
destino.
Eliminar arista
Mediante esta operacin se borra un arco del grafo. Para llevar a cabo esta accin
es necesario eliminar de la lista de adyacencia del nodo origen el nodo
correspondiente al nodo destino.
Otras operaciones

Las operaciones adicionales que puede incluir un grafo son muy variadas. Adems
de las clsicas de bsqueda de un elemento o recorrido del grafo, tambin
podemos encontrarnos con ejecucin de algoritmos que busquen caminos ms
cortos entre dos vrtices, o recorridos del grafo que ejecuten alguna operacin
sobre todos los vrtices visitados, por citar algunas operaciones de las ms
usuales.

2.

METODOS DE ORDENAMIENTO

Algoritmos de Ordenamiento Internos


Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una
secuencia especifica, la cual puede ser de dos formas distintas:
-

Ascendente (menor a mayor) o

Descendente (mayor a menor).

Los mtodos de ordenacin se clasifican en dos categoras:


-

Ordenacin interna (de arreglos) y

Ordenacin externa (de archivos).

La ordenacin interna o de arreglos, recibe este nombre ya que los elementos o


componentes del arreglo se encuentran en la memoria principal de la
computadora.
Los mtodos de ordenacin interna a su vez se clasifican en:
-

Mtodos directos (n2) y

Mtodos logartmicos (n * log n).

Los mtodos directos, son los ms simples y fciles de entender, son eficientes
cuando se trata de una cantidad de datos pequea. Los mtodos logartmicos, son
ms complejos, difciles de entender y son eficientes en grandes cantidades de
datos.
Los mtodos directos ms conocidos son:
-

Ordenacin por intercambio.

Ordenacin por insercin.

Ordenacin por seleccin.

Algoritmos de ordenamiento por intercambio.


La ordenacin por intercambio consiste en comparar dos elementos del arreglo y
determinar si existe un intercambio entre ellos, para esto debe definirse el tipo de
ordenamiento que se quiere ya sea ascendente o descendente.
Los algoritmos de ordenacin directa por intercambio que se analizaran son:
-

El mtodo de la burbuja.

El mtodo quicksort.

El mtodo shellsort.

Burbuja.

El mtodo de ordenacin por intercambio directo o mtodo de la burbuja, es el


ms simple y consiste en comparar dos elementos adyacentes para determinar si
se realiza un intercambio entre los mismos, esto en caso de que el primero sea
mayor que el segundo (forma ascendente) o el caso de que el primero sea menor
que el segundo (forma descendente).
El primer procedimiento del mtodo de la burbuja es:
1.

Generar un ciclo que inicie desde uno hasta el nmero de elementos del
arreglo.

2.

Generar un segundo ciclo dentro del anterior que inicie desde cero hasta el
nmero de elementos del arreglo menos dos.

3.

Dentro del segundo ciclo debe existir una comparacin que determina el
tipo de ordenamiento (ascendente o descendente) entre el primer elemento
(posicin generado por el segundo ciclo) y el segundo elemento (el que
le sigue), si la respuesta a la condicin es verdadera se realiza un
intercambio entre los dos elementos.

4.

Para realizar el intercambio se genera un almacenamiento temporal, el cual


guarda el dato del primer elemento, el segundo elemento toma el lugar del
primero y en el lugar del segundo se coloca lo que contiene el
almacenamiento temporal.

Una vez que los ciclos terminan la estructura debe quedar ordenada de forma
ascendente o descendente, pero este procedimiento es considerado como el pero
de los casos ya que si el nmero de elementos de la estructura es de 100, se
tienen que realizar 9900 comparaciones entes de terminar la ejecucin del
mtodo.
Un segundo procedimiento del mtodo de la burbuja es:

1.

Generar un ciclo que inicie desde cero hasta el nmero de elementos


menos dos.

2.

Generar un segundo ciclo desde el valor del ciclo anterior mas uno hasta el
nmero de elementos menos uno;

3.

Dentro del segundo ciclo debe existir una comparacin que determina el
tipo de ordenamiento (ascendente o descendente) entre el primer elemento
(posicin generada por el primer ciclo) y el segundo elemento (posicin
generada por el segundo ciclo), si la respuesta a la condicin es verdadera
se realiza un intercambio entre los dos elementos.

4.

Para realizar el intercambio se genera un almacenamiento temporal, el cual


guarda el dato del primer elemento, el segundo elemento toma el lugar del
primero y en el lugar del segundo se coloca lo que contiene el
almacenamiento temporal.

Una vez que los ciclos terminan la estructura debe quedar ordenada, la diferencia
con el procedimiento anterior radica en el nmero de comparaciones y posibles
intercambios que se presentan, en este segundo procedimiento, es menor ya que
cada pasada que se le da al arreglo se realiza una comparacin menos que en la
pasada anterior.
Un tercer procedimiento del mtodo de la burbuja es el siguiente:
1.

Generar un ciclo que inicie desde uno hasta el nmero de elementos menos
uno.

2.

Generar un segundo ciclo que inicie desde el nmero de elementos menos


uno y mientras que ese valor sea mayor o igual al del ciclo anterior (con
decrementos).

3.

Dentro del segundo ciclo debe existir una comparacin que determina el
tipo de ordenamiento (ascendente o descendente) entre el primer elemento

(posicin generada por el segundo ciclo) y el segundo elemento (posicin


generada por el segundo ciclo menos uno), si la respuesta a la condicin es
verdadera se realiza un intercambio entre los dos elementos.
4.

Para realizar el intercambio se genera un almacenamiento temporal, el cual


guarda el dato del primer elemento, el segundo elemento toma el lugar del
primero y en el lugar del segundo se coloca lo que contiene el
almacenamiento temporal

Este tercer procedimiento es muy similar al anterior con la diferencia que el


elemento que va quedando es su lugar el primero no el ltimo como en el caso
anterior.

Quicksort.
El mtodo de ordenamiento rpido o mtodo quicksort, es una tcnica basada en
otra conocida con el nombre divide y vencers, que permite ordenar una cantidad
de elementos en un tiempo proporcional a n2en el peor de los casos o a n log n en
el mejor de los casos. El algoritmo original es recursivo, como la tcnica en la que
se basa.
La descripcin del algoritmo para el mtodo de ordenamiento quicksort es la
siguiente:
1.

Debe elegir uno de los elementos del arreglo al que llamaremos pivote.

2.

Debe acomodar los elementos del arreglo a cada lado del pivote, de
manera que del lado izquierdo queden todos los menores al pivote y del
lado derecho los mayores al pivote; considere que en este momento, el

pivote ocupa exactamente el lugar que le corresponder en el arreglo


ordenado.
3.

Colocado el pivote en su lugar, el arreglo queda separado en dos


subarreglos, uno formado por los elementos del lado izquierdo del pivote, y
otro por los elementos del lado derecho del pivote.

4.

Repetir este proceso de forma recursiva para cada subarreglo mientras


stos contengan ms de un elemento. Una vez terminado este proceso
todos los elementos estarn ordenados.

Para elegir un pivote se puede aplicar cualquiera de las siguientes tres opciones:
1.

El pivote ser el primer elemento del arreglo,

2.

El pivote ser el elemento que esta a la mitad del arreglo, o

3.

Que el pivote se elija de entre tres elementos del arreglo (cualesquiera), los
cuales se deben comparar para seleccionar el valor intermedio de los tres y
considerarlo como el pivote.

La forma o tcnica de reacomodo de los elementos del lado izquierdo y derecho


del pivote, aplica el siguiente procedimiento que es muy efectivo. Se utilizan dos
ndices: izq, al que llamaremos ndice inicial, y der, al que llamaremos ndice final.
Conociendo estos elementos el algoritmo quedara de la siguiente manera:
1.

Recorrer el arreglo simultneamente con izq y der: por la izquierda


con izq (desde el primer elemento), y por la derecha con der (desde el
ltimo elemento).

2.

Mientras el arreglo en su posicin izq (arreglo[izq]) sea menor que el pivote,


continuamos el movimiento a la derecha.

3.

Mientras el arreglo en su posicin der (arreglo[der]) sea mayor que el


pivote, continuamos el movimiento a la izquierda.

4.

Terminando los movimientos se compara los ndices y si izq es menor o


igual al der, se intercambian los elementos en esas posiciones y las
posiciones se cambian izq a la derecha y der a la izquierda.

5.

Repetir los pasos anteriores hasta que se crucen los ndices (izq sea menor
o igual a der).

6.

El punto en que se cruzan los ndices es la posicin adecuada para colocar


el pivote, porque sabemos que a un lado los elementos son todos menores
y al otro son todos mayores (o habran sido intercambiados).

ShellSort.
El mtodo de ordenacin shellsort es una versin mejorada del mtodo de
ordenacin por insercin directa, que se utiliza cuando el nmero de elementos es
grande. Este mtodo recibe su nombre gracias a su creados Donald L. Shell,
tambin se conoce con el nombre insercin con incrementos decrecientes.
En el mtodo de ordenacin por insercin directa, cada elemento se compara con
los elementos contiguos de su izquierda de uno por uno, para lograr su
ordenamiento; si por ejemplo, el elemento a comparar es el ms pequeo y se
encuentra en la ltima posicin del arreglo, hay que ejecutar muchas
comparaciones antes de colocar el elemento en su lugar de forma definitiva.
El mtodo de ordenacin shellsort mejora el ordenamiento por insercin
comparando elementos separados por un espacio de varias posiciones. Esto

permite que un elemento haga pasos ms grandes hacia la posicin que debe
ocupar. Los pasos mltiples sobre los elementos se hacen con tamaos de
espacio cada vez ms pequeos y el ltimo paso del mtodo es un simple
ordenamiento por insercin directa, pero para entonces, los elementos de arreglo
ya casi estn ordenados.
Para determinar el tamao de los incrementos (saltos) constantes, el primero debe
ser generado a partir del tamao del arreglo entre dos, obteniendo solo su parte
entera de la divisin o redondeando el resultado de la misma, y posteriormente ir
reduciendo a la mitad el incremento en cada repeticin, hasta que el incremento
sea un uno.
El procedimiento para aplicar el algoritmo de shellsort es el siguiente:
1.

Generar un ciclo que se encargue de controlar el tamao que deben tener


los incrementos.
1.

Este ciclo debe iniciar con la divisin del tamao del arreglo entre
dos.

2.

Mientras que el incremento sea mayor a cero debe continuar.

3.

Y el cambio de incremento se elige de entre dos opciones: un uno o


la divisin del incremento anterior entre dos.

2.

Un segundo ciclo dentro del anterior, controla el nmero de comparaciones


que se deben hacer segn el tamao del incremento.
1.

El control de este ciclo debe iniciar con el incremento generado


anteriormente.

2.

Mientras el control del ciclo sea menor que el tamao del arreglo.

3.
3.

El control debe cambiar de uno en uno.

Un tercer ciclo dentro del segundo controla en que momento se detienen


las comparaciones o se hacen los posibles intercambios entre los
elementos.
1.

El control de este ciclo debe iniciar con el valor del ciclo anterior.

2.

Mientras que el control sea mayor o igual al incremento del primer


ciclo y el elemento del arreglo de la posicin del control de este ciclo
menos el incremento, sea mayor que el elemento del arreglo de la
posicin control de este ciclo, realice los intercambios entre estas
posiciones.

3.

Y el control se decremente con el valor del incremento.

Algoritmos de ordenamiento por distribucin.


Los algoritmos de ordenamiento por distribucin, ordenan el arreglo tomando cada
nmero e insertndolo en la posicin que toma su valor, es decir, si se tiene un
cinco se coloca en la posicin cinco del arreglo, algo as como: lo que valgas en
esa posicin te pongo. Esto indica que no se podrn ordenar los arreglos que
tengan valores repetidos y el arreglo necesita el tamao del nmero ms grande
que se encuentre en l.
Lo que debemos hacer cuando se repitan los datos es incrementar la capacidad
de la posicin (urna). Para lograrlo podemos hacer lo siguiente:
1.

Definir un arreglo en el que cada posicin puede ser ocupada por ms de


un elemento (arreglo bidimensional) puede darse la situacin de ser
insuficiente la cantidad de posiciones adicionales o de existir demasiado
desperdicio de memoria.

2.

Definir el tamao de la urna variable a travs del uso de estructuras de


datos como las listas simples enlazadas.

Los algoritmos de ordenamiento por distribucin se clasifican en:


-

CountingSort.

RadixSort.

BucketSort.

Radix
El mtodo de ordenacin radix es un algoritmo que ordena datos procesando sus
elementos de forma individual, segn la posicin que ocupan dentro del dato. Los
datos numricos los por dgitos y los datos alfabticos por letras.
El mtodo radix se clasifica en dos tipos segn el orden en el que procesan los
datos:
-

De derecha a izquierda y

De izquierda a derecha.

Si aplicamos este mtodo solo a enteros, el mtodo se clasificara de la siguiente


manera:
-

El digito menos significativo (LSD, Least Significat Digit) y

El digito ms significativo (MSD, More Significat Digit).

Algoritmos de ordenamiento Externos

Intercalacin
En este mtodo de ordenamiento existen dos archivos con llaves ordenadas,
loscuales se mezclan para formar un solo archivo.La longitud de los archivos
puede ser diferente.El proceso consiste en leer un registro de cada archivo y
compararlos, el menor esalmacenando en el archivo de resultado y el otro se
compara con el siguienteelemento del archivo si existe. El proceso se repite hasta
que alguno de losarchivos quede vaco y los elementos del otro archivo se
almacenan directamenteen el archivo resultado.

Mezcla Directa
Algoritmo de Mezcla Directa:
Dividir una secuencia inicial de datos en dos subcadenas y mezclar elemento a
elemento de forma ordenada.
El proceso se repite hasta que la secuencia inicial queda totalmente ordenada.
Pasos:
1) Se divide la secuencia inicial de datos del fichero a
en dos mitades b y c
2) Se mezclan b y c combinando elementos aislados para formar pares
ordenados
3) La secuencia resultante se almacena en el fichero a y se repiten los pasos 1)
2) para formar cudruplos ordenados.
4) Se repiten los pasos ante
riores para formar octetos ordenados, y assucesivamente.

Mezcla Natural

Es una mejora del algoritmo de mezcla directa puesto que en vez de considerar
tramos de tamao fijo se toman en cuenta para la ordenacin en todo
momentotramos de longitud mxima. Al igual que la mezcla directa se debe hacer
un proceso de partir el archivooriginal para mezclarlo, posteriormente mientras en
el archivo C haya elementos amezclar.

3.

METODOS DE BSQUEDA

Bsqueda secuencial
La bsqueda es el proceso de localizar un registro (elemento) con un valor de
llave particular. La bsqueda termina exitosamente cuando se localiza el registro
que contenga la llave buscada, o termina sin xito, cuando se determina que no
aparece ningn registro con esa llave. Bsqueda secuencial, tambin se le conoce
como bsqueda lineal. Supongamos una coleccin de registros organizados como
una lista lineal. El algoritmo bsico de bsqueda secuencial consiste en empezar
al inicio de la lista e ir a travs de cada registro hasta encontrar la llave indicada
(k), o hasta al final de la lista. La situacin ptima es que el registro buscado sea
el primero en ser examinado. El peor caso es cuando las llaves de todos los n
registros son comparados con k (lo que se busca). El caso promedio es n/2
comparaciones. Este mtodo de bsqueda es muy lento, pero si los datos no
estn en orden es el nico mtodo que puede emplearse para hacer las
bsquedas. Si los valores de la llave no son nicos, para encontrar todos los
registros con una llave particular, se requiere buscar en toda la lista. Mejoras en la
eficiencia de la bsqueda secuencial
1)Muestreo de acceso
Este mtodo consiste en observar que tan frecuentemente se solicita cada registro
y ordenarlos de acuerdo a las probabilidades de acceso detectadas.
2) Movimiento hacia el frente
Este esquema consiste en que la lista de registros se reorganicen dinmicamente.

Con este mtodo, cada vez que bsqueda de una llave sea exitosa, el registro
correspondiente se mueve a la primera posicin de la lista y se recorren una
posicin hacia abajo los que estaban antes que el.
3) Transposicin
Este es otro esquema de reorganizacin dinmica que consiste en que, cada vez
que se lleve a cabo una bsqueda exitosa, el registro correspondiente se
intercambia con el anterior. Con este procedimiento, entre mas accesos tenga el
registro, mas rpidamente avanzara hacia la primera posicin. Comparado con el
mtodo de movimiento al frente, el mtodo requiere mas tiempo de actividad para
reorganizar al conjunto de registros . Una ventaja de mtodo de transposicin es
que no permite que el requerimiento aislado de un registro, cambie de posicin
todo el conjunto de registros. De hecho, un registro debe ganar poco a poco su
derecho a alcanzar el inicio de la lista.
4)Ordenamiento
Una forma de reducir el numero de comparaciones esperadas cuando hay una
significativa frecuencia de bsqueda sin xito es la de ordenar los registros en
base al valor de la llave. Esta tcnica es til cuando la lista es una lista de
excepciones, tales como una lista de decisiones, en cuyo caso la mayora de las
bsquedas no tendrn xito. Con este mtodo una bsqueda sin xito termina
cuando se encuentra el primer valor de la llave mayor que el buscado, en lugar de
la final de la lista.

Bsqueda binaria
La bsqueda binaria es el mtodo ms eficiente para encontrar elementos en un
arreglo ordenado. El proceso comienza 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
bsqueda binaria en el subarray 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.

Bsqueda por funciones de HASH


Es un mtodo de bsqueda que aumenta la velocidad de bsqueda, pero que no
requiere que los elementos estn ordenados. Consiste en asignar a cada
elemento

un

ndice

mediante

una

transformacin

del

elemento.

Esta

correspondencia se realiza mediante una funcin de conversin, llamada funcin


hash. La correspondencia ms sencilla es la identidad, esto es, al nmero 0 se le
asigna el ndice 0, al elemento 1 el ndice 1, y as sucesivamente. Pero si los
nmeros a almacenar son demasiado grandes esta funcin es inservible. Por
ejemplo, se quiere guardar en un array la informacin de los 1000 usuarios de una
empresa, y se elige el nemro de DNI como elemento identificativo. Es inviable
hacer un array de 100.000.000 elementos, sobre todo porque se desaprovecha
demasiado espacio. Por eso, se realiza una transformacin al nmero de DNI para
que nos de un nmero menor, por ejemplo coger las 3 ltimas cifras para guardar
a los empleados en un array de 1000 elementos. Para buscar a uno de ellos,
bastara con realizar la transformacin a su DNI y ver si est o no en el array.

Das könnte Ihnen auch gefallen