Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

27
Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Transcript of Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Page 1: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Curso de Programación 1

Plan 97

Clase 10(Búsqueda y Ordenación)

Page 2: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

2

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

Page 3: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

3

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.

v1 v2 v3 ... vn

A[1] A[2] A[3] ... A[n]

v3

Page 4: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

4

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;

Page 5: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

5

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,

9981 4218 3245 1423 ...

1 2 3 4 ...

1423

2512

100

Page 6: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

6

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

Page 7: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

7

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;

Page 8: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

8

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 *)

Page 9: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

9

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 eficiente de 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.

Page 10: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

10

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.

Page 11: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

11

1 2 3 5

76

4 7 12 14 19

1 2 3 4 5

25

8

30 38

76

19 25

8

30 38

5

19

7 8

30 38

4 7 12

3

12

1

4

8

38

Page 12: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

12

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.

Page 13: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

13

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..sup vacío ? inf sup

Page 14: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

14

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;

Page 15: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

15

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 *)

Page 16: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

16

Function RecBBin(inf, sup, p: integer;

piezas: Tabla): boolean;

var medio: integer;

begin

if inf > sup

then RecBBin := false

else ...

Versión Recursiva

Page 17: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

17

else begin

medio := (inf + sup) div 2;if p = piezas[medio]then RecBBin := trueelse if x < piezas[medio]

then RecBBin := RecBBin(inf,medio-1, p,piezas)

else RecBBin := RecBBin(medio+1,sup, p,piezas) endend;

Page 18: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

18

Ordenación

Por ordenar 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.

Page 19: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

19

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.

Page 20: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

20

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 ai corresponde

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 ai son

escalares).

Page 21: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

21

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-1 elementos que lo preceden, los cuales ya fueron ordenados previamente.

• Como resultado de esta inserción los i primeros elementos del array quedan ordenados.

n1 ij i-1

Page 22: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

22

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 mover A[i] hasta la posición j i tal que ƒƒ(A[i]) ƒƒ(A[k]) para j k i, y ƒƒ(A[i]) ƒƒ(A[j-1]) j = 1

Page 23: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

23

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;

Page 24: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

24

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

Page 25: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

25

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 entre 1 e i

intercambiar el máximo con el elemento A[i]

Page 26: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

26

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;

Page 27: Curso de Programación 1 Plan 97 Clase 10 (Búsqueda y Ordenación)

Programación 1. Plan 97. InCo. Fac. de Ingeniería

27

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;