You are on page 1of 32

CAPITULO 5

ESTRUCTURAS DE DATOS Y ALGORITMOS


ii Sistemas Informáticos
Resumen
Antes de introducirse en el mundo de la programación de computadoras es necesario
el estudio y entendimiento de las estructuras de datos y los algoritmos.

Las estructuras de datos y los algoritmos repercuten de forma directa en el


almacenamiento y tratamiento de la información, tanto desde el punto de vista físico
como funcional. Por tanto, el amplísimo ámbito de la programación se construye sobre
los cimientos de dichos algoritmos y estructuras de datos, de ahí la sobresaliente
importancia de su conocimiento previo.

Sistemas Informáticos iii


iv Sistemas Informáticos
Tabla de Contenidos
1. Introducción...................................................................................................... 1
2. Tipos de datos.................................................................................................. 2
2.1. Datos de tipo entero................................................................................ 2
2.2. Datos de tipo real .................................................................................... 3
2.3. Datos de tipo lógico................................................................................. 3
2.4. Datos de tipo carácter ............................................................................. 4
2.5. Datos de tipo enumerado........................................................................ 4
2.6. Datos de tipo subrango ........................................................................... 5
3. Estructuras de datos ........................................................................................ 6
3.1. Arrays...................................................................................................... 6
3.2. Cadena de caracteres............................................................................. 7
3.3. Registros ................................................................................................. 8
3.4. Listas....................................................................................................... 9
3.5. Árboles .................................................................................................... 9
4. Algoritmos ...................................................................................................... 11
4.1. Definición de algoritmo.......................................................................... 11
4.2. Representación de algoritmos .............................................................. 12
4.2.1 Pseudocódigo ................................................................................... 12
4.2.2 Organigramas ................................................................................... 13
4.2.3 Diagramas de Nassi-Schneiderman.................................................. 14
4.3. Acciones y estructuras de control ......................................................... 15
4.3.1 Asignaciones ..................................................................................... 15
4.3.2 Entradas/salidas................................................................................ 15
4.3.3 Decisiones......................................................................................... 15
4.3.4 Ciclos ................................................................................................ 16
4.3.5 Procedimientos ................................................................................. 17
4.4. Recursividad ......................................................................................... 18
4.5. Proceso de creación de un programa ................................................... 20
4.5.1 Planteamiento del problema ............................................................. 20
4.5.2 Representación de los datos............................................................. 20
4.5.3 Diseño de un algoritmo ..................................................................... 20
4.5.4 Diseño descendente ......................................................................... 21
4.5.5 Comprobación y optimización de algoritmos..................................... 22
5. Conclusiones.................................................................................................. 23
6. Bibliografía ..................................................................................................... 24

Sistemas Informáticos v
vi Sistemas Informáticos
Tabla de ilustraciones
Figura 1.- Representación de un array de 7 elementos ................................................. 7
Figura 2.- Representación de un array rectangular de 3x5 elementos........................... 7
Figura 3.- Representación de una lista........................................................................... 9
Figura 4.- Representación de un árbol ......................................................................... 10
Figura 5.- Pseudocódigo............................................................................................... 12
Figura 6.- Símbología de un organigrama .................................................................... 13
Figura 7.- Organigrama de un programa ...................................................................... 13
Figura 8.- Simbología de los diagramas de Nassi-Schneiderman................................ 14
Figura 9.- Diagrama de Nassi-Schneiderman de un programa .................................... 14
Figura 10.- Estructuras de diferentes ciclos ................................................................. 17
Figura 11.- Árbol de diseño descendente..................................................................... 21

Sistemas Informáticos vii


viii Sistemas Informáticos
1. Introducción
Las computadoras son máquinas para el tratamiento automático de la información.
Esta información no se almacena ni se representa al azar, sino que debe organizarse
o estructurarse en forma adecuada para obtener un rendimiento razonable en su
memorización, tratamiento y recuperación. El tratamiento de la información se debe
realizar de un modo sistemático. La resolución de cualquier problema conlleva el
encontrar un método de resolución expresado con la suficiente precisión para poder
ser descompuesto en acciones realizables por la computadora (esto es lo que se
conoce como algoritmos).

