Estructura de Datos y Algoritmos

July 25, 2017 | Author: Genaro Alberto Gómez Chi | Category: Algorithms, Array Data Structure, Recursion, Computer Program, Programming Language
Share Embed Donate


Short Description

Download Estructura de Datos y Algoritmos...

Description

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

3.

4.

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

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

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

Sistemas Informáticos

-1 y -2n-1.

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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF