23
Estructura de Datos En C++ Dr. Romeo Sánchez Nigenda. E-mail: [email protected] 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

Estructura de Datos En C++

  • Upload
    wood

  • View
    73

  • Download
    2

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Estructura de Datos En C++

Estructura de Datos En C++Dr. Romeo Sánchez Nigenda.E-mail: [email protected]://yalma.fime.uanl.mx/~romeo/Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar ChacónHoras 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

Page 2: Estructura de Datos En C++

Objetivo General: Conocerá y manejará las estructuras internas de información

Temario:

1. Conceptos Básicos2. La Pila3. Colas4. Recursión5. Listas6. Árboles7. Ordenamiento8. Búsqueda9. Administración de Almacenamiento

Total a calificar: 110 puntos.

40% Tareas30% Examen Parcial30% Examen Final10% Participación

Page 3: Estructura de Datos En C++

Material de apoyo:Estructura de Datos con C y C++. Yedidyah Langsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn CollegeSegunda Edición, Prentice-Hall.

Algorithms. Third Edition.Parts 1-4, Fundamentals Data Structures Sorting SearchingRobert Sedgewick.

Estructura de Datos. Román Martínez, Elda Quiroga.Thomson Learning.

Cualquier libro de Estructura de Datos!Software:Compiladores GCC (GNU Compiler Collection)

IDEs (Integrated Development Environment):http://www.eclipse.org/downloads/http://kdevelop.org/ http://www.bloodshed.net/devcpp.html

Page 4: Estructura de Datos En C++

7. OrdenamientoObjetivo: 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)

Page 5: Estructura de Datos En C++

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<j implica 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. Llav

eCampo

4 DDD2 BBB1 AAA3 CCC

Registros

Llave

Campo

1 AAA2 BBB3 CCC4 DDD

archivo ordenado

Llave

Campo

4 DDD2 BBB1 AAA3 CCC

apuntadores apuntadores

ordenados

Page 6: Estructura de Datos En C++

Ordenamiento: EficienciaConsideraciones 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).

Page 7: Estructura de Datos En C++

Ordenamiento de Burbuja: Bubble-sortSe asume que x es un arreglo de enteros,

del cual se van a ordenar n elementos, de modo que x[i] <= x[j], para 0<=i<j<n

Idea: ◦Recorrer el archivo secuencialmente varias

veces◦En cada iteració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

Page 8: Estructura de Datos En C++

15 10 20 11 16 18X n = 6

pass0

15 10 20 11 16 18[0] [1]

10 15 20 11 16 18[1] [2]

10 15 20 11 16 18[2] [3]

10 15 11 20 16 18[3] [4]

10 15 11 16 20 18[4] [5]

10 15 11 16 18 20

swap

swap

swap

swap

EJEMPLO:

Page 9: Estructura de Datos En C++

Algoritmo Buble-sortvoid bubble(int x[], int n){int temp, j, pass;int switched = 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;}}

}}

Detecta si hubo intercambiosen una pasada o no.

Los elementos que ya seordenaron no es necesario checarlos

Intercambio!

Eficiencia: El método en general es O(n2), ya que tiene (n-1) pasadas y (n-1) comparaciones en cada pasada, en total n2-2n+1 comparaciones.

Page 10: Estructura de Datos En C++

Ordenamiento por Selección DirectaUn 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

Page 11: Estructura de Datos En C++

15 10 20 11 16 18X n = 6

15 10 20 11 16 18

10 15 20 11 16 18

J

EJEMPLO:

k

Imin

min

J

I

min J

J J J

10 15 20 11 16 18min

I

J J

10 15 20 11 16 18min

I10 11 20 15 16 18

J

Page 12: Estructura de Datos En C++

Algoritmo Selección Directa

void selectionSort(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;} }int temp = x[i];x[i] = x[minindex];x[minindex] = temp;

}}

Asume que el índice actualcomo el índice mínimo

Actualiza el índice mínimosi encuentras otro valor menor

Intercambio!

Page 13: Estructura de Datos En C++

Ordenamiento por Inserción: Insertion-sortEste 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.

Page 14: Estructura de Datos En C++

15 10 20 11 16 18X n = 6

k15 10 20 11 16 18

10 15 20 11 16 18

Elementos Ordenados

EJEMPLO:

A insertar10

insertó alprincipio

10 15 20 11 16 18k

20

10 15 20 11 16 18k

1110 15 20 20 16 18

11

10 15 15 20 16 1811

10 11 15 20 16 18

No se insertó

Se inserta entre 10 y 15

Page 15: Estructura de Datos En C++

Algoritmo Insertion-sortvoid insertionSort(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;}

}

Desplazamiento

Los elementos menores de Kse asumen ordenados

Inserción!

Eficiencia: El método en el peor caso es O(n2): (n-1) + (n-2) + 3 + 2 + 1 = (n-1) * n/2.

Elemento a insertar

Page 16: Estructura de Datos En C++

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-ésimo elemento 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.

Page 17: Estructura de Datos En C++

15 10 20 11 16 18kespacios = {3,1}n = 6

k15 10 20 11 16 18

EJEMPLO:

16

11space =3j y

11 10 20 15 16 18k

j

… …k j18

y y

11 10 18 15 16 20space =1k

10 11 18 15 16 20jk

10 11 18 15 16 20jk

10y

18

15

10 11 18 18 16 20jk

15

Page 18: Estructura de Datos En C++

Algoritmo de Shellvoid shellSort(int x[], int n, int spaces[], int lengthspaces){

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

Desplazamiento

Inserción!

Secuencia de espaciosTamaño delespacio

La implementación original del algoritmo requiere O(n2) comparaciones e intercambios en el peor caso.

Page 19: Estructura de Datos En C++

Ordenamiento Quicksort Método de ordenamiento basado en la técnica de divide y vencerás. Idea:

◦ Elegir un elemento de la lista x a ordenar al que se le denomina pivote. ◦ Coloque el elemento pivote en la posición j de tal manera que prevalezcan las

condiciones siguientes: Cada uno de los elementos en las posiciones 0 a j-1 es menor que o igual al pivote Cada uno de los elementos en las posiciones j+1 a n-1 es mayor que o igual al pivote

◦ Bajo estas condiciones, el elemento x[j] es el j-ésimo elemento más pequeño de la lista

◦ Se repite el proceso anterior con los subarreglos, note que el pivote ya 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.

0 … J-1 J J+1 … N-1Xpivote

Page 20: Estructura de Datos En C++

15 10 20 11 16 18 n = 6pivote down

Ordenamiento Quicksort: 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 down recorren la lista simultáneamente con down por la izquierda y up por la derecha uno hacia el otro de la forma siguiente:◦ Aumentar el apuntador down en una posición hasta que X[down] > pivote◦ Decrementar el apuntador up en una posición hasta que X[up] <= pivote◦ Si up > down y 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.up

15 10 20 11 16 18pivote down up

15 10 20 11 16 18pivote down up

15 10 11 20 16 18pivote down up

15 10 11 20 16 18pivote up down

Se rompe el ciclo y se intercambia up como el nuevo pivote.

11 10 15 20 16 18pivote Recursivamente se ordenan las sublistas,

antes y después del pivote

Page 21: Estructura de Datos En C++

Algoritmo Quicksortint particion (int * x, int izq, int der){

int pivote, 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 int lb, int ub) { int pivote; if(lb < ub){

pivote=particion(x, lb, ub); Quicksort(x, lb, pivote-1); Quicksort(x, pivote+1, ub); } }

Page 22: Estructura de Datos En C++

Ordenamiento por intercalació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.

Page 23: Estructura de Datos En C++

Merge-sort: Pseudo-códigofunction merge_sort(m)

if length(m) ≤ 1 return m var list left, right, result var integer 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)

return result

function merge(left,right) var list result while length(left) > 0 or length(right) > 0 if length(left) > 0 and length(right) > 0 if first(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 return result