270 likes | 409 Views
Curso de Programación 1 Plan 97. Clase 10 (Búsqueda y Ordenación). Métodos de b úsqueda. Existen aplicaciones en las cuales es necesario consultar si un elemento se encuentra dentro de un array. A continuaci ón veremos dos métodos de búsqueda : búsqueda lineal b úsqueda binaria.
E N D
Curso de Programación 1Plan 97 Clase 10 (Búsqueda y Ordenación)
Métodos de búsqueda • Existen aplicaciones en las cuales es necesario consultar si un elemento se encuentra dentro de un array. • A continuación veremos dos métodos de búsqueda: • búsqueda lineal • búsqueda binaria Programación 1. Plan 97. InCo. Fac. de Ingeniería
Búsqueda lineal • En la búsqueda lineal se recorre en forma secuencial el array hasta que • se encuentra el elemento deseado, • o se examinan sin éxito todos los elementos del array. A[1] A[2] A[3] ... A[n] v1 v2 v3 ... vn v3 Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ejemplo • Supongamos que una casa de venta de repuestos de automóvil ofrece 100 tipos de piezas diferentes. • Cada pieza tiene un código el cual viene dado por un entero. • La información de cuáles son los códigos de pieza a la venta se encuentra almacenada en una tabla no ordenada: • Type Tabla =array [1..100] of integer; • Var piezas : Tabla; Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ejemplo • Para consultar si una determinada pieza es vendida o no por la casa de repuestos debemos entonces recorrer el array piezas comparando por código de pieza. • Por ejemplo, 100 1 2 3 4 ... 9981 4218 3245 1423 ... 2512 1423 Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ejemplo • Definiremos una función BLineal la cual devuelve un booleano que indica si la pieza esta o no a la venta. • Los parámetros de entrada son los siguientes: • piezas-- el array con las piezas a la venta • p -- código de pieza a consultar Programación 1. Plan 97. InCo. Fac. de Ingeniería
Function BLineal(p: integer; • piezas: Tabla): boolean; • Var (* variables locales *) • esta, sinexito: boolean; • indice: 1..100; • begin • (* inicializacion de variables *) • esta := false; • sinexito := false; • indice := 1; Programación 1. Plan 97. InCo. Fac. de Ingeniería
repeat • if p = piezas[indice] • then esta := true • else if indice = 100 • then sinexito := true • else indice := indice + 1 • until esta or sinexito; • BLineal := esta; • end; (* fin BLineal *) Programación 1. Plan 97. InCo. Fac. de Ingeniería
Búsqueda binaria • La búsqueda de un elemento en un array puede acelerarse en forma considerable si los elementos del mismo están ya ordenados. • En tal caso, una forma eficientede búsqueda es el de división sucesiva en partes iguales del intervalo donde debe buscarse el elemento. • Este método se conoce con el nombre de búsqueda binaria o bipartición. Programación 1. Plan 97. InCo. Fac. de Ingeniería
Búsqueda binaria • Intuitivamente el algoritmo de búsqueda binaria procede de la siguiente forma: • 1. Mirar si el elemento que se busca está en el punto medio del intervalo. • 2. Si no está en esa posición, entonces repetir la búsqueda, pero concentrándose ahora en la primera o segunda mitad del intervalo, según sea el elemento menor o mayor que el valor en el punto medio. Programación 1. Plan 97. InCo. Fac. de Ingeniería
1 2 3 4 5 6 7 8 4 7 12 14 19 25 30 38 1 2 3 5 6 7 8 4 7 12 19 25 30 38 1 3 5 7 8 4 12 19 30 38 8 38 Programación 1. Plan 97. InCo. Fac. de Ingeniería
Búsqueda binaria • Supongamos que estamos buscando un valor x en un intervalo inf..sup. • Si x está en la posición • medio = (inf + sup) DIV 2 • entonces la búsqueda fue exitosa. • Caso contrario, • si x < valor en medio, entonces buscar en el intervalo inf..medio -1. • sino buscar en el intervalo medio+1..sup. Programación 1. Plan 97. InCo. Fac. de Ingeniería
Búsqueda binaria • Existe otra condición de detención del algoritmo que corresponde al caso en que el valor x buscado no está en el array. • Dicha condición es verificable en cada iteración del algoritmo. • Determina si el intervalo donde vamos a realizar la próxima búsqueda es vacío o no. Esto se verifica fácilmente: • inf..supvacío ? inf sup Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ejemplo • Function BBinaria(p: integer; • partes:Tabla):boolean; • Var (* variables locales *) • esta: boolean; • inf, sup, medio: integer; • begin • (* inicializacion de variables *) • esta := false; • inf := 1; • sup := 100; Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ejemplo • repeat • medio := (inf + sup) DIV 2; • if p = piezas[medio] • then esta := true • else if p < piezas[medio] • then sup := medio - 1 • else inf := medio + 1 • until esta or (inf > sup); • BBinaria := esta; • end; (* fin BBinaria *) Programación 1. Plan 97. InCo. Fac. de Ingeniería
Versión Recursiva Function RecBBin(inf, sup, p: integer; piezas: Tabla): boolean; var medio: integer; begin if inf > sup then RecBBin := false else ... Programación 1. Plan 97. InCo. Fac. de Ingeniería
else begin medio := (inf + sup) div 2; if p = piezas[medio] then RecBBin := true else if x < piezas[medio] then RecBBin := RecBBin(inf,medio-1, p,piezas) else RecBBin := RecBBin(medio+1,sup, p,piezas) end end; Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación • Porordenar se entiende el proceso de reorganizar un conjunto de objetos en una cierta secuencia de acuerdo a un criterio especificado. • En general, el objetivo de este proceso es facilitar la posterior búsqueda de elementos en el conjunto ordenado. • Por ejemplo, el método de búsqueda binaria necesita que el array esté ordenado para poder ser aplicado. Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación • Existen múltiples ejemplos reales de conjuntos ordenados: la guía telefónica, índices de libros, ficheros de bibliotecas, diccionarios, ficheros de diverso tipo en oficinas, actas de exámenes, etc. • En la literatura existe una gran variedad de métodos para ordenar arrays. Veremos uno de esos métodos, llamado ordenación por inserción. Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación • Ordenar un conjunto de objetos a1,a2,...,an consiste en encontrar una permutación ak1,ak2,...,akn tal que dada una función de ordenaciónƒse verifique: • ƒ(ak1) ƒ(ak2) ... ƒ(akn) • Normalmente, aplicar la función ƒ a un objeto aicorresponde a seleccionar el valor de alguno de sus componentes (por ej., un campo en el caso de registos). A ese valor se le denomina la clave del objeto. En otros casos ƒ es simplemente la identidad (por ej., cuando los aison escalares). Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación por Inserción • El método de ordenación por inserción debe su nombre al hecho que en la i-ésima pasada se ``inserta´´ el i-ésimo elemento del array en el lugar adecuado entre los i-1elementos que lo preceden, los cuales ya fueron ordenados previamente. • Como resultado de esta inserción los i primeros elementos del array quedan ordenados. j i-1 i 1 n Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación por Inserción • Supongamos que el array a ordenar es • Var A : array [1..n] of T • entonces el método procede de esta forma: • for i := 2 to n do • moverA[i]hasta la posiciónj i • tal que • ƒ(A[i]) ƒ(A[k]) paraj k i, y • ƒ(A[i]) ƒ(A[j-1]) j = 1 Programación 1. Plan 97. InCo. Fac. de Ingeniería
Var i,j: 1..n; • parar: boolean; • for i := 2 to n do • begin • j := i; • parar := false; • repeat • if ƒ(A[j]) ƒ(A[j-1]) • then begin • intercambio(A[j], A[j-1]); • if j 2 then j := j - 1 • else parar := true • end • else parar := true • until parar • end; Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación por Selección • Se localiza el elemento de mayor clave del array y se lo intercambia con el elemento que se encuentra en la última posición. • Se repite este procedimiento en la porción del array que no incluye la última posición. mayor Programación 1. Plan 97. InCo. Fac. de Ingeniería
Ordenación por Selección • Supongamos nuevamente que el array a ordenar es • Type arreglo = array [1..n] of T; • Var A : arreglo; • El método procede entonces de esta forma: • for i := n downto 2 do • encontrar el máximo entre1ei • intercambiar el máximo con el elemento A[i] Programación 1. Plan 97. InCo. Fac. de Ingeniería
Encontrar el índice del máximo • Function maximo(ultimo : integer; • A : arreglo) : integer; • var j, max : integer; • begin • max := 1; • for j := 2 to ultimo • do • if ƒ(A[j]) > ƒ(A[max]) then max := j; • maximo := max • end; Programación 1. Plan 97. InCo. Fac. de Ingeniería
Procedure Seleccion(var A : arreglo); • var i, mayor : integer; • temp : T; • begin • for i := n downto 2 do • begin • mayor := maximo(i,A); • temp := A[mayor]; • A[mayor] := A[i]; • A[i] := temp • end • end; Programación 1. Plan 97. InCo. Fac. de Ingeniería