E.E.M.

Nº 19
Año 2009

Itinerario Formativo
Asistente en Informática

3er Año

Algoritmos y estructuras de datos
Prof. Alejandro Tourn

Apunte Nº 1

Martes de 13 a 16 horas Carga horaria semanal 3 horas Carga horaria total 115 horas

Alejandro Tourn 2 . Dado un estado inicial y una entrada. los algoritmos reciben una entrada y la transforman en una salida. En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos problemas. que como es ordenada y definida. La importancia de un algoritmo radica en mostrar la manera de llevar a cabo procesos y resolver mecánicamente problemas matemáticos o de otro tipo. un algoritmo (del latín. Este método es a menudo independiente de la computadora y es probable que sea igualmente apropiado para muchos tipos de computadoras y muchos lenguajes de computadora. si no la mayoría. generalmente estamos llevando a cabo un método que se ha inventado para resolver algún problema previamente. son los objetos centrales de estudio para muchos. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. Los algoritmos son los materiales de informática. De este modo se puede seguir y predecir el comportamiento del algoritmo para cualquier entrada posible (salvo algoritmos probabilistas. obteniendo una solución. Algunos ejemplos se encuentran en los instructivos (manuales de usuario). dixit algorithmus y éste a su vez del matemático persa al-Jwarizmi) es una lista bien definida. o el método de Gauss para resolver un Sistema lineal de ecuaciones. ciencias de la computación. y disciplinas relacionadas. como el algoritmo de la división para calcular el cociente de dos números. a partir del seguimiento de esa secuencia de instrucciones. Los algoritmos son objeto de estudio de la algoritmia. ordenada y finita de operaciones que permite hallar la solución a un problema. Al igual que las funciones matemáticas.Algoritmo En matemáticas. el que nosotros debemos estudiar para aprender cómo se está tratando de resolver el problema. Es el método. de las áreas de campo. a través de pasos sucesivos y bien definidos se llega a un estado final. en el programa de computación. finita y definida (formalización de su comportamiento) de instrucciones. los cuales muestran algoritmos para usar el aparato en cuestión o inclusive en las instrucciones que recibe un trabajador por parte de su superior. Sin embargo. También existen ejemplos de índole matemático. debe ser una secuencia ordenada. no da lugar a ambigüedades y puede seguirse su traza. que tiene usualmente una salida distinta). no toda caja negra que convierta una entrada en una salida se puede considerar un algoritmo: para que un algoritmo pueda ser considerado como tal. Cuando escribimos un programa de computadora. comportándose como una caja negra. el algoritmo de Euclides para calcular el máximo común divisor de dos enteros positivos. El término algoritmo se usa en la informática para describir un método problema-solución conveniente para la aplicación en un programa de computadora.

y también son objetos centrales del estudio en la informática. Salida. "También se espera que un algoritmo sea eficaz. Precisión. de esta manera la estructura de los datos. o en algún otro modelo de computación. De esta forma. recíprocamente. o dinámicamente mientras el algoritmo corre. Características de los algoritmos El científico de computación Donald Knuth ofreció una lista de cinco propiedades. aunque similar y obviamente relacionado. en un circuito eléctrico. 2. ya sea en un lenguaje de programación. Estos objetos creados son llamados. "Cada paso de un algoritmo debe estar precisamente definido. no debe confundirse con el concepto de programa. "Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas". Eficacia. los algoritmos complicados pueden usar estructuras de los datos simples.. Los algoritmos simples pueden dar lugar a una estructura de datos complicada y. que son ampliamente aceptadas como requisitos para un algoritmo: 1.El concepto de algoritmo. los algoritmos y estructuras de los datos van siempre de la mano. estrictamente hablando. instrucciones. Mientras el primero es la especificación de un conjunto de pasos (operaciones. Alejandro Tourn 3 . La mayoría de los algoritmos involucran métodos para organizar los datos que intervienen en el cómputo. Estas entradas son tomadas de conjuntos específicos de objetos". "Un algoritmo siempre debe terminar después de un número finito de pasos". "Un algoritmo tiene cero o más entradas: cantidades que le son dadas antes de que el algoritmo comience. en un aparato mecánico. usando papel y lápiz. órdenes. Carácter finito. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. 4. no puede ejecutarse hasta que se implementa.) orientados a la resolución de un problema (método).. Entrada. 5. 3.. susceptible de ser ejecutado (o compilado o interpretado). el segundo es ese conjunto de operaciones especificadas en un determinado lenguaje de programación y para un computador concreto. en el sentido de que todas las operaciones a realizar en un algoritmo deben ser suficientemente básicas como para que en principio puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando lápiz y papel". las operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso". Un algoritmo.

Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución. Implementación. y así sucesivamente. puesto que no está exactamente claro qué significa "precisamente definido". El usar pseudocódigo y diagramas de flujo evita muchas imprecisiones del lenguaje natural. Descripción de alto nivel Dado un conjunto finito C de números. Las descripciones en lenguaje natural tienden a ser confusas y extensas. se selecciona un modelo matemático y se explica el algoritmo de manera verbal.Knuth admite que. Se muestra el algoritmo expresado en un lenguaje de programación específico. dado un conjunto mento x que pertenece al conjunto C. Descripción de alto nivel. Descripción formal. carece de rigor formal. diagramas de flujo y lenguajes de programación entre otros. "de manera rigurosa y no confusa". 2. con excepción de los algoritmos probabilistas. Dichas expresiones son formas más estructuradas para representar algoritmos. pseudocódigo. Para un ejemplo más complejo véase Algoritmo de Euclides. 3. Medios de expresión de un algoritmo Los algoritmos pueden ser expresados de muchas maneras. Se establece el problema. se tiene el problema de encontrar el número más grande. incluyendo al lenguaje natural. aunque su descripción pueda ser intuitivamente clara. no obstante. . La descripción de un algoritmo usualmente se hace en tres niveles: 1. posiblemente con ilustraciones y omitiendo detalles. se pide encontrar m tal que para todo ele- Algoritmos y estructuras de datos – EEM Nº 19 – Prof. o "suficientemente básicas". Sin pérdida de generalidad se puede asumir que dicho conjunto no es vacío y que sus elementos están numerados como Es decir. Alejandro Tourn 4 . Ejemplo de algoritmo El problema consiste en encontrar el máximo de un conjunto de números. se mantienen independientes de un lenguaje de programación específico. A partir del carácter finito y de la salida se deduce que ante una misma situación inicial (o valores de entrada) un algoritmo debe proporcionar siempre el mismo resultado (o salida).

En el caso que un elemento sea mayor que el máximo. Por ejemplo. Descripción formal El algoritmo escrito de una manera más formal. ó en pseudocódigo tendría el siguiente aspecto: Algoritmo Encontrar el máximo de un conjunto función //C es un conjunto no vacío de números// // | C | es el número de elementos de C// para si hasta entonces hacer devolver Sobre la notación: • " " representa la asignación entre dos objetos. luego. significa que el objeto m cambia su valor por el de x • "devolver" termina el algoritmo y devuelve el valor a su derecha (en este caso. se asume que el primer elemento (c 0) es el máximo. Cuando se termina de recorrer la lista.GetLength(0) Dim m As Integer = C(0) Algoritmos y estructuras de datos – EEM Nº 19 – Prof.Para encontrar el elemento máximo. Alejandro Tourn 5 . se asigna su valor al máximo. el máximo de C) Implementación En lenguaje Visual Basic 8 (2005): Public Function max(C As Integer()) As Integer Dim n As Integer = C. se recorre el conjunto y se compara cada valor con el valor del máximo número encontrado hasta ese momento. el máximo número que se ha encontrado es el máximo de todo el conjunto.

• Algoritmos probabilísticos: algunos de los pasos de este tipo de algoritmos están en función de valores pseudoaleatorios • Algoritmos determinísticos: El comportamiento del algoritmo es lineal: cada paso del algoritmo tiene únicamente un paso sucesor y otro ancesor. En la mayoría de los casos la solución no es óptima. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. • Metaheurísticas: encuentran soluciones aproximadas (no óptimas) a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos. Alejandro Tourn 6 . además todas las ramas se ejecutan simultáneamente.For i As Integer = 1 To n If C(i) > m Then m = C(i) End If Next Return m End Function Tipos de algoritmos según su función • • Algoritmo de ordenamiento Algoritmo de búsqueda Técnicas de diseño de algoritmos • Algoritmos voraces (greedy): seleccionan los elementos más prometedores del conjunto de candidatos hasta encontrar una solución. • Algoritmos no determinísticos: El comportamiento del algoritmo tiene forma de árbol y a cada paso del algoritmo puede bifurcarse a cualquier número de pasos inmediatamente posteriores. • Algoritmos paralelos: permiten la división de un problema en subproblemas de forma que se puedan ejecutar de forma simultánea en varios procesadores. • Divide y vencerás: dividen el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos para después unirlas. logrando así la solución al problema completo.

fechas. un programador puede crear un nuevo tipo de dato llamado "Persona" que especifica que el dato interpretado como Persona incluirá un nombre y una fecha de nacimiento. Un tipo de dato puede ser también visto como una limitación impuesta en la interpretación de los datos en un sistema de tipificación. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. aunque lenguajes diferentes pueden usar terminología diferente. describiendo la representación. cadenas alfanuméricas. Casi todos los lenguajes de programación explícitamente incluyen la notación del tipo de datos. Por ejemplo. En un sentido amplio. Alejandro Tourn 7 . La mayor parte de los lenguajes de programación permiten al programador definir tipos de datos adicionales. Esto incluye imponer restricciones en los datos. colores. interpretación y la estructura de los valores u objetos almacenados en la memoria del ordenador. En lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o el programador) algo sobre la clase de datos sobre los que se va a procesar. El sistema de tipificación usa información de los tipos de datos para comprobar la verificación de los programas que acceden o manipulan los datos. Tipo de dato Concepto propio de la informática. normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato. más específicamente de los lenguajes de programación. • Vuelta Atrás (Backtracking): se construye el espacio de soluciones del problema en un árbol que se examina completamente. horas. Tipos de datos comunes son: enteros. aunque también se encuentra relacionado con nociones similares de las matemáticas y la lógica. un tipo de datos define un conjunto de valores y las operaciones sobre estos valores. coches o cualquier cosa que se nos ocurra. como qué valores pueden tomar y qué operaciones se pueden realizar. • Ramificación y acotación: se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones. almacenando las soluciones menos costosas. números de coma flotante (decimales).• Programación dinámica: intenta resolver problemas disminuyendo su coste computacional aumentando el coste espacial.

Por ejemplo. blanco o negro. etc. Un bit o dígito binario puede representar uno de esos dos valores. El número mayor que puede representar depende del tamaño del espacio usado por el dato y la posibilidad (o no) de representar números negativos. en ese Algoritmos y estructuras de datos – EEM Nº 19 – Prof. En el caso de la división. • Numéricos o Entero Un tipo de dato entero en computación es un tipo de dato que puede representar un subconjunto finito de los números enteros. en el binario se usan sólo dos dígitos. si para almacenar un número entero disponemos de 4 bytes de memoria tememos que: 4 Bytes = 4x8 = 32 bits Con 32 bits se pueden representar 232=4294967296 valores: • • Sólo positivos: del 0 al 4294967295 Positivos y negativos: del -2147483648 al 2147483647 Operaciones con enteros: Las típicas operaciones aritméticas: suma. en cualquier dispositivo digital. como verdadero o falso. Basta con asignar uno de esos valores al estado de "apagado" (0). Alejandro Tourn 8 . Con él. multiplicación y división se pueden realizar con datos de tipo entero.Tipos de datos elementales • Binarios o Bit Mientras que en el sistema de numeración decimal se usan diez dígitos. o Byte Es un tipo de dato o un sinónimo en ciertos lenguajes de programación. resta. el resultado podría ser un valor real. podemos representar dos valores cuales quiera. rojo o azul. y el otro al estado de "encendido" (1). 0 ó 1. En C el tipo de datos unsigned char tiene que al menos ser capaz de representar 256 valores distintos. el 0 y el 1. Los tipos de dato entero disponibles y su tamaño dependen del lenguaje de programación usado así como la arquitectura en cuestión. masculino o femenino. El bit es la unidad mínima de almacenamiento empleada en informática. o en la teoría de la información. norte o sur. abierto o cerrado.

caso.2-->3) Real El tipo de dato real define un conjunto de números que pueden ser representados con la notación de coma flotante. En los anteriores ejemplos la coma está fija y sirve para separar la parte entera de la parte fraccionaria. queda muy limitado el número de cantidades a representar y todas ellas deben tener la misma resolución.011 = 0×24 + 1×2³ + 0×2² + 0×2¹ + 1×20 + 0×2-1 + 1×2-2 + 1×2-3 = 9.7510 01001. Otro elemento importante a tener en cuenta en este tipo de datos es la precisión con que pueden representar número con decimales (cuantos decimales se pueden representar). esta característica también está directamente relacionada con la cantidad de memoria disponible para almacenar un valor real. La posición de la coma (coma decimal en base diez) es la que fija la potencia de la base por la que hay que multiplicar el dígito correspondiente. en principio hay dos métodos para hacerlo: • • o El redondeo: Aproximar el valor real al entero más cercano (Ej: 3.8-->3 / 3. el valor de los siguientes números. Al usar la notación en coma fija.37510 La representación anterior recibe el nombre de coma fija. ya que con los 8 bits hemos fijado y reservado 5 para la parte entera y 3 para la fraccionaria.110 = 1×24 + 0×2³ + 1×2² + 0×2¹ + 1×20 + 1×2-1 + 1×2-2 + 0×2-3 = 21. si el resultado se ha de almacenar como entero la parte decimal del resultado deberá ser eliminada. el tipo real está limitado superior e inferiormente según la cantidad de memoria que haya disponible para almacenarlo. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. En el caso anterior no podremos representar números enteros mayores o iguales que 32 (25) ni números más pequeños que 0. Al igual que los números enteros. todos ellos representados con 8 bits: 10101.125 (2-3). § Coma fija Con un sistema numérico posicional es posible representar números reales.2-->3) El truncamiento: Eliminar del valor real la parte decimal (Ej: 3. Por ejemplo. Alejandro Tourn 9 .8-->4 / 3.

aunque también se usa el truncado de decimales. las variables sólo tomarán dos valores discretos: V (verdadero) y F (falso). • Alfanuméricos o Carácter Es un símbolo que representa cada carácter de un lenguaje natural. Una estructura de datos define la organización e interrelación de éstos y un conjunto de operaciones que se pueden realizar sobre ellos. números u otros signos o símbolos). aunque también se pueden denotar como sí y no. Estructura de datos En programación. En general. con un número dado de dígitos representativos se obtiene mayor precisión que con la coma fija.§ Coma flotante es un método de representación de números reales que se puede adaptar al orden de magnitud del valor a representar. usualmente trasladando la coma decimal —mediante un exponente— hacia la posición de la primera cifra significativa del valor. Alejandro Tourn 10 . ó 1 y 0 respectivamente. Así. permite representar un rango mucho mayor de números (determinado por los valores límite que puede tomar el exponente). una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. o Cadena Es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto alfabeto. • Booleanos La lógica binaria trabaja con variables binarias y operaciones lógicas. De esta forma. una cadena de caracteres es una sucesión de caracteres (letras. Debido a esta adaptación. Las operaciones básicas son: Algoritmos y estructuras de datos – EEM Nº 19 – Prof. Un dato elemental es la mínima información que se tiene en un sistema. debido a que el valor de estos dígitos es siempre significativo sea el que sea el orden de magnitud del número a representar. Su uso es especialmente interesante en la informática pues permite trabajar con números decimales en rangos amplios.

la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos. de los elementos pertenecientes a la estructura. adicionar un nuevo valor a la estructura. se suele utilizar el termino array (o arreglo) para referirse de forma genérica a matrices de cualquier número de dimensiones. Existen tres formas de de indexar los elementos de un array: Algoritmos y estructuras de datos – EEM Nº 19 – Prof. aunque para evitar confusiones con el concepto matemático de matriz numérica (que normalmente sólo tiene dos dimensiones). De esta forma. Índices Todo vector se compone de un determinado número de elementos.• • • Alta. encontrar un determinado valor en la estructura para realizar una operación con este valor. dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas. Baja. y pueden tener tantas dimensiones como se desee.. Los vectores o arreglos (array en inglés) de dos o más dimensiones se denominan con frecuencia matrices. array. Alejandro Tourn 11 . borrar un valor de la estructura.. Otras operaciones que se pueden realizar son: • • Ordenamiento. Dichas posiciones son llamadas índice y siempre son correlativos. matriz. Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. Apareo. Estructuras de datos • Vectores (matriz o array) En programación. Búsqueda. arreglo o alineación es un conjunto o agrupación de variables del mismo tipo cuyo acceso se realiza por índices. un vector. Cada elemento es referenciado por la posición que ocupa dentro del vector. en forma SECUENCIAL o BINARIO (siempre y cuando los datos estén ordenados).

A cada uno de esos elementos se le llama campo. Si t1 y t2 son árboles. Un registro se diferencia de un vector en que éste es una colección de datos iguales. La construcción correspondiente en los lenguajes de programación se llama Tipo de datos algebraico. • Indexación base-n (n): Este es un modo versátil de indexación en la que el índice del primer elemento puede ser elegido libremente. todos del mismo tipo. tendrá el indice '0'. • Tipo de datos algebraico En matemáticas discretas es usual introducir definiciones de estructuras recursivas dando los casos de definición y un axioma de clausura indicando que ninguna otra cosa forma parte de lo definido. Los árboles con información en los nodos son todos los valores que se pueden construir con las reglas siguientes. Los árboles son únicamente los valores que se construyen utilizando las reglas 1 y 2. carácter. los árboles con información en los nodos pueden definirse como sigue: Sea T un conjunto. • Indexación base-uno (1): En esta forma de indexación. si el vector tiene 'n' componentes la última tendrá como índice el valor 'n-1'. mientras que en una estructura los elementos que la componen. Estos elementos pueden ser. no tiene porque ser del mismo tipo. real.. es decir. el primer elemento del array tiene el indice '1' y el último tiene el índice 'n' (para un array de 'n' componentes). y x es un elemento de T. o bien datos elementales (entero. aunque podrían serlo. Por ejemplo.t2) es un árbol. Sus reglas de tipo polimórficas fueron introducidas por Robin Milner junto con Algoritmos y estructuras de datos – EEM Nº 19 – Prof. El árbol vacío es un árbol y es representado con la constante AVacio.). 1. En consecuencia. es decir. 3. entonces Nodo(t1. 2. en algunos lenguajes de programación se permite que los índices puedan ser negativos e incluso de cualquier tipo escalar (también cadenas de caracteres). • Registro Un registro.• Indexación base-cero (0): En este modo el primer elemento del vector será la componente cero ('0') del mismo. es un tipo de dato estructurado formado por la unión de varios elementos bajo una misma estructura.. o bien otras estructuras de datos.x. Alejandro Tourn 12 . en programación..

Pseudocódigo Un pseudocódigo (falso lenguaje). con la misma validez semántica. sobre todo en los lenguajes de programación funcionales. que podríamos definir como: lenguaje imperativo. de tercera generación. Definición de estructuras de control Como se había mencionado antes. Es una herramienta ágil para el estudio y diseño de aplicaciones.la definición del lenguaje Standard ML y han sido adoptadas desde entonces en diversos lenguajes de programación. Alejandro Tourn 13 . Por ejemplo. Forma parte de las distintas herramientas de la ingeniería de software. pero sin llegar a la rigidez de sintaxis de estos ni a la fluidez del lenguaje coloquial. normalmente se utiliza en las fases de análisis o diseño de Software. es una serie de normas léxicas y gramaticales parecidas a la mayoría de los lenguajes de programación. instrucciones de programación y palabras clave que definen las estructuras básicas. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación. veamos un ejemplo. según el método de programación estructurada. considere la instrucción "Reemplace el valor de la variable x por el valor de la variable y". varían de un programador a otro. algunas de las posibles sintaxis para indicar lo anterior podrían ser: • • • • asigne a el valor de Algoritmos y estructuras de datos – EEM Nº 19 – Prof. no hay una estructura semántica ni arquitectura estándar. o en el estudio de un algoritmo. El pseudocódigo describe un algoritmo utilizando una mezcla de frases en lenguaje común. cada autor usa su propio pseudocódigo con sus respectivas convenciones. No siendo el pseudocódigo un lenguaje formal. es decir. Su objetivo es permitir que el programador se centre en los aspectos lógicos de la solución a un problema.

Éste es controlado dentro del diagrama de flujo en que se encuentra. que se realiza para entenderlo mejor. estos diagramas utilizan una serie de símbolos con significados especiales. Indica el sentido y trayectoria del proceso de información o tarea. como la psicología cognitiva. Alejandro Tourn 14 . economía y procesos industriales. Se utiliza principalmente en programación. Se usa para representar un evento que ocurre de forma automática y del cual generalmente se sigue una secuencia determinada. Algoritmos y estructuras de datos – EEM Nº 19 – Prof. estandarizados según la norma ISO 5807: • • Flecha. Es el símbolo más comúnmente utilizado. Son la representación gráfica de los pasos de un proceso. Símbolos utilizados Se utilizan los símbolos indicados a continuación. Rectángulo. Se usa para representar un evento o proceso determinado.Diagrama de flujo Diagrama de flujo sencillo con los pasos a seguir Diagrama de flujo que expresa un algoritmo para si una lámpara no funciona. pasando también a partir de estas disciplinas a formar parte fundamental de otras. Son modelos tecnológicos utilizados para comprender los rudimentos de la programación lineal. calcular la raíz cuadrada de un número x Un diagrama de flujo es la forma más tradicional de especificar los detalles algorítmicos de un proceso y constituye la representación gráfica de un proceso multifactorial.

por ejemplo por razones de espacio o simplicidad. Algunos ejemplos: Nombre Pseudocódigo Diagrama de flujo Selectiva si P entonces Instrucciones1 fin si si P entonces Instrucciones1 Selectiva Doble si no Instrucciones2 fin si mientras P hacer Iterativa Instrucciones fin mientras Algoritmos y estructuras de datos – EEM Nº 19 – Prof. etcétera. Una referencia debe darse dentro para distinguirlo de otros. Normalmente el flujo de información entra por arriba y sale por un lado si la condición se cumple o sale por el lado opuesto si la condición no se cumple.• Rombo. La mayoría de las veces se utilizan números en los mismos. El rombo además especifica que hay una bifurcación. Representa un punto de conexión entre procesos. • Círculo. Existen además un sin fin de formas especiales para denotar las entradas. Se utiliza cuando es necesario dividir un diagrama de flujo en varias partes. las salidas. los almacenamientos. Alejandro Tourn 15 . Se utiliza para representar una condición.