-1-
Estructuras de datos y algoritmos

2. Tipos de datos
Se denomina dato a cualquier objeto manipulable por la computadora. Un dato puede
ser un carácter leído de un teclado, información almacenada en un disco, un número
que se encuentra en memoria principal, etc.

Cuando utilizamos una computadora para resolver un problema debemos hacer


una abstracción de ésta y de las magnitudes que influyen en ella. Dichas magnitudes
deben ser representadas por datos. La representación de una magnitud como un dato
se puede entender como una aplicación que hace corresponder un dato a cada valor
de la magnitud.

Esta correspondencia debe definir el conjunto de valores de la magnitud. Es


conveniente, además, que sea unívoca, es decir, que a dos valores de magnitud
distintos les asocie datos distintos. Para que se pueda operar con los datos es
necesario que existan unas operaciones internas en el conjunto de datos, que sean
semejantes a las operaciones usuales en el conjunto de magnitudes. Dichas
operaciones deben cumplir que la imagen de la transformación del resultado de una
operación en el conjunto de magnitudes sea igual al resultado de las operaciones
correspondientes en el conjunto de datos sobre las imágenes de los operandos.

Para que los resultados obtenidos en el conjunto de datos puedan ser


interpretados es necesario que exista una transformación de éstos al conjunto de
magnitudes.

Se denomina tipo de dato al conjunto de la transformación y de las operaciones y


funciones internas y externas definidas sobre el conjunto de datos.

A continuación se presentan algunos de los tipos de datos básicos más usuales


en informática. No obstante, no todos los tipos de datos anteriores existen en todos los
lenguajes de programación, sino que simplemente sirven de base orientativa debido a
la gran variedad de lenguajes que existe.

2.1. Datos de tipo entero


El tipo entero es una representación del conjunto de los números enteros. La
representación es posible para un subrango de magnitudes enteras centrado en el
n-1
origen: números entre 2 -1 y -2n-1.

Sistemas Informáticos 2
Estructuras de datos y algoritmos

La razón de esta limitación está en la necesidad de utilizar un espacio finito, y fijo,


para cada dato.
n
El número de datos distintos de tipo entero que se pueden generar es 2 , donde n
es el número de bits que se utiliza en la representación. Por tanto, si se modifica el
número de bits, se obtienen distintos tipos enteros.

Cualquier operación con datos de tipo entero es exacta salvo que se produzcan
desbordamientos.

Ejemplos: x Å 21; y Å -34; z Å 0;

2.2. Datos de tipo real


El tipo de datos real es una representación del conjunto de los números reales.

Esta representación no suele permitir el almacenamiento de números muy


grandes o muy pequeños, lo que conlleva que se produzcan desbordamientos
(overflows) o agotamiento (underflows). La limitación del número de bits usados para
representar la mantisa provoca una falta de precisión en la representación. Esto es
debido a que la aplicación que define al tipo real no es unívoca. Es decir, cada dato de
tipo real es la imagen de un conjunto infinito de números reales, concretamente
representa a un intervalo de la recta real.

En cada operación pueden producirse errores por falta de precisión en la


representación (errores de redondeo), que se acumulan durante todo el proceso de
cálculo.

Ejemplos: y Å 4,56000987000001; x Å 23,236666666666666667;

2.3. Datos de tipo lógico


Los datos de tipo lógico representan valores lógicos o booleanos. Pueden tomar
uno de entre dos valores: verdadero o falso (abreviadamente V, F o 0,1)

3 Sistemas Informáticos
Estructuras de datos y algoritmos

Sobre los valores lógicos pueden actuar los llamados operadores lógicos. Los
operadores lógicos son: Y, O y NO (en inglés AND, OR y NOT).

En algunos lenguajes de programación hay definidos sobre los datos de tipo


lógico otros operadores booleanos, como son: NO-Y, NO-O y NO-exclusivo (en inglés
NAN, NOR y XOR).

Un caso particularmente importante de valor de tipo lógico es el obtenido como


resultado de una operación de relación sobre datos de un tipo para el que existe una
relación de orden. Una relación es una expresión formada por dos operandos
pertenecientes a un mismo tipo ordenado y un operador de relación. El resultado de
una operación de relación es el valor lógico verdadero si la relación expresada es
cierta, y falso en caso contrario.

2.4. Datos de tipo carácter


Los datos de tipo carácter representan elementos individuales de conjuntos finitos y
ordenados de caracteres. El conjunto de caracteres representado depende de la
computadora. Uno de los conjuntos más usuales es el ASCII.

No hay ninguna operación interna sobre datos de tipo carácter (salvo la


asignación). Normalmente existen funciones de conversión de tipo, como por ejemplo
la que asocia a cada dato de tipo carácter un valor entero, que indica su posición en el
código.

Ejemplos: x Å ‘a’; y Å ’4’;

2.5. Datos de tipo enumerado


Los datos de tipo enumerado se definen explícitamente dando un conjunto finito de
valores. Al contrario de los tipos vistos anteriormente, no es un tipo normalizado.
Puede haber muchos tipos de datos enumerados distintos dentro de un programa en
un lenguaje determinado.

Sistemas Informáticos 4
Estructuras de datos y algoritmos

Los datos vistos en las secciones anteriores son usualmente tratados por la
computadora a nivel hardware. Mientras que el tipo de datos enumerado y el tipo de
datos subrango sólo son interpretados por el software.

Internamente los datos de tipo enumerado se almacenan como valores enteros. A


cada valor del tipo se le asocia un entero consecutivo, comenzando por cero.

Ejemplo: x Å { azul(0) , rojo(1) , verde(2) , amarillo(3) };

2.6. Datos de tipo subrango


El tipo subrango se define a partir del tipo entero, carácter o de un tipo enumerado.
Un dato de tipo subrango puede tomar determinados valores del tipo original, a partir
del cual se ha definido el subrango, entre un mínimo y un máximo. Con datos de tipo
subrango se pueden realizar las operaciones definidas para el tipo original.

5 Sistemas Informáticos
Estructuras de datos y algoritmos

3. Estructuras de datos
Los tipos de datos vistos en el apartado anterior se suelen denominar elementales, ya
que se pueden utilizar para construir tipos de datos más elaborados. Una estructura
de datos o tipo de dato estructurado es un tipo de dato construido a partir de otros
tipos de datos.

Un dato de tipo estructurado está compuesto por una serie de datos de tipos
elementales y alguna relación existente entre ellos.

Una estructura de datos se dice que es homogénea cuando todos los datos
elementales que la forman son del mismo tipo. En caso contrario se dice que la
estructura es heterogénea.

Siempre que se utilice un dato en un programa debe estar determinado su tipo,


para que el traductor sepa cómo debe tratarlo y almacenarlo. En el caso de datos de
tipos elementales, el tipo del dato determina el espacio que se usa en memoria. Esto
puede no ocurrir si el dato es de un tipo estructurado. Algunos tipos estructurados
(listas y árboles) se declaran sin especificar el número de componentes que van a
tener. Durante la ejecución del programa la estructura de datos puede ir creciendo; es
decir, ocupando más memoria. Si se necesitase más memoria de la disponible en el
programa, éste terminaría por error. Una estructura de datos que es gestionada de
esta forma se dice que es dinámica, ya que la memoria que necesita se asigna
dinámicamente. Por el contrario una estructura de datos que siempre ocupa el mismo
espacio se dice que es estática. Los tipos de datos más empleados son: arrays,
cadena de caracteres, registros, listas y árboles.

3.1. Arrays
El array es la estructura de datos más usual. Existe en todos los lenguajes de
programación.

Un array es una estructura de datos formada por una cantidad fija de datos de un
mismo tipo, cada uno de los cuales tiene asociado uno o más índices que determinan
de forma unívoca la posición del dato en el array. Para cada combinación posible de
valores de índices existe uno y sólo un dato del tipo constituyente, o elemento del
array.

Sistemas Informáticos 6
Estructuras de datos y algoritmos

En la siguiente ilustración se representa un array como una matriz de un solo


índice donde se pueden almacenar valores de 1 a 7. Es una estructura de celdas.

Figura 1.- Representación de un array de 7 elementos

En la siguiente figura se representa un array rectangular. Cada elemento de esta


matriz está especificado por un par ordenado de números, el valor de los dos índices.

Figura 2.- Representación de un array rectangular de 3x5 elementos

En general, al número de índices del array se le denomina número de


dimensiones del array. La dimensión de la formación está dada por los valores
máximos de los índices, y el número total de elementos es el producto de estos
valores máximos.

3.2. Cadena de caracteres


Una cadena de caracteres (String) es una estructura de datos formada por una
secuencia de caracteres. En una variable de tipo cadena se puede almacenar una
palabra, una frase, una matrícula de un coche, una temperatura, etc. Las constantes
de este tipo se escriben normalmente entre comillas.

Ejemplo: x Å “hola qué tal”;

7 Sistemas Informáticos
Estructuras de datos y algoritmos

Sobre datos de tipo cadena de caracteres se pueden realizar, entre otras, las
siguientes operaciones:

• Concatenación: unión de dos cadenas para formar una sola.

• Extracción de subcadena: extraer un fragmento de una cadena.

• Comparación de cadenas: determinar si dos cadenas son iguales o no.

• Obtención de longitud: obtener el número de elementos que forman la


cadena.

3.3. Registros
Un registro es una estructura de datos formada por unión de elementos que contienen
información relativa a un mismo ente. A los elementos que componen el registro se les
denomina campos. Cada campo puede ser de un tipo determinado,
independientemente de los demás campos. Los campos dentro del registro aparecen
en un orden determinado, y se identifican por un nombre. Para definir un registro es
necesario especificar el nombre y tipo de cada campo. Los campos pueden ser de un
tipo estructurado.

Ejemplo:

Class Curso

Integer horas;

String nombre;

String fecha;

String lugar;

Sistemas Informáticos 8
Estructuras de datos y algoritmos

3.4. Listas
Una lista está formada por un número variable de datos (elementos) de un mismo tipo,
ordenados según una secuencia lineal. Cada elemento, salvo el primero, tiene un
predecesor en la lista. Todos los elementos, salvo el último, tienen un sucesor. La lista
es una estructura dinámica.

Podemos definir una lista como una estructura de datos formada por registros de,
al menos, dos campos, en que uno de ellos contiene información que permite localizar
al siguiente registro en la lista según una secuencia dada.

La lista no es direccionable, tan sólo se puede recuperar un elemento accediendo


previamente a los que le anteceden, y por tanto, en cada momento hay sólo un
elemento en disposición de ser procesado.

Un tipo de lista especialmente importante es la pila o lista de LIFO, en que se


añaden y eliminan elementos sólo en un extremo; es decir, no se puede eliminar más
que el elemento que ocupa el primer lugar de la lista en ese momento. Las pilas se
utilizan en hardware y software para almacenar las direcciones de instrucciones desde
las que se hacen llamadas a subrutinas.

Se denominan cola o listas FIFO a una lista en que las inserciones se realizan
sólo en el final y sólo se puede acceder o eliminar en un instante dado el primer
elemento de la lista.

Las listas se memorizan utilizando punteros.

Figura 3.- Representación de una lista

3.5. Árboles
Un árbol es una estructura de datos formada por elementos del mismo tipo, llamados
nodos, relacionados de tal modo que el árbol puede descomponerse en un nodo,

9 Sistemas Informáticos
Estructuras de datos y algoritmos

llamado raíz, y un conjunto finito de objetos de tipo árbol, llamados subárboles del
nodo raíz.

Figura 4.- Representación de un árbol

Se denomina hijo de un nodo a cada uno de los nodos que dependen de él. Se
denomina grado de un nodo al número de subárboles que sustenta. El orden de un
árbol es el mayor de los grados de sus nodos.

Un árbol es una estructura dinámica. Su representación en el interior de una


computadora se realiza utilizando punteros. Cada nodo puede incluir varios punteros:
uno para dirigirse al padre, y cada uno de los restantes para dirigirse a cada uno de los
hijos. Esto permite moverse con gran facilidad dentro del árbol en cualquier dirección,
pero presenta el inconveniente de que el número de punteros para cada nodo no es
fijo y puede ser excesivamente grande. Normalmente se utilizan ciertas técnicas para
solucionar este problema y permitir que todos y cada uno de los nodos tengan un
número de referencias o punteros fijo.

Sistemas Informáticos 10
Estructuras de datos y algoritmos

4. Algoritmos
Para solucionar un problema real es necesario encontrar un método de resolución del
problema, y posteriormente descomponerlo en acciones sencillas, que la computadora
sea capaz de realizar. De ello se encargan los algoritmos.

4.1. Definición de algoritmo


Para que un procedimiento pueda ser implantado en una computadora, o en otra
máquina capaz de interpretar instrucciones, debe cumplir determinados requisitos:

• El procedimiento debe estar compuesto de acciones bien definidas.

• El procedimiento debe estar formado por una secuencia finita de


operaciones.

• El procedimiento debe acabar en un tiempo finito.

Un procedimiento o método de solución, para resolver un problema, que cumpla


estos requisitos se dice que es un algoritmo que resuelve ese problema.

Se puede definir algoritmo como un procedimiento no ambiguo que resuelve un


problema. Un procedimiento es una secuencia de operaciones bien definidas, cada
una de las cuales requiere una cantidad finita de memoria y se realiza en un tiempo
finito.

Normalmente interesa, no sólo encontrar un algoritmo, sino que éste sea


suficientemente “bueno”. La calidad de un algoritmo se mide, básicamente, por dos
factores:

• El tiempo que se necesita para ejecutarlo.

• Los recursos que se necesitan para implantar el algoritmo.

Por tanto es necesario, una vez diseñado el primer algoritmo, realizar una
evaluación del mismo. Si se decide que éste no es eficiente, será necesario o bien
diseñar uno nuevo, o bien optimizar el original.

11 Sistemas Informáticos
Estructuras de datos y algoritmos

4.2. Representación de algoritmos


Hay diferentes métodos para representar los algoritmos. Por supuesto, un método
consiste narrar o enunciar el algoritmo. Para facilitar esta descripción es frecuente
utilizar un lenguaje de descripción de algoritmos o pseudocódigo. Existen otros
procedimientos de representación que utilizan gráficas o diagramas. Entre estos
últimos cabe destacar los organigramas o diagramas de flujo y los diagramas de
Chapin o diagramas de Nassi-Schneiderman.

4.2.1 Pseudocódigo

No hay reglas fijas para la representación narrativa de algoritmos. No obstante para


describir algoritmos está muy extendido el uso de las estructuras de control del
lenguaje Pascal entre otros. En este caso, como el objetivo no es escribir un programa
para ser ejecutado por una computadora, no hay reglas sintácticas escritas, el interés
se centra en la secuencia de instrucciones. Este tipo de descripción se denomina
pseudocódigo. La utilización de pseudocódigo presenta las ventajas de ser más
compacto que un organigrama, ser más fácil de escribir, y ser más fácil de transcribir a
un lenguaje de programación.

Ejemplo:

Figura 5.- Pseudocódigo

Sistemas Informáticos 12
Estructuras de datos y algoritmos

4.2.2 Organigramas

Los organigramas son herramientas gráficas para representar algoritmos. Se les


conoce también como diagramas de flujo. Un organigrama está compuesto por una
serie de símbolos unidos por flechas. Los símbolos representan acciones y las flechas
el orden de realización de las acciones.

Figura 6.- Símbología de un organigrama

Figura 7.- Organigrama de un programa

13 Sistemas Informáticos
Estructuras de datos y algoritmos

4.2.3 Diagramas de Nassi-Schneiderman

Los diagramas de Nassi-Schneiderman tienen la ventaja de adecuarse a las


técnicas de programación estructurada. Además, estos organigramas tienen otras
ventajas respecto a los organigramas clásicos, como son

• Se leen de arriba abajo, al igual que un programa estructurado.

• Permiten el uso de técnicas de diseño descendente

• Favorecen la partición de los programas en módulos pequeños.

• Resaltan más las partes generales.

Figura 8.- Simbología de los diagramas de Nassi-Schneiderman

Figura 9.- Diagrama de Nassi-Schneiderman de un programa

Sistemas Informáticos 14
Estructuras de datos y algoritmos

4.3. Acciones y estructuras de control


A continuación se verán las distintas acciones que pueden utilizarse en un algoritmo o
en un programa y las estructuras que se pueden usar para controlar el orden de
realización de éstas.

4.3.1 Asignaciones

Una asignación consiste en la evaluación de una expresión y en el almacenamiento


de su valor en una variable. Este tipo de sentencias se ejecutan siempre
secuencialmente; es decir, a continuación de la asignación se realiza siempre la
acción siguiente del programa.

Ejemplo:

x Å 56;

y Å x;

4.3.2 Entradas/salidas

Las operaciones de entrada/salida se utilizan para que el programa intercambie


información con un medio externo. En una operación de entrada o lectura, el
programa asigna a una variable un valor almacenado en un soporte masivo o
generado por un periférico. En una operación de salida o escritura el programa
transfiere a un dispositivo de memoria masiva, o a un periférico, el valor de una
variable. Como ejemplos típicos se pueden destacar la lectura de los caracteres
introducidos por teclado y la salida de caracteres generados por un programa en la
pantalla.

4.3.3 Decisiones

Las decisiones son acciones de control de flujo. Permiten modificar el orden en que
se realizan otras acciones. Una decisión posee siempre un argumento, que
normalmente debe ser una expresión lógica. Dependiendo del valor de la expresión
lógica se ejecutan las acciones que están en uno u otro camino, a partir de la decisión.
Una decisión permite, por tanto, bifurcar en dos caminos el flujo de acciones.

15 Sistemas Informáticos
Estructuras de datos y algoritmos

Ejemplo: programa que devuelve el máximo de dos números a y b:

Si ( a > b ) {

devolver a ;

FIN ;

Si no {

devolver b ;

FIN ;

4.3.4 Ciclos

Un ciclo es una estructura de control que indica la repetición de un segmento de


programa. El ciclo puede ser repetitivo, en cuyo caso el segmento se repite un
número fijo de veces. En este tipo de ciclos existe una variable de control de ciclo a la
que automáticamente se le asignan valores sucesivos durante la ejecución del ciclo.

En un ciclo repetitivo se debe especificar siempre el valor inicial y final que toma el
contador del ciclo, y el incremento a aplicar en cada iteración, si éste es distinto a uno.

Otra estructura de control usual es el ciclo condicional, en el que un segmento


de programa se repite mientras (ciclo while) se cumpla una condición o hasta que
(ciclo until) se deje cumplir una condición.

Sistemas Informáticos 16
Estructuras de datos y algoritmos

Figura 10.- Estructuras de diferentes ciclos

Ejemplo:

límite Å 45 ;

contador Å leer_de_teclado () ;

mientras ( contador < límite )

contador Å contador + 1 ;

imprimir_por_pantalla ( contador ) ;

FIN ;

4.3.5 Procedimientos

Un procedimiento o subrutina es un fragmento del programa que realiza una tarea


concreta, y recibe un nombre por el que puede ser llamado. Puede tener una serie de
variables denominadas argumentos que permiten el paso de información entre el
programa y el procedimiento.

17 Sistemas Informáticos
Estructuras de datos y algoritmos

El uso de procedimientos evita la duplicación de grupos de sentencias en


diferentes partes del programa y facilita la construcción y comprensión de los
programas, ya que es más fácil diseñar y poner a punto un segmento de programa
pequeño que uno grande.

Ejemplo: procedimiento que suma dos números enteros:

Sumar (entero a, entero b)

entero resultado Å a + b;

devolver resultado;

Utilización del procedimiento dentro de un programa:

Mientras ( x < 1000 )

acumulado Å Sumar ( x , 4 )

devolver acumulado;

4.4. Recursividad
El concepto de recursividad, en cualquiera de los ámbitos a los que se aplica, hace
referencia a la definición de una entidad en función de sí misma. La recursividad
probablemente no está muy bien vista en algunos campos como la lingüística, pero es
una herramienta muy útil y potente en programación.

La recursividad puede verse también como el proceso de resolver un problema


largo reduciéndolo a uno o más subproblemas que son idénticos en su estructura al

Sistemas Informáticos 18
Estructuras de datos y algoritmos

problema original y, de algún modo, más simples de resolver. Una vez que se realiza
la subdivisión original, se usa la misma técnica de descomposición para dividir cada
uno de esos subproblemas en otros todavía más simples. Finalmente, los
subproblemas se hacen tan simples que se pueden resolver sin más subdivisiones y la
solución final obtiene reensamblando los componentes resueltos.

La recursividad está basada en la utilización de procedimientos, y en una técnica


de resolución aplicable a problemas con estructura recursiva.

En términos del lenguaje de programación, supone utilizar un procedimiento que


se va a llamar a sí mismo, para resolver parte del problema.

La solución recursiva no es nunca la única posible. No obstante, es la solución


natural del problema y, por tanto, la más clara.

Si al resolver el problema es necesario utilizar pilas, el uso de procedimientos


recursivos puede ser conveniente. En caso contrario, normalmente es desaconsejable,
pues una solución recursiva es más lenta que una solución en ciclo.

Ejemplo: cálculo recursivo del factorial de un número:

Factorial (entero n)

Si (n es_igual_a 0)

devolver 1;

Si no

devolver ( n * Factorial (n-1) );

Fin

19 Sistemas Informáticos
Estructuras de datos y algoritmos

4.5. Proceso de creación de un programa


La concepción de cualquier programa comienza con el planteamiento del problema.
Cuando se ha adquirido una idea clara y precisa del problema, se debe escoger una
representación para los diferentes datos que intervienen en él. Hecho esto, se puede
pensar en redactar un algoritmo que resuelva el problema. Este algoritmo ha de
depurarse y optimizarse. El paso siguiente es redactar un programa según el algoritmo
encontrado, que habrá de ser igualmente depurado. Por ultimo, se debe optimizar y
documentar el programa.

4.5.1 Planteamiento del problema

Es necesario conocer perfectamente el problema antes de comenzar con su


resolución. Esto es, saber de que información, datos se dispone, cual es su
significado, que valores pueden tomar y que relaciones hay entre ellos. Se deben
detectar omisiones en los datos de partida o ambigüedades en la especificación de los
resultados.

4.5.2 Representación de los datos

Si la representación no es la adecuada, el algoritmo no será bueno. Si el problema a


resolver es complejo, será necesario establecer un proceso de ajuste entre las
estructuras de datos y algoritmos, hasta llegar a una solución aceptable.

4.5.3 Diseño de un algoritmo

Esta es, junto con la fase anterior, la parte más delicada del desarrollo de un
programa. Ambas etapas están, además, íntimamente relacionadas.

Siempre habrá problemas lo suficientemente complejos, como para que la mente


humana no pueda entenderlos en conjunto. Por tanto, hay un límite de complejidad,
por encima del cual es difícil moverse sin ayudas, independientemente de la
experiencia que se tenga.

No obstante, se puede ir descomponiendo el problema a resolver en problemas


cada vez más simples, hasta llega a un nivel que seamos capaces de resolver

Sistemas Informáticos 20
Estructuras de datos y algoritmos

directamente. Ésta es en esencia la idea del diseño descendente, que se tratará a


continuación.

4.5.4 Diseño descendente

El diseño descendente es una técnica natural de desarrollo de algoritmos. Consiste


en comenzar trabajando a nivel abstracto, para ir dividiendo el problema en sus partes
naturales. De esta forma el problema a resolver se descompone en otros más simples,
hasta llegar a problemas suficientemente pequeños como para ser resueltos
directamente.

Usando este método, se van generando soluciones del problema a distintos


niveles de detalle. En cada nivel la solución podrá ser comprobada y depurada, antes
de pasar a resolver los módulos que la forman a un nivel más bajo. El algoritmo
resuelto de esta forma, se puede representar por un árbol en que cada nodo es un
módulo (un problema o acción hipotética). El nodo raíz es el problema de partida. El
algoritmo será correcto si la solución dada a cada nivel es correcta.

El programa podría construirse de abajo a arriba creando primero procedimientos


que resuelvan los módulos de detalle, que una vez comprobados serán usados por
otros procedimientos más generales.

Otra ventaja del diseño descendente es su adaptación a la programación


estructurada. Un programa estructurado puede representarse en forma de árbol.

Figura 11.- Árbol de diseño descendente

21 Sistemas Informáticos
Estructuras de datos y algoritmos

4.5.5 Comprobación y optimización de algoritmos

Un último paso a realizar cuando se desarrolla un algoritmo es comprobar que es


correcto, y que realiza las operaciones que se desean. Para comprobar un algoritmo,
se puede efectuar un seguimiento del mismo. Esto consiste en ejecutar manualmente
las operaciones descritas en el algoritmo, según el orden especificado en el mismo,
anotando el valor que toma cada dato durante el proceso.

Si dos partes del algoritmo son completamente independientes se puede probar el


funcionamiento de cada una de ellas independientemente.

En la resolución de cualquier problema es necesario usar variables, para


almacenar los datos que se han de manejar. Para que el algoritmo sea legible, se
deben especificar en él todas las variables usadas, indicando su tipo y contenido.

La optimización del algoritmo normalmente consiste en buscar uno mejor, para


sustituirlo total o parcialmente. Para realizarlo es necesario realizar una evaluación del
mismo. La evaluación es normalmente una tarea compleja consistente en calcular el
número de sentencias que se habrán de ejecutar.

Sistemas Informáticos 22
Estructuras de datos y algoritmos

5. Conclusiones
Las estructuras de datos y algoritmos constituyen elementos básicos en el
almacenamiento y tratamiento de la información.

El conocimiento y entendimiento del concepto de algoritmo, sus representaciones


y métodos que desembocan en el desarrollo de programas constituyen un paso previo
indispensable para introducirse en el ámbito de la programación.

Han de conocerse y manejarse con facilidad los tipos de datos y las técnicas de
creación, representación y refinamiento de algoritmos para la futura construcción de
programas de calidad.

23 Sistemas Informáticos
Estructuras de datos y algoritmos

6. Bibliografía
• [Prieto et al., 2001] Prieto A., Lloris A. y Torres J.C. - “Introducción a la
informática”. Editorial: Mc Graw Hill.

• [Alcalde et al., 1988] Alcalde Lancharro; García y Peñuelas – “Informática


básica”. Editorial: Mc Graw-Hill.

• [Eguíluz, 1999] Eguíluz Morán, Andoni – “Estructuras de datos y algoritmos”.


Editorial: Mc Graw-Hill.

• [Joyanes, 1996] Joyanes, L. – “Fundamentos de programación. Algoritmos y


estructuras de datos. 2ª edición”. Editorial: Mc Graw-Hill.

Sistemas Informáticos 24