Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
UNIDAD 1 Introducción a los Algoritmos y Estructuras de Datos 1.1 Definición de Algoritmo Algoritmo se define como un conjunto de instrucciones que la computadora debe seguir para resolver un problema. La palabra algoritmo se deriva de la traducción al latín del nombre Muhammad Musa Alkhawarizmi, un matemático y astrónomo árabe que en el siglo IX escribió un tratado sobre manipulación de números y ecuaciones. 1.1.1 Características de los Algoritmos • • • • •
Son independientes del lenguaje de programacióna utilizar. Sencillo, los pasos deben ser claros y bien definidos. Precisos, indican claramente el orden de realización paso a paso. Definidos, cada vez que se ejecutan con las mismas entradas se obtiene el mismo resultado. Finitos, tienen un número de pasos finito.
1.2 Modelo de Cascada para el desarrollo de Sistemas La resolución de un problema con una computadora conduce a la escritura de un programa y a su ejecución en la misma. Aunque el proceso de diseñar programas es un proceso creativo, los pasos a seguir se establecen en varios modelos para el desarrollo de sistemas uno de ellos es el modelo de cascada. Este se define como el proceso que se sigue para diseñar, construir, entregar y hacer 1 evolucionar el software, desde la concepción de una idea hasta la entrega y el retiro del sistema . Análisis del Problema
Paso 1: Análisis del problema. Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada.. Para poder definir bien un problema es conveniente responder a las preguntas: ¿Qué cantidad y tipo de datos de entrada se requieren?, ¿Qué cantidad y tipo de salidas se desean? ¿Qué método(s) produce(n) la salida deseada?
Diseño del algoritmo
Paso 2. Diseño del Algoritmo. En esta etapa se define cómo hace el programa la tarea solicitada, es decir, se define el algoritmo.
Codificación
Paso 3. Codificación. Se traduce el algoritmo en un lenguaje de programación apropiado.
Compilación y Ejecución
Paso 4. Compilación y Ejecución. El proceso de compilación consiste en pasar el programa de código fuente a un código ejecutable. La ejecución es “correr” el programa generado en el proceso de compilación.
Depuración
Paso 5. Depuración. Se ejecuta el programa con datos de prueba para detectar y corregir errores en tiempo de ejecución. Paso 6. Documentación. Interna: Comentarios dentro del programa. Externa: Manuales del programador, del usuario, de instalación, etc.
Documentación
Entrega y Mantenimiento
Paso 7. Entrega y Mantenimiento 1 http://www.biblioteca.co.cr/pdf/unidad12-4.pdf
Ing. Alma Leticia Palacios Guerrero
pág. 1 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
1.3 Estrategias para la solución de problemas 2
Cuando se trata de resolver un problema, pueden presentarse varias estrategias para solucionarlo . Las técnicas o estrategias más comunes son: Estrategias de solución directa •
Algoritmos de Solución Forzada: Un algoritmo de este tipo resuelve el problema de la forma mas simple, obvia o directa. Como resultado es posible que el algoritmo haga mas trabajo que una solucióm más sofisticada. Por otra parte, las soluciones forzadas son más fáciles de implementar y por eso algunas veces resultan más eficientes.
•
Algoritmos Codiciosos: Se caracterizan las decisiones que toman se basan en que la busqueda del menor costo en esa parte del problema, pero no toman en cuenta el resto de la solución y en ocasiones no generan soluciones óptimas.
Estrategias de Vuelta Atrás •
Un algoritmo de vuelta atrás, sistemáticamente considera todos los posibles resultados para cada decisión. En este sentido, los algoritmos vuelta atrás son como las soluciones forzadas. Sin embargo, los algoritmos vuelta atrás se distinguen por la forma en que exploran todas las posibles soluciones; en ocasiones estos algoritmos encuentrar que una búsqueda exhaustiva es innecesaria y por lo tanto pueden tener una mejor ejecución.
Estrategias arriba-abajo •
Algoritmos divide y vencerás. Para resolver un problema, este se subdivide en uno o más subproblemas cada uno de los cuales es similar al problema dado. Cada uno de los subproblemas se soluciona en forma independiente y al final las soluciones de todos los subproblemas se combinan para obtener la solución general del problema completo.
Estrategias abajo-arriba •
Programación Dinámica: Para resolver un problema se resuelven una serie de subproblemas. La serie de subproblemas es planeada cuidadosamente de tal forma que cada solución subsecuente se obtiene mediante la combinación de las soluciones de uno o más subproblemas que ya han sido resueltos. Todos las soluciones intermedias se mantienen en una tabla para evitar la duplicidad de esfuerzos.
Estrategias Probabilísticas: •
En los algoritmos probabilísticos existe un elemento de aleatoridad en la forma en que el algoritmo soluciona el problema, se dice que estos métodos son el último recurso debido a que se usan cuando no hay otra técnica conocida que se pueda aplicar. Los métodos probabilísticos se usan cuando el espacio de soluciones es tan grande que una búsqueda exhaustiva no seria factible.
Ing. Alma Leticia Palacios Guerrero
pág. 2 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
1.4 Definición de Estructura de Datos. En el desarrollo de programas, existe una fase previa a la escritura del programa, esta es el diseño del algoritmo que conducirá a la solución del problema, en esta fase también deberá considerarse la estructura de datos que se va a utilizar. El término estructura de datos se refiere a la forma en que la información esta organizada dentro de un programa. La correcta organización de datos puede conducir a algoritmos más simples y más eficientes. Estructura de datos: Conjunto de variables agrupadas y organizadas de cierta forma para representar un comportamiento. 1.4.1 Clasificación de las estructuras de datos Las estructuras de datos según su tamaño en memoria, se clasifican en: Estructuras de datos estáticas: Son aquellas cuyo tamaño en memoria es fijo, por ejemplo, los arreglos. Estructuras de datos dinámicas: Son las estructuras que permiten variar su tamaño en memoria de acuerdo a las necesidades del ambiente, por ejemplo, listas enlazadas. 1.3.1 Abstracción Desde el desarrollo de la informática los programadores han luchado con el problema de la complejidad inherente al software, una de las herramientas utilizadas para resolverlo es la abstracción. Esta se puede definir como la consideración aislada de las cualidades esenciales de un objeto. En otro términos la abstracción es la capacidad para encapsular y aislar la información del diseño y ejecución. 1.4. Tipo Abstracto de Datos (TAD) Un tipo abstracto de datos es un modelo (estructura) con un número de operaciones que afectan a ese modelo. Un TAD es un tipo de datos definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema.
1.4.1 Desarrollo de la Abstracción Al inicio de la informática los programadores introducían la información y datos a través de interruptores, los mnemónicos eran abstracciones diseñadas para ayudar a recordar secuencias de bits, luego, esto mnemónicos se agruparon en macroinstrucciones pasando así al siguiente nivel de abstracción: los lenguajes de alto nivel. Los inicios de la abstracción se dieron al surgir lenguajes como FORTRAN, COBOL y ALGOL60, los cuales suministraban tipos de datos simples; sin embargo, estos datos no siempre se ajustaban al tipo requerido para resolver el problema y no podian sufrir cambios. Posteriormente surgen lenguajes como Pascal, Simula-67 y ALGOL68 en los que existian más tipos de datos y que permitian al programador crear construcciones (arreglos, registros). Con el tiempo aparecieron otros lenguajes de programación con mayor nivel de abstracción que permitieron al programador la creación de estructuras de datos. Hacia 1974, John Guttag propone el concepto de tipo abstracto de datos, el cual constituye el máximo nivel de abstracción.
Ing. Alma Leticia Palacios Guerrero
pág. 3 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
Niveles de Abstracción Tipos Abstractos de Datos
Nivel 3:Tipos de Datos creados por el programador para resolver un problema específico
Estructuras de Datos
Tipos de Datos virtuales (en software)
Tipos de Datos Primitivos
Nivel 1 Tipos de datos proporcionados por un lenguaje de alto nivel.
Nivel 0: Los datos tal como son representados en la computadora (bits)
1.4.1 Diferencia entre Estructura de Datos y Tipo Abstracto de Datos. En los lenguajes como Pascal y C, es posible crear una estructura y funciones para realizar operaciones sobre dicha estructura, pero no es posible asociar la estructura y las funciones como una unidad, o sea no es posible asociarlos como un TAD. Dependiendo del lenguaje en que el TAD se esté implementando recibe un nombre diferente, por ejemplo, en Java y C++ a un TAD se le conoce como clase mientras que en Pascal es una unidad y en ADA es un paquete.
1.4.2. Ventajas de los TAD • • • •
Mejora la representación de la realidad. Mejora la robustez del sistema ya que permite comprobar tipos para evitar errores de tipo en tiempo de ejecución. El conocimiento de los objetos permite optimización de tiempo de compilación. Separa la implementación de la especificación, permitiendo así modificar y mejorar la implementación sin afectar al interfaz público del tipo abstracto de datos.
1.5 Aplicaciones de los algoritmos y estructuras de datos En una primera impresión, podria considerarse que los algoritmos y estructuras de datos no tienen una aplicación práctica. Sin embargo, su conocimiento y correcta aplicación permiten desarrollar programas con mejor aprovechamiento de los recursos del sistema, más rápidos, eficientes, robustos y con una mayor tolerancia a errores. 1.5.1
Aplicaciones de las Estructuras de datos
Los árboles son una estructura de datos fundamental en computación. Por ejemplo, casi todos los sistemas operativos almacenan los archivos en estructuras que son árboles. Una de las aplicaciones más comunes de los grafos es su implementación para encontrar la distancia más corta entre dos puntos; en la vida diaria los encontramos aplicados en rutas áereas, semáforos, redes de computadoras, rompecabezas, inteligencia artificial, etc. Las listas se aplican en la representación de polinomios, resolución de colisiones (hash).
Ing. Alma Leticia Palacios Guerrero
pág. 4 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
Las pilas, este tipo de estructura se emplea en forma interna en la computadora para almacenar el estado de los registros cuando se ejecuta un “brinco” en la ejecución de un programa, también se usan en los compiladores para implementar el analizador sintáctico. Las Colas es la estructura de datos que se usa en algunos sistemas operativos, por ejemplo, UNIX para la administración de procesos y trabajos de impresión.
1.5.2
Aplicaciones de los Algoritmos.
Los algoritmos tienen innumerables aplicaciones, entre estas podemos mencionar algoritmos para la ruta más corta entre dos estaciones del metro, algoritmos para procesamiento de cadenas en analizadores léxicos, algoritmos criptográficos, algoritmos para compresión de datos, algoritmo genéticos, etc. 1.6 Importancia de la investigación de algoritmos De acuerdo a John Bentley, de 1945 a 1985 la velocidad del hardware de supercómputo se incrementó 5 en un factor de 6x10 mientras que las mejoras de los algoritmos para problemas, por ejemplo los 4 5 cálculos en tres dimensiones han sido reducido en un factor de N /60. Para N=64 fue cerca de 3x10 . De esta forma vemos que las mejoras algorítmicas han tenido tanto impacto en los cálculos científicos como los avances logrados en hardware. En el período 1980-1994 la computadora aumenta su velocidad en un orden de 1.5 cada década, en cambio, los avances logrados en el campo de los algoritmos, permiten la solución de problemas de tamaño 200 y hasta 820 veces mayor, respectivamente el equivalente a 15 y 20 años de avance en el hardware. Desde el punto de vista de la duración de su impacto, los nuevos microprocesadores se vuelven obsoletos en 2 a 4 años, mientras que los avances en los algoritmos permanecen por décadas.
1.7 Comparación entre velocidad de ejecución y eficiencia del algoritmo Suponga que para un cierto problema se han desarrollado los algoritmos A y B, cuyo tiempo de ejecución esta dado por las siguientes funciones: TA(n)=100*n 2 TB=2*n
¿Cuál es más eficiente?
Si n<100 B, es más eficiente Si n>=50 A es mucho más eficiente. n=10 TA(n)=100*n 1000 TB(n)=2*n² 2000 Factor B/A 0.2
n=50 5000 5000 1
n=100 10000 20000 2
n=1000 100 000 500 000 5
Tabla 1.1
Ing. Alma Leticia Palacios Guerrero
pág. 5 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
Las siguientes tablas demuestran por qué es mejor tener un algoritmo eficiente que una máquina veloz. Suponga que la primera columna son funciones del tiempo de ejecución de 4 algoritmos diferentes, ejecutados todos en la misma máquina. La segunda y tercer columna muestran la cantidad de elementos que cada algoritmo alcanzaría a procesar en 1000 y 10000 unidades de tiempo. Tiempo de Ejecución T(n)
n para 1000
n para 10000
Factor
unidades de tiempo unidades de tiempo
100n
10
100
10
2
14.14213562
44.72135955
3.16227766
n /2
12.5992105
27.14417617
2.15443469
9.965784285
13.28771238
1.333333333
5n 3
n
2
Tabla 1.2
En la siguiente tabla suponga que un algoritmo toma exactamente T(n) microsegundos para completar los algoritmos de la primera columna. Tiempo de Ejecución T(n)
n=16
n=256
log2n
4µs
8µs
n
16µs
256µs 65.5ms
2
n
25.6µs
n
63
2
65.5ms 10 años Tabla 1.3 n
La tabla 1.4 muestra el tiempo que tardaría el algoritmo con tiempo de ejecución T(n)=2 en una máquina con una velocidad de 0.001 para diferentes valores de n. n
N T(n)= 0.001*2 seg. 1 0.002 10 0.102 20 1048.576 30 1073741.824 35 34359738.368 40 1099511627.776
minutos 0.000 0.002 17.476 17895.697 572662.306 18325193.796
horas 0.000 0.000 0.291 298.262 9544.372 305419.897
dias años 0.000 0.000 0.000 0.000 0.012 0.000 12.428 0.034 397.682 1.090 12725.829 34.865
Tabla 1.4
Ahora ejecutando el mismo algoritmo en una máquina más rápida. N
1 10 20 30 42 43 44 45
T(n)= 0.00001*2n Seg
0.000 0.010 10.486 10737.418 43980465.111 87960930.222 175921860.444 351843720.888
minutos
0.000 0.000 0.175 178.957 733007.752 1466015.504 2932031.007 5864062.015
horas
dias
0.000 0.000 0.000 0.000 0.003 0.000 2.983 0.124 12216.796 509.033 24433.592 1018.066 48867.183 2036.133 97734.367 4072.265
años
0.000 0.000 0.000 0.000 1.395 2.789 5.578 11.157
Tabla 1.5
Ing. Alma Leticia Palacios Guerrero
pág. 6 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducción a los Algoritmos y Estructuras de Datos
Finalmente si se cambia de algoritmo y se ejecuta en una máquina con una velocidad de 0.001. T(n)= 0.001*n3 Seg.
N
minutos
horas
dias
1
0.001
0.000
0.000
0.000
10
1.000
0.017
0.000
0.000
20
8.000
0.133
0.002
0.000
30
27.000
0.450
0.008
0.000
40
64.000
1.067
0.018
0.001
50
125.000
2.083
0.035
0.001
60
216.000
3.600
0.060
0.003
70
343.000
5.717
0.095
0.004
80
512.000
8.533
0.142
0.006
90
729.000
12.150
0.203
0.008
100
1000.000
16.666 Tabla 1.6
0.277
0.011
n
Cray-1 Fortran1
Tandy Corporation2
3n3nanosegundos 19500000n nanosegundos
10
3µseg
0.2 seg
100
3mseg
2.0 seg
1000
3 seg
20 seg
2500
50 seg
50.0 seg
10000
49 min
3.2 min
1,000,000
95 años
5.4 horas
Tabla 1.7
1. Cray Research Inc. 2. Tandy Corporation.
Ing. Alma Leticia Palacios Guerrero
pág. 7 de 8
Algoritmos y Estructuras de Datos
Unidad I Introducci贸n a los Algoritmos y Estructuras de Datos
Referencias 1.- http://www.biblioteca.co.cr/pdf/unidad12-4.pdf 2.- http://www.brpreiss.com/books/opus5/html/page438.html#SECTION0015200000000000000000 Tabla 1.7 Tomada del libro Programming Pearls por Jon Bentley ed. 2000.
Ing. Alma Leticia Palacios Guerrero
p谩g. 8 de 8