Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Unidad 1 1

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Wird geladen in …3
×

Hier ansehen

1 von 28 Anzeige

Weitere Verwandte Inhalte

Diashows für Sie (18)

Andere mochten auch (20)

Anzeige

Ähnlich wie Unidad 1 1 (20)

Unidad 1 1

  1. 1. Estructura de datos y algoritmos Unidad I Algoritmos Algoritmos de ordenamiento y búsqueda
  2. 2. Problemas, programas, algoritmos y estructuras de datos <ul><li>Problema: Conjunto de hechos o circunstancias que dificultan la consecución de algún fin. </li></ul><ul><li>Algoritmo: Conjunto de reglas finito y no ambigua. </li></ul><ul><li>Estructura de datos: Disposición en memoria de la información. </li></ul><ul><li>Programa: Algoritmos escrito en lenguaje de programación + Estructuras de datos. </li></ul>PROBLEMA PROGRAMA Algoritmos + Estructuras de datos
  3. 3. Algoritmo <ul><li>Secuencia finita de instrucciones. </li></ul><ul><li>Cada instrucción tiene un significado claro. </li></ul><ul><li>Puede ser ejecutada con una cantidad finita de esfuerzo. </li></ul><ul><li>Insume una cantidad de tiempo finita. </li></ul>
  4. 4. Algoritmo Ejemplo: La peregrinación del caballo de ajedrez consiste en su paseo por todas las casillas del tablero sin pasar dos veces por la misma, utilizando sus movimientos: dos casillas horizontales y una vertical o a la inversa. Cuando desde la última casilla podamos pasar a la primera se trata de una &quot;peregrinación cerrada&quot;.
  5. 5. Introducción. <ul><li>Resolución de un problema con una computadora </li></ul><ul><li>No existe una regla precisa para escribir un programa que resuelva un dado problema practico. </li></ul><ul><li>Al menos por ahora escribir programas es en gran medida un arte. Sin embargo con el tiempo se han desarrollado un variedad de conceptos que ayudan a desarrollar estrategias para resolver problemas y comparar a priori la eficiencia de las mismas. </li></ul>
  6. 6. Introducción. <ul><li>Resolución de un problema con una computadora </li></ul><ul><ul><li>Entender el problema </li></ul></ul><ul><ul><li>Analizar el problema </li></ul></ul><ul><ul><li>Diseñar un algoritmo para el problema </li></ul></ul><ul><ul><li>Expresar el algoritmo como un programa </li></ul></ul><ul><ul><li>Ejecutar el programa correctamente </li></ul></ul>
  7. 7. Introducción. <ul><li>Análisis de algoritmos: Determinar los recursos (tiempo, espacio) que consume un algoritmo en la resolución de un problema </li></ul><ul><ul><li>Permite comparar algoritmos con criterios cuantitativos </li></ul></ul><ul><ul><li>Elección de un algoritmo entre varios para resolver un problema </li></ul></ul>
  8. 8. Introducción. <ul><li>Análisis de algoritmos: </li></ul><ul><li>Tiempo de ejecución: </li></ul><ul><ul><li>El tiempo requerido para ejecutar un programa depende de factores como: </li></ul></ul><ul><ul><ul><li>La cantidad de datos a procesar </li></ul></ul></ul><ul><ul><ul><li>La velocidad de la máquina </li></ul></ul></ul><ul><ul><ul><li>La calidad del compilador </li></ul></ul></ul><ul><ul><ul><li>La calidad del programa </li></ul></ul></ul>
  9. 9. Introducción. <ul><li>Análisis de algoritmos - Tiempo de ejecución: </li></ul><ul><ul><li>La cantidad de datos a procesar: para un programa fijo ejecutándose sobre la misma máquina podemos estudiar como se comporta el mismo dependiendo de la cantidad de datos a procesar </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>Supongamos que deseamos ordenar un arreglo, resulta natural pensar que si el arreglo es de 10 elemento se tardará menos en ordenarlo que si es de 10000 elementos, ahora estamos interesados en conocer cual es ese comportamiento. </li></ul></ul></ul>
  10. 10. Introducción. <ul><li>Análisis de algoritmos - Tiempo de ejecución: </li></ul><ul><ul><li>Hay 4 funciones típicas que describen el tiempo de ejecución de los algoritmos </li></ul></ul><ul><ul><ul><li>Lineal </li></ul></ul></ul><ul><ul><ul><li>Logarítmica </li></ul></ul></ul><ul><ul><ul><li>Cuadrática </li></ul></ul></ul><ul><ul><ul><li>Cúbica </li></ul></ul></ul>
  11. 11. Introducción. <ul><li>Análisis de algoritmos - Tiempo de ejecución: </li></ul><ul><ul><li>Una medida que suele ser útil conocer es el tiempo de ejecución de un programa en función de N, lo que denominaremos T(N). La forma más básica de conocer esta función es medir físicamente (ejecutando el programa, reloj en mano), o usando instrucciones del lenguaje que permitan medir el tiempo </li></ul></ul><ul><ul><li>También puede calcularse sobre el código contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instrucción. (volveremos mas adelante) </li></ul></ul>
  12. 12. Estructuras de datos Lineales Arreglos <ul><li>Repasamos </li></ul><ul><li>Un Arreglo o vectore es una manera de manejar gran cantidad de datos de un mismo tipo organizados bajo una misma estructura y con un identificador en común </li></ul><ul><li>Declaración </li></ul><ul><ul><li>tipo nombre [ tamaño ]; </li></ul></ul><ul><li>Acceso a un elemento </li></ul><ul><ul><li>nombre [ índice ] </li></ul></ul><ul><li>índice varía de 0 a tamaño – 1 </li></ul><ul><li>La asignación de arreglos completos, es decir toda la estructura no se encuentra definida, se hace elemento por elemento </li></ul><ul><li>Inicialización </li></ul><ul><ul><li>tipo nombre [ ] = { const , const , .. const }; </li></ul></ul>
  13. 13. Estructuras de datos Lineales Arreglos <ul><li>Realizamos un programa que permita llenar un arreglo de 100 enteros con los números aleatorios y luego lo imprima </li></ul><ul><li>… </li></ul><ul><li>main() </li></ul><ul><li>{ int arr[100]; </li></ul><ul><li>int i; /* indice del array */ </li></ul><ul><li>int in; </li></ul><ul><li>for (i=0;i<100;++i) </li></ul><ul><ul><li>arr[i] = rand(); /* inicialización con valores*/ </li></ul></ul><ul><li>for (i=0;i<100;++i) </li></ul><ul><ul><li>cout <<arr[i]; </li></ul></ul><ul><li>} </li></ul>
  14. 14. Algoritmos de Ordenamiento <ul><li>Sorting - Ordenamiento </li></ul><ul><li>Uno de los problemas fundamentales de la ciencia de la computación es ordenar una lista de objetos. </li></ul><ul><li>Para lograr este objetivo existen distintos algoritmos de ordenamiento. </li></ul><ul><li>Los algoritmos varían en complejidad y en eficiencia. </li></ul>
  15. 15. Algoritmos de Ordenamiento <ul><li>Un algoritmo de ordenamiento tiene como finalidad ubicar los elementos de una lista en determinado orden. </li></ul><ul><li>Por lo tanto ordenar es el proceso de reacomodar los elementos de acuerdo a un orden preestablecido. El ordenamiento generalmente se realiza in-situ es decir sobre la misma estructura intercambiando elementos. </li></ul><ul><li>El objetivo del ordenamiento es facilitar las búsquedas posteriores de los datos. </li></ul><ul><li>En general se realizan ordenamientos sobre estructuras de datos de tipo numéricos, char y string. </li></ul><ul><li>Para los datos tipo string y char el orden es el alfabético. </li></ul><ul><li>Se han realizado distintos algoritmos buscando optimizar el tiempo de ordenamiento. </li></ul>
  16. 16. Algoritmos de Ordenamiento <ul><li>Clasificación de algoritmos de Sorting </li></ul><ul><li>En las ciencias de la computación los algoritmos de ordenamiento se clasificados según: Complejidad computacional. Son aquellos que se clasifican en términos de la eficiencia que tenga determinado algoritmo para organizar una lista de tamaño n. Normalmente un buen comportamiento es aquel en que el número de comparaciones es n log n </li></ul>
  17. 17. Algoritmos de Ordenamiento <ul><li>Clasificación de algoritmos de Sorting </li></ul><ul><li>Uso de memoria: </li></ul><ul><ul><li>Internal Sort, se le llama a cualquier algoritmo que utilice exclusivamente la memoria principal, durante el ordenamiento. Esto asume una “high-speed random acces to all memory”. </li></ul></ul><ul><ul><li>External Sort, se le llama a cualquier algoritmo que utilice memoria externa, como lo podría ser un disco o algún tipo de cinta magnética </li></ul></ul>
  18. 18. Bubble Sort – Algoritmo de la Burbuja: <ul><li>Es el método de ordenamiento más fácil de realizar y más fácil de comprender. Este se considera el más simple y es utilizado a nivel mundial. </li></ul><ul><li>Recibe este nombre porque los valores mas pequeños “flotan” hacia la parte superior del arreglo, como las burbujas en el agua, mientras las mas pesadas (valores mayores) se hunden hacia el fondo del arreglo. </li></ul><ul><li>La técnica consiste en llevar a cabo varias pasadas, en cada pasada se comparan pares de elementos y si están en orden inverso se intercambian de lugar. </li></ul>
  19. 19. Bubble Sort – Algoritmo de la Burbuja: <ul><li>El algoritmo inicia al principio de el conjunto de información a ordenar. </li></ul><ul><li>Compara los primeros dos elementos, y si el segundo es más chico que el primero, los intercambia y luego repite este procedimiento hasta que no hayan ocurrido cambios en la última evaluación. </li></ul><ul><li>El algoritmo realiza esto para cada par de elementos adyacentes, hasta que no tiene más elementos que comparar. Sin embargo este algoritmo es muy ineficiente, y es raramente utilizado, excepto para fines educacionales. </li></ul><ul><li>Una variante de este método de ordenamiento es llamado Shuttle Sort </li></ul>
  20. 20. Bubble Sort – Algoritmo de la Burbuja: <ul><li>A la derecha de la línea los elementos se encuentran ordenados. </li></ul>
  21. 21. Bubble Sort – Algoritmo de la Burbuja: <ul><li>void bubbleSort(int arreglo[], int tamano) //arreglo es el arreglo a ordenar tamaño la cantidad de elementos </li></ul><ul><li>{int i, j, temp; // temp variable auxiliar p / intercambio </li></ul><ul><li>for (i = (tamano - 1); i >= 0; i--) </li></ul><ul><li> { for (j = 1; j <= i; j++) </li></ul><ul><li> { if (arreglo[j-1] > arreglo[j]) </li></ul><ul><li> {temp = arreglo[j-1]; </li></ul><ul><li> arreglo[j-1] = arreglo[j]; </li></ul><ul><li> arreglo[j] = temp;} </li></ul><ul><li> } </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
  22. 22. Insertion Sort – Ordenamiento por inserción <ul><li>Este método de ordenamiento es muy similar al Bubble Sort, con la diferencia que éste es más eficiente ya que reduce las comparaciones entre los elementos. </li></ul><ul><li>Un elemento es comparado con cada elemento anterior, hasta que se encuentra un elemento más pequeño. Es decir, si un elemento contiene un valor menor que todos los elementos anteriores, compara ese elemento con todos los elementos anteriores antes de continuar con la siguiente comparación. </li></ul>
  23. 23. Insertion Sort – Ordenamiento por inserción <ul><li>Aunque éste algoritmo es más eficiente que el Bubble Sort, es ineficiente comparado con otros algoritmos de ordenamiento. Pero indudablemente Insertion Sort es una buena elección de método de ordenamiento para listas pequeñas de 30 elementos o menos. </li></ul><ul><li>Una variante creada de insertion Sort que trabaja eficientemente con listas más grandes es shell Sort </li></ul>
  24. 24. Insertion Sort – Ordenamiento por inserción <ul><li>Veamos un pseudo código </li></ul><ul><li>Funcion insertionSort(arreglo, tamaño) </li></ul><ul><li>Para (i desde 1 hasta tamaño-1 ) </li></ul><ul><ul><li>Aux=arreglo[i]; </li></ul></ul><ul><ul><li>j = i; </li></ul></ul><ul><li>Mientras j>0 ^ arreglo [j-1] > aux </li></ul><ul><li> arreglo[j] = arreglo[j−1]; </li></ul><ul><ul><li>j = j − 1; </li></ul></ul><ul><li>arreglo[j] = aux; </li></ul>
  25. 25. Insertion Sort Ordenamiento por inserción
  26. 26. Shell Sort: <ul><li>Este método de ordenamiento fue propuesto en 1959 por Donald Shell. Mejora al ordenamiento Bubble y el Insertion sort. </li></ul><ul><li>El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones Gap. Esto permite que un elemento haga &quot;pasos más grandes&quot; hacia su posición esperada. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del vector están casi ordenados. </li></ul><ul><li>Aunque este método es ineficiente para grandes cantidades de información. Es uno de los algoritmos más rápidos para ordenar pequeñas cantidades de elementos. </li></ul><ul><li>Otra ventaja de este algoritmo es que requiere pequeñas cantidades de memoria. </li></ul>
  27. 27. Shell Sort: <ul><li>FUNDAMENTO: </li></ul><ul><li>Imaginemos una lista de datos ordenables... por ejemplo, estos enteros:  </li></ul><ul><li>74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30 n=11 (porque hay 11 elementos). Así que k=n/2=11/2=5 </li></ul><ul><li>74 , 14, 21, 44, 38, 97 , 11, 78, 65, 88, 30 </li></ul><ul><li>30 , 14, 21, 44, 38, 74 , 11, 78, 65, 88, 97 </li></ul><ul><li>30, 14 , 21, 44, 38, 74, 11 , 78, 65, 88, 97 </li></ul><ul><li>   </li></ul><ul><li>30, 11 , 21, 44, 38, 74, 14 , 78, 65, 88, 97   </li></ul><ul><li>  </li></ul><ul><li>30, 11, 21 , 44 , 38, 74, 14, 78 , 65 , 88, 97 </li></ul><ul><li>   </li></ul><ul><li>Queda como está y el 38 y 88 también </li></ul>
  28. 28. Shell Sort: <ul><li>Pero de momento, nuestra k valía 5, así que ahora k←k/2=5/2=2 </li></ul><ul><li>  </li></ul><ul><li>30 , 11, 21 , 44, 38 , 74, 14 , 78, 65 , 88, 97 </li></ul><ul><li>14 , 11, 21 , 44, 30 , 74 , 38 , 78, 65 , 88, 97 </li></ul><ul><li>Aplicamos Insertion y queda </li></ul><ul><li>11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97 </li></ul>

×