1 / 34

Búsqueda y ordenación

Búsqueda y ordenación. Programación II 7-8 de enero de 2009. Funciones. Un concepto fundamental en este curso es la función Una función no sólo resuelve un problema específico, sino una clase de problemas genéricos Ejemplo: sumar los números enteros 5 y 6 (específico)

draco
Download Presentation

Búsqueda y ordenación

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. Búsqueda y ordenación Programación II 7-8 de enero de 2009

  2. Funciones • Un concepto fundamental en este curso es la función • Una función no sólo resuelve un problema específico, sino una clase de problemas genéricos • Ejemplo: • sumar los números enteros 5 y 6 (específico) • sumar los números enteros a y b (genérico)

  3. Funciones • Una función tiene una entrada y una salida • La entrada es una lista de variables que especifica el tipo de cada variable • La salida es un valor de un tipo determinado • Ejemplo en C: int sumar(int a, int b)

  4. Funciones • Una función debe resolver correctamente el problema para cualquier valor de las variables de entrada • Por lo tanto, tiene que detallar el proceso completo que lleva a la solución • Una función que no produce ningún resultado se llama acción

  5. Ejemplos int sumar(int a, int b) { int resultado = a + b; return resultado; } void mostrar(int x) { printf("El valor es %d\n", x); }

  6. Llamar a funciones • Para resolver un problema específico del tipo resuelto por una función, se llama • Llamar a una función consiste en especificar los valores de entrada: int suma = sumar(5, 6); mostrar(3); • Al llamar a una función se ejecuta su proceso con los valores especificados

  7. Pseudocódigo • El pseudocódigo es un lenguaje genérico para escribir funciones • No corresponde a ningún lenguaje de programación (como C o Java) • En cambio, está compuesto por palabras más cercanas al lenguaje natural • Vamos a usar el pseudocódigo para escribir funciones

  8. Ejemplos funcion Sumar(a:natural, b:natural) devuelvenatural variable resultado:natural; resultado  a + b; devuelve resultado; ffuncion accion Mostrar(x:natural) // Mostrar el valor de x en la pantalla faccion

  9. Interpretar programas • La programación no sólo consiste en escribir programas • También es necesario poder interpretar programas de otros programadores • utilizar el código en su programa • adaptar el código a problemas parecidos • ayudar en el proceso de depuración • verificar que la solución es correcta

  10. Métodos de Búsqueda y Ordenación • Búsqueda lineal • Búsqueda lineal con marcador • Búsqueda binaria • Búsqueda binaria simplificada • Esquemas sencillos de ordenación • Algoritmo de la Burbuja: Bubble Sort • Algoritmo de Inserción: Insertion Sort • Algoritmo de Selección: Selection Sort

  11. Métodos de Búsqueda y Ordenación Los problemas más comunes en la informática son la búsqueda y la ordenación. Número de preguntas diarias en Google: 400 millones (2006) Por lo tanto, la eficiencia de la búsqueda es importante La ordenación consiste en ordenar los elementos de un conjunto con el fin de acelerar la búsqueda

  12. Búsqueda lineal Encontrar un elemento determinado dentro de una colección dada. La búsqueda se realiza sobre una estructura de datos de tamaño fijo y conocido, por ejemplo, un vector. Los algoritmos sirven para hacer búsquedas sobre cualquier tipo de datos, siempre que sea posible realizar comparaciones (‘igualdad’, ‘menor que’) sobre este tipo. ¿Porqué se llama lineal?

  13. Búsqueda lineal • 1funcionBusquedaLineal(V: vectorde natural; • elem,n : natural) devuelveentero • variablei : natural; • i ← 1 ; • mientras( ( i n ) y(V[i]elem) ) hacer • i ← i +1; • fmientras • si ( i  n ) entonces • devuelve i ; • sino • devuelve-1; • fsi • 13ffuncion

  14. Búsqueda lineal La instrucción mientras lleva una doble condición: mientras ( ( i n ) y(V[i]elem) ) hacer Comprobar que la doble condición se satisface para cada valor de la variable i es ineficiente Una manera de evitar la doble condición es introducir un marcador

  15. Búsqueda lineal con marcador • 1funcionBusquedaLinealConMarcador(V: vectorde natural; • elem,n : natural) devuelveentero • variablei : natural; • i ← 1 ; • V[n+1] ← elem ; • mientras(V[i]  elem) hacer • i ← i +1; • fmientras • si ( i = n+1 ) entonces • devuelve -1; • sino • devuelvei; • fsi • 14ffuncion

  16. Búsqueda binaria La búsqueda lineal es la primera idea que ocurre para el problema de la búsqueda. Sin embargo, su eficiencia puede ser mejorado de forma considerable. Para hacerlo es necesario suponer que los elementos del vector estén ordenados. Suponemos que el vector esta ordenado de forma ascendente (de menor a mayor).

  17. Búsqueda binaria Si el vector está ordenado (de manera ascendente o descendente), es posible aplicar búsqueda binaria. La idea es hacer servir la propiedad adicional del vector para acelerar el proceso de búsqueda: 1) Dividir el vector en dos partes iguales. 2) Si el elemento en el centro del vector es mayor que el elemento buscado, buscar en la primera mitad. 3) Si el elemento en el centro del vector es menor que el elemento buscado, buscar en la segunda mitad.

  18. 1 funcionBusquedaBinaria(V: vectorde natural; elem,n : natural) devuelveentero • variableE,D,medio : natural; • encontrado : booleano; • E ← 1 ; • D ← n ; • encontrado := falso ; • mientras ( (E  D) yno(encontrado) ) hacer • medio ← (E+D) / 2; • si (V[medio] = elem) entonces • encontrado ←cierto; • sino • si (V[medio] < elem) entonces • E ← medio + 1; // derecha. • sino • D ← medio - 1; // izquierda. • fsi • fsi • fmientras • si ( encontrado ) entonces • devuelve medio; • sino • devuelve-1; • fsi • ffuncion

  19. Búsqueda binaria simplificada De nuevo, la instrucción mientras lleva una doble condición mientras ( (E  D) yno(encontrado) ) hacer Es posible mejorar ligeramente la eficiencia eliminando la doble condición Una manera de hacerlo es dejar de comprobar si el elemento en el medio es igual al elemento buscado Con esta modificación, es posible que el algoritmo repita más veces el bucle mientras Sin embargo, cada iteración será más eficiente

  20. 1funcionBusquedaBinariaSimplificada(V: vectorde natural; • elem,n : natural) devuelveentero • variableE,D,medio : natural ; • E ← 1 ; • D ← n ; • mientras (E  D)hacer • medio ← (E+D) / 2; • si (V[medio] < elem) entonces • E ← medio + 1; • sino • D ← medio; • fsi • fmientras • si ( (D = n + 1) o (V[D]  elem) ) entonces • devuelve -1; • sino • devuelve D; • fsi • ffuncion

  21. Eficiencia de la búsqueda ¿Cuál de las dos opciones de búsqueda (lineal, binaria) es más óptimo?

  22. Esquemas sencillos de ordenación Hemos visto como la búsqueda se puede realizar con más eficiencia si los elementos están ordenados. Si necesita buscar muchos datos en un mismo conjunto, vale la pena ordenar los elementos primero. Igual que para la búsqueda, la ordenación se puede realizar sobre cualquier tipo de elementos, siempre que se puedan comparar (‘menor que’).

  23. Esquemas sencillos de ordenación Como la ordenación es un problema importante, existen un gran número de algoritmos de ordenación. Los algoritmos existentes se pueden utilizar en diferentes estructuras de datos (p.ej., un vector). Imponen diferentes tipos de requerimientos sobre los datos a ordenar. También varía su eficiencia, tanto a nivel de memoria como a nivel de tiempo de ejecución.

  24. 3.3 Esquemas sencillos de ordenación En general, los algoritmos más eficientes son más complejos y menos intuitivos. Estudiaremos en total cinco de estos algoritmos. Los tres primeros (Burbuja, Inserción, y Selección) son muy sencillos, aunque no muy eficientes. Los otros dos (MergeSort y QuickSort) son tan eficientes como se puede esperar para un algoritmo de ordenación, pero menos intuitivos.

  25. Algoritmo de la Burbuja: Bubble Sort El algoritmo de ordenación de la burbuja es uno de los más fáciles de recordar. Su nombre describe de manera intuitiva su funcionamiento. Imaginamos que los números menores ‘pesan menos’ y ‘suben a la superficie’ como una burbuja. Se basa en el intercambio entre pares de items

  26. Algoritmo de la Burbuja: Bubble Sort • 1 funcionBurbuja(V : vectorde natural; n : natural ) devuelvevector de natural • variablei,j : natural; • para i ← 1 hasta n-1 hacer • para j ← n hasta i+1 pasos –1 hacer • si (V[j] < V[j-1]) entonces • Intercambiar(V, j, j-1); • fsi • fpara • fpara • devuelve V; • 11ffuncion • 12 • 13 accionIntercambiar (V : vector de natural ; i,j : natural) • variable aux : natural ; • aux ← V[i] ; • V[i] ← V[j] ; • V[j] ← aux ; • 18 faccion

  27. Algoritmo de la Burbuja: Animación http://sziami.cs.bme.hu/~gsala/alg_anims/3/bsort-e.html http://www.cs.ubc.ca/spider/harrison/Java/ http://www.cs.hope.edu/~alganim/animator/Animator.html http://www2.hig.no/~algmet/animate.html

  28. Algoritmo de Inserción: Insertion Sort • Se basa en el método seguido por los jugadores de cartas: • Sec-destino (ordenada) Secuencia-Origen(por ordenar) • V[1 . . . i-1] V[i . . . n] • En cada paso tomamos el elemento V[i] y lo insertamos donde convenga de la secuencia destino. • para i=2 hasta n hacer • insertar V[i] en V[1..i-1] • fpara • Para simplificar la inserciónampliamos el vector a V[0..n] para poner en v[0] el marcador o centinela que simplifique la búsqueda de la inserción. • Insertar v[i] en v[0..i]: • si v[i-1]<v[i] hacer • intercambiar V[i] por v[i-1] • sino terminar • fsi

  29. Algoritmo de Inserción: Insertion Sort • 1 funcionInsercion(V: vectorde natural; n:natural) devuelvevector de natural • variablei,j : natural; • V[0] ← MIN_INT; • para i ← 2 hasta n hacer • j ← i; • mientras (V[j] < V[j-1]) hacer • Intercambiar(V, j, j-1); • j ← j-1; • fmientras • fpara • devuelve V; • 12 ffuncion • 13 accionIntercambiar (V : vector de natural ; i,j : natural) • variable aux : natural ; • aux ← V[i] ; • V[i] ← V[j] ; • V[j] ← aux ; • 18 faccion

  30. Algoritmo de Inserción: Animación http://sziami.cs.bme.hu/~gsala/alg_anims/3/isort-e.html http://www.cs.ubc.ca/spider/harrison/Java/ http://www.cs.hope.edu/~alganim/animator/Animator.html http://www2.hig.no/~algmet/animate.html

  31. Algoritmo de Selección: Selection Sort En cada pasoseleccionamos el elemento de menor valor de los no ordenados y lo colocamoscomo primero de los no ordenados: seleccionamos-entrecolocamos-enquedará-por-ordenar i=1 v[1..n] v[1] v[2..n] i=2 v[2..n] v[2] v[3..n] i=3 v[3..n] v[3] v[4..n] i=n-1 v[n-1..n] v[n-1] v[4..n] El últimoya queda ordenado! • Para i=1 hastan-1hacer • Asignar a k el menor valor de v[i..n] • Intercambiar v[i] con v[k] • fpara • Idea opuesta a la de Inserción: • Inserción: trabaja sobre los yaordenados • Selección: trabaja sobre los yaordenados

  32. Algoritmo de Selección: Selection Sort • 1 funcionSeleccion(V: vectorde natural; n: natural) devuelvevector de natural • variablei,j,menor : natural; • para i ← 1 hasta n - 1 hacer • menor ← i; • para j ← i + 1 hasta n hacer • si (V[j] < V[menor]) entonces • menor ← j; • fsi • fpara • Intercambiar(V, i, menor); • fpara • devuelve V; • 13 ffuncion

  33. Algoritmo de Selección: Animación http://sziami.cs.bme.hu/~gsala/alg_anims/3/ssort-e.html http://www.cs.ubc.ca/spider/harrison/Java/ http://www.cs.hope.edu/~alganim/animator/Animator.html http://www2.hig.no/~algmet/animate.html

  34. Eficiencia de la ordenación ¿Cuál es la eficiencia de los algoritmos sencillos de ordenación? Una idea: contar el número de instrucciones que cada algoritmo realiza Hay que tomar en cuenta que las instrucciones dentro de un bucle mientras se repiten varias veces

More Related