1 / 23

Estructura de Datos En C++

Estructura de Datos En C++. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes.

wood
Download Presentation

Estructura de Datos En C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Estructura de Datos En C++ Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48

  2. Objetivo General: Conocerá y manejará las estructuras internas de información Temario: • Conceptos Básicos • La Pila • Colas • Recursión • Listas • Árboles • Ordenamiento • Búsqueda • Administración de Almacenamiento Total a calificar: 110 puntos. 40% Tareas 30% Examen Parcial 30% Examen Final 10% Participación

  3. Material de apoyo: Estructura de Datos con C y C++. YedidyahLangsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College SegundaEdición, Prentice-Hall. Algorithms. ThirdEdition. Parts 1-4, Fundamentals Data StructuresSortingSearching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. ThomsonLearning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html

  4. 7. Ordenamiento • Objetivo: El alumno aprenderá los métodos de ordenación interna y externa más importantes actualmente, así como su eficiencia. • Temario: • Antecedentes generales • Ordenación por intercambio directo (Bubble-sort) • Ordenación por inserción directa (Insertion-sort) • Ordenación por el método Shell • Ordenación por el método Quicksort • Ordenación por intercalación (Merge-sort)

  5. Ordenamiento • El proceso de búsqueda se simplifica cuando los datos a considerar se encuentran ordenados • Un archivo de tamaño n es una secuencia de n elementos r[0], r[1], …, r[n-1]. Cada elemento es un registro. A cada registro r[i]se le asocia una llave k[i]. • Se dice que el archivo se encuentra ordenado por llave si i<jimplica que k[i] precede a k[j]. • Ejemplo: El archivo es el directorio telefónico. Cada entrada en el directorio es un registro. La llave para ordenar es el campo de nombre del registro. • El proceso de ordenamiento puede ocurrir sobre los datos mismos, o sobre apuntadores a los datos (ordenamiento por dirección), esto se realiza cuando resulta muy costoso mover los datos mismos por su cantidad. R e g i s t r o s apuntadores apuntadores archivo ordenado ordenados

  6. Ordenamiento: Eficiencia • Consideraciones de eficiencia: • Tiempo para codificar el programa de ordenamiento • Cantidad de tiempo máquina para ejecutar el programa • Cantidad de espacio necesaria para el programa. • Esperaríamos encontrar un ordenamiento óptimo en O(n), sin tomar en cuenta el contenido u orden de ingresos, pero la mayoría de los métodos tienen requisitos de tiempo entre O(n log n) a O(n2).

  7. Ordenamiento de Burbuja: Bubble-sort • Se asume que x es un arreglo de enteros, del cual se van a ordenar n elementos, de modo que x[i] <= x[j], para0<=i<j<n • Idea: • Recorrer el archivosecuencialmentevariasveces • En cadaiteración se compara cada elemento del archivo con su sucesor x[i] con x[i+1] • Se intercambian los elementos (swap) si no están en el orden correcto • Se llama ordenamiento por burbuja porque cada valor lentamente asciende como una burbuja a su posición correcta

  8. EJEMPLO: n = 6 X pass 0 [0] [1] swap [2] [1] [3] [2] swap [4] [3] swap [5] [4] swap

  9. Algoritmo Buble-sort Detectasihubointercambios en unapasada o no. voidbubble(int x[], int n){ inttemp, j, pass; intswitched = TRUE; for(pass = 0; pass<n-1&&switched;pass++){ switched = FALSE; for (j=0; j<n-pass-1; j++) { if(x[j]>x[j+1]){ switched = TRUE; temp = x[j]; x[j] = x[j+1]; x[j+1] = temp; } } } } Los elementosqueya se ordenaron no esnecesariochecarlos Intercambio! Eficiencia: El método en general es O(n2), yaquetiene (n-1) pasadas y (n-1) comparaciones en cadapasada, en total n2-2n+1comparaciones.

  10. OrdenamientoporSelección Directa • Un ordenamiento por selección es aquel en el que se seleccionan elemento sucesivos en orden y se colocan en sus posiciones correctas • Idea: • En un principio el algoritmo toma un arreglo no ordenado • En cada iteración se selecciona el elemento más grande (o el menor) de los elementos restantes del arreglo • El elemento seleccionado se va apilando al principio o al final del arreglo, intercambiando posiciones con el elemento desordenado

  11. EJEMPLO: n = 6 X min I J J J min J I k min J J I min J J min I J

  12. AlgoritmoSelección Directa Asumeque el índice actual como el índice mínimo voidselectionSort(int x[], int n){ int i, j, minindex; for(i=0; i<n-1; i++){ minindex = i; for (j=i+1; j<n; j++) { if(x[j]<x[minindex]){ minindex = j; } } inttemp = x[i]; x[i] = x[minindex]; x[minindex] = temp; } } Actualiza el índice mínimo si encuentras otro valor menor Intercambio!

  13. OrdenamientoporInserción: Insertion-sort • Este método ordena un conjunto de registros insertándolos en un archivo ordenado existente. • Idea: • Inicialmente, se utiliza el primer elemento del arreglo como el componente que se encuentra ordenado • Cuando ya tenemos k elementos ordenados, se toma el elemento k+1, y se compara con los elementos ordenados • Se desplazan todos los elementos de 0 a k que sean mayores a k+1 • Se inserta el elemento k+1 inmediatamente después de algún elemento que no se deba desplazar.

  14. EJEMPLO: n = 6 X Elementos Ordenados k A insertar 10 insertó al principio k No se insertó 20 k 11 11 11 Se inserta entre 10 y 15

  15. Algoritmo Insertion-sort voidinsertionSort(int x[], int n){ int i, k, y; for(k=1; k<n; k++){ y = x[k]; for(i=k-1; i>=0 && y<x[i]; i--){ x[i+1] = x[i]; } x[i+1] = y; } } Los elementos menores de K se asumen ordenados Elemento a insertar Desplazamiento Inserción! Eficiencia: El método en el peor caso es O(n2): (n-1) + (n-2) + 3 + 2 + 1 = (n-1) * n/2.

  16. Ordenamiento de Shell • Método de ordenamiento de incremento decreciente. • Idea: • Mejorar el ordenamiento por inserción considerando elementos separados por varias espacios en el archivo original. Esto lo hace considerando subarchivos. • La idea es utilizar el k-ésimoelemento para producir k subarchivos con k espacios. • Después de ordenar los primeros k subarchivos, se elige un valor más pequeño de k y el archivo se divide en nuevos grupos. • El proceso se repite hasta que k llega a ser 1. Con lo que se ordena todo el subarchivo que viene siendo el archivo completo, utilizando el ordenamiento por inserción. • La idea es incrementar la velocidad del ordenamiento por inserción al subdividir el archivo original en subarchivos, evitando realizar demasiados desplazamientos al mover elementos entre espacios más grandes. • Los valores para k, es decir la secuencia de espacios, en el algoritmo original se determinaba dividiendo el número de elementos N del archivo entre 2, y así sucesivamente hasta alcanzar 1. Existen otras caracterizaciones de la secuencia de espacios que afectan el desempeño general del algoritmo.

  17. EJEMPLO: n = 6 kespacios= {3,1} k j y 11 space =3 j y y k … k … 16 18 y k j 10 space =1 k j 18 k j 15 k j 15

  18. Algoritmo de Shell voidshellSort(int x[], int n, int spaces[], intlengthspaces){ int i, j, k, space, y; for(i=0;i<lengthspaces; i++) { space = spaces[i]; for(j=space; j<n; j++){ y = x[j]; for (k = j-space; k>=0 && y<x[k]; k-=space){ x[k+space] = x[k]; } x[k+space] = y; } } } Elemento para inserción Secuencia de espacios Tamaño del espacio Desplazamiento Inserción! La implementación original del algoritmo requiere O(n2) comparaciones e intercambios en el peor caso.

  19. OrdenamientoQuicksort • Método de ordenamiento basado en la técnica de divide y vencerás. • Idea: • Elegir un elemento de la lista xa ordenar al que se le denomina pivote. • Coloque el elemento pivoteen la posición j de tal manera que prevalezcan las condiciones siguientes: • Cada uno de los elementos en las posiciones 0a j-1es menor que o igual al pivote • Cada uno de los elementos en las posiciones j+1 a n-1es mayor que o igual al pivote • Bajoestascondiciones, el elementox[j]es el j-ésimo elemento más pequeño de la lista • Se repite el proceso anterior con los subarreglos, note que el pivoteya se encuentra en la posición correcta j: • x[0] a x[j-1]y x[j+1] a x[n-1] • Permite en promedio ordenar n elementos en un tiempo proporcional a n log n en el mejor caso (pivote en el centro de la lista), el peor caso es n2 (cuando el pivote se encuentra en un extremo de la lista) • La elección del pivote constituye una de las principales mejoras del algoritmo, se puede elegir a ciegas, el primero o el último, un punto intermedio, por reposición, etc. X pivote

  20. OrdenamientoQuicksort: Selección del Pivote • Por reposicionamiento: Se utilizan dos índices, up y down, se establece como valor del pivote el primer elemento del arreglo por ejemplo. • Los dos apuntadores up y downrecorren la lista simultáneamente con downpor la izquierda y up por la derecha uno hacia el otro de la forma siguiente: • Aumentar el apuntador downen una posición hasta que X[down] > pivote • Decrementar el apuntador up en una posición hasta que X[up] <= pivote • Si up > downy las dos condiciones anteriores se cumplen, se intercambian X[down] con X[up] • El proceso se repite hasta que los apuntadores se cruzan (up<=down), en cuyo punto x[up] se intercambia con x[pivote], y se retorna up como el pivote. n = 6 pivote down up pivote down up pivote down up pivote down up Se rompe el ciclo y se intercambiaup como el nuevopivote. pivote up down pivote Recursivamente se ordenanlassublistas, antes y después del pivote

  21. Algoritmo Quicksort intparticion(int * x, intizq, intder){ intpivote, down, up, temp; down = izq; up = der; pivote= x[izq]; while (down < up){ while(x[down]<=pivote && down<der) down++; while(x[up]>pivote) up--; if(down < up){ temp = x[down]; x[down] = x[up]; x[up] = temp; } } x[izq] = x[up]; x[up] = pivote; return up; } void Quicksort(int * x intlb, intub) { intpivote; if(lb < ub){ pivote=particion(x, lb, ub); Quicksort(x, lb, pivote-1); Quicksort(x, pivote+1, ub); } }

  22. Ordenamientoporintercalación: Merge-sort • Método de ordenamiento basado en técnica de comparaciones. • Idea: • Si el arreglo es de longitud 0 o 1, entonces se encuentra ordenado. De otra manera, • Dividir el arreglo desordenado en dos subarreglos de tamaño proporcional a la mitad • Ordenar cada subarreglo recursivamente reaplicando el método merge-sort • Finalmente, intercalar (merge) los dos subarreglos en un arreglo ordenado • La idea de intercalación asume que es más fácil ordenar una lista pequeña, y que menos pasos se necesitan para construir una lista ordenada de dos listas ordenadas que de dos listas desordenadas.

  23. Merge-sort: Pseudo-código • function merge(left,right) • varlist result • whilelength(left) > 0 or length(right) > 0 • iflength(left) > 0 and length(right) > 0 • iffirst(left) ≤ first(right) • append first(left) to result • left = rest(left) • else • append first(right) to result right = rest(right) • else if length(left) > 0 • append first(left) to result • left = rest(left) • else if length(right) > 0 • append first(right) to result • right = rest(right) • end while • returnresult functionmerge_sort(m) iflength(m) ≤ 1 return m varlist left, right, result varinteger middle = length(m) / 2 for each x in m up to middle add x to left for each x in m after or equal middle add x to right left = merge_sort(left) right = merge_sort(right) result = merge(left, right) returnresult

More Related