Tema 05 - Eficiencia de algoritmos- B squeda

Anuncio
Unidad 3: Eficiencia de Algoritmos
Tema V: Búsqueda.
Búsqueda. Búsqueda Lineal. Búsqueda binaria.
Búsqueda Máximos y Mínimos. Análisis de los
algoritmos de búsqueda.
Programación I (Plan 1999)
Algoritmos y Estructuras de Datos II (Plan 2009)
Mgter. Oscar Adolfo Vallejos
FaCENA - UNNE
Búsqueda, Clasificación e Intercalación
Búsqueda
• La operación de búsqueda nos permite encontrar
datos que están previamente almacenados. La
operación puede ser un éxito, si se localiza el
elemento buscado o un fracaso en otros casos.
• La búsqueda se puede realizar sobre un conjunto
de datos ordenados, lo cual hace la tarea más
fácil y consume menos tiempo; o se puede
realizar sobre elementos desordenados, tarea
más laboriosa y de mayor insumo de tiempo.
Búsqueda
• Búsqueda Interna será aquella acción que se realice
sobre datos que se encuentran en la memoria
principal, por ejemplo en un arreglo.
• Búsqueda Externa es cuando todos sus elementos se
encuentran en memoria secundaria (archivos
almacenados en dispositivos de cinta, disco, etc.-)
• La operación de búsqueda de un elemento X en un
conjunto consiste en determinar si el elemento X
pertenece al conjunto y en este caso dar su posición, o
bien, determinar que el elemento X no pertenece al
conjunto.
• Los métodos más usuales para la búsqueda
son:
• Búsqueda secuencial o lineal
• Búsqueda binaria
• Búsqueda por transformación de claves
Búsqueda Secuencial
• La búsqueda secuencial es la técnica más simple para buscar
en una lista de datos. Este método consiste en recorrer una
lista o arreglo en forma secuencial y comparar cada
elemento del arreglo con el valor deseado, hasta que éste se
encuentre o finalice el arreglo.
• Normalmente cuando la función de búsqueda termina con
éxito, es decir encontró el dato buscado, interesa conocer en
que posición fue encontrado el dato buscado. Esta idea se
puede generalizar en todos los métodos de búsqueda.
• La búsqueda secuencial no requiere ningún requisito para el
arreglo, y por lo tanto no necesita estar ordenado.
Inicio
Ingresar X
Inicio
Ingresar X
Leer V(100)
Desde I = 1 hasta 100 hacer
Si V(i) = X entonces
Imprimir “
Encontrado” V(i), “Posición” i
Fin
Fin Si
Fin desde
Imprimir “Dato no encontrado”
Fin
V(i)
i=1, 100
I= 1
V(i) = X
No
No
I = 100
I= I+ 1
Si
"Dato No Encontrado"
Fin
Si
"Encontrado" V(i)
"Posición " i
Búsqueda Secuencial
Consideraciones
• El método es solo adecuado para listas cortas de datos.
• A la hora de analizar la complejidad del método secuencial, tenemos
que tener en cuenta el caso mas favorable y el mas desfavorable.
• Cuando el elemento no se encuentra tiene que realizar las n
comparaciones. Y en los casos en que el elemento buscado se
localiza, este podrá estar en el primer lugar, en el último o en un
lugar intermedio.
• Entonces, al buscar un elemento en un arreglo de N componentes
se harán:
• N comparaciones si el elemento no se localiza
• N comparaciones si el elemento está en la última posición
• 1 comparación si está en el primer lugar
• i comparaciones si está en un lugar intermedio (posición 1 < i < N)
• Analizando lo escrito anteriormente podemos suponer que el
número medio de comparaciones a realizar es de (n + 1) / 2 , que es
aproximadamente igual a la mitad de los elementos de la lista.
Búsqueda Secuencial
• Una aplicación de la búsqueda puede ser en:
• Vector: Se recorre el vector de izquierda a derecha hasta encontrar
una componente cuyo valor coincida con el buscado ó hasta que se
acabe el vector. En este último caso el algoritmo debe indicar la noexistencia de dicho valor. Este método es válido para vectores
ordenados o no, aunque para los vectores ordenados veremos
otros métodos mas eficientes.
• Vector Ordenado: Cuando el vector de búsqueda esta ordenado se
consigue un algoritmo mas eficiente, sin mas que modificar la
condición de fin del caso anterior. La ventaja que se obtiene es que
una vez sobrepasado el valor buscado, no es necesario recorrer el
resto del vector para saber que el valor no existe.
• Matriz: Se realiza mediante el anidamiento de dos bucles de
búsqueda HASTA cuya finalización vendrá dada por la aparición del
valor buscado o la terminación de la matriz. El recorrido se podrá
hacer indistintamente por fila o por columna.
Búsqueda de máximos y mínimos
• En muchos casos, es necesario determinar el mayor o el
menor valor de un conjunto de datos.
• Existen diversos algoritmos para esta determinación, en
la mayoría de ellos se realizan comparaciones sucesivas
de todos y cada uno de los datos resguardando en una
variable auxiliar el valor que resulte mayor o menor, de
acuerdo a lo que se busque, de manera tal que cuando
no existan mas datos para comparar, esta variable
auxiliar contendrá el valor máximo o mínimo buscado.
• Existen tres métodos para la resolución de este
problema:
– Ramificación del árbol
– Campeonato
– Supuesto o prepo
Ramificación del árbol: Consiste en las
combinaciones de comparaciones de todas las
variables que intervienen. Este método se
realiza teniendo en cuenta que todos los
campos deben estar simultáneamente en
memoria (es del tipo de búsqueda interna).
Este método es al que tienden naturalmente
todos los alumnos, en primera instancia, para
la resolución del problema.
Inicio
A
Comenzar
Mientras no EOF
Leer A,B,C
Si A>B
Entonces
Si A>C
Entonces
Imprimir “Mayor “A
Si_no
Si B>C
Entonces
LEER
A,B,C
EOF()
SI
PARAR
NO
"MAYOR B"
SI
Imprimir
B>C
NO
A >B
NO
SI
A >C
"MAYOR A"
SI
NO
“Mayor “B
Si_no
"MAYOR C"
B>C
Imprimir
“Mayor “C
Fin_si
Fin_si
Si_no
Si B>C
Entonces
Imprimir “Mayor “B
Si_no
Imprimir “Mayor “C
Fin_si
Fin_si
Fin_mientras
Parar
NO
"MAYOR C"
A
"MAYOR B"
SI
• Campeonato: Consiste en la
comparación de a pares de
todas las variables que
intervienen. En este método
los campos también deben
estar simultáneamente en
memoria.
Inicio
A
LEER
A,B,C
EOF()
SI
PARAR
NO
MY = B
No
A >B
SI
MY = A
C > MY
SI
MY = C
NO
"Mayor es" MY
A
Inicio
A
• Supuesto o Prepo: Es el
que mas utilizaremos a lo
largo del curso y consiste en
suponer que una de las
variables que existen en
memoria, en el mismo
momento, es mayor o
menor de todas, y luego se
realiza las comparaciones
sucesivas con las restantes.
Este método se adapta para
los algoritmos de búsqueda
externa (los campos no
están simultáneamente en
memoria, sino que ingresan
registro a registro).
LEER
A,B,C
EOF()
SI
PARAR
NO
MY = A
B > MY
SI
MY = B
SI
MY = C
NO
C > MY
NO
MY
A
búsqueda externa.
Debemos tener en cuenta para el desarrollo del método con búsqueda
externa lo siguiente:
a) El ingreso de la información: los datos ingresan de a uno en la
memoria.
b) Se supone al primer dato como mayor (no cualquiera de los campos
como en búsqueda interna)
c) Se realiza la comparación de una variable (nota promedio) con
respecto a la variable auxiliar MAYOR, y se repite dicha
comparación hasta el fin del lote de datos, formando de esta
manera un CICLO DE BUSQUEDA.
Las mismas consideraciones son válidas para la búsqueda de
MINIMOS.
Inicio
Una variante de este ejemplo es
que la variable auxiliar tenga un
valor inicial, que pueda darse de
la siguiente manera:
•Para
la
determinación
de
máximos se colocará en la
variable el menor valor que por
la naturaleza de los datos pueda
requerirse.
•Para la determinación del
mínimo se colocará en la
variable el mayor valor que esta
pueda tomar, en función de la
naturaleza de los datos.
LEER
LU, PROM
MY = PROM
A
LEER
LU, PROM
EOF()
SI
"Promedio Mayor es"
MY
NO
PROM > MY
No
A
SI
MY = PROM
PARAR
Cabe aclarar que en el
último ejemplo se evita la
doble lectura.
El uso de estas técnicas, en
búsquedas internas, es
aconsejable cuando
manejamos un número
reducido de variables, con
las salvedades y
restricciones que en cada
uno de los métodos ya
mencionamos. En este
caso se recomienda el uso
de variables con subíndices
o subindicadas.
Inicio
MY = 0
A
LEER
LU, PROM
EOF()
SI
"Promedio Mayor es"
MY
NO
PROM > MY
No
A
SI
MY = PROM
PARAR
Búsqueda binaria
Es válido exclusivamente para datos ordenados y consiste en
comparar en primer lugar con la componente central de la
lista, y si no es igual al valor buscado se reduce el intervalo
de búsqueda a la mitad derecha o izquierda según donde
pueda encontrarse el valor a buscar.
El algoritmo termina si se encuentra el valor buscado o si el
tamaño del intervalo de búsqueda queda anulado.
Este mecanismo es muy eficaz para buscar un elemento
cualquiera que esté en una lista ordenada, y recibe el
nombre de Búsqueda Binaria o Dicotómica cuya resolución
se base en el algoritmo de divisiones sucesivas en mitades.
A
D
G
H
K
L
N
P
S
W
Buscar el valor G de la lista
1
5
10
IZQ
CENTRAL
DER
1
IZQ
2
4
CENTRAL
DER
3
IZQ= CENTRAL
4
DER
Con cada iteración del método el espacio de búsqueda se reduce a la mitad, por lo tanto el
número de comparaciones disminuye considerablemente en cada iteración. Esta
disminución es mas significativa cuanto mayor sea el número de elementos de la lista.
I nic io
I ngres ar
X
v (i)
i=1, 100
U LTI MO = 100
PR I MER O = 1
Part e Ent era
C EN TR AL =
[ (PR I MER O + U LTI MO) /
V(C EN TR AL)
2]
= X
SI
> X
SI
"R EGI STR O
EN C ON TR AD O"
V(C EN TR AL)
NO
V(C EN TR AL)
NO
PR I MER O =
C EN TR AL + 1
SI
PR I MER O <=
U LTI MO
NO
"R EGI STR O N O
EN C ON TR AD O"
PAR AR
U LTI MO =
C EN TR AL - 1
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
En Pseudocódigo:
Comenzar
Leer X
Ingresar V(I) I = 1,100
ULTIMO = 100
PRIMERO = 1
Hasta PRIMERO <= ULTIMO
CENTRAL = [(PRIMERO + ULTIMO) / 2]
Si V(CENTRAL) = X
Entonces
Imprimir “Registro encontrado “ V(CENTRAL)
Parar
Fin_si
Si V(CENTRAL) > X
Entonces
ULTIMO = CENTRAL – 1
Si_no
PRIMERO = CENTRAL + 1
Fin_si
Fin_Mientras
Imprimir “Registro no encontrado”
Parar
Búsqueda binaria
•
Igual que en el método secuencial la complejidad del método se va a
medir por los casos extremos que puedan presentarse en el proceso de
búsqueda.
•
El caso mas favorable se dará cuando el primer elemento central es el
buscado, en cuyo caso se hará una sola comparación. El caso mas
desfavorable se dará cuando el elemento buscado no está en las sublistas,
en este caso se harán en forma aproximada log 2(n) comparaciones, ya que
en cada ciclo de comparaciones el número de elementos se reduce a la
mitad, factor de 2. Por lo tanto, el número medio de comparaciones que
se realizarán con este método es de: (1 + log 2(n)) / 2
•
Si comparamos las fórmulas dadas en ambos métodos (ver apartado 5.1.1.
Método secuencial), resulta que para el mismo valor de N el método
binario es mas eficiente que el método secuencial; además la diferencia es
mas significativa cuanto mas crece N.
Clasificación
• Clasificar u ordenar significa reagrupar o reorganizar un conjunto de
datos en una secuencia específica. El proceso de clasificación y
búsqueda es una actividad muy frecuente en nuestras vidas. Vivimos
en un mundo desarrollado, automatizado, donde la información
representa un elemento de vital importancia.
• Los elementos ordenados aparecen por doquier. Registros de
pacientes en un hospital, directorios telefónicos, índice de libros en
una biblioteca, son tal solo algunos ejemplos de objetos ordenados
con los cuales el ser humano se encuentra frecuentemente.
• La clasificación es una actividad fundamental. Imaginémonos un
alumno que desea encontrar un libro en una biblioteca que tiene
100000 volúmenes y estos están desordenados o están registrados
en los índices por orden de fecha de compra. También podemos
pensar lo que ocurriría si deseamos encontrar el número de teléfono
de una persona y la guía telefónica se encuentra ordenada por
número.
Clasificación
Sea A una lista de N elementos:
A1, A2, A3, ........., An
Clasificar significa permutar estos elementos de tal forma que
los mismos queden de acuerdo con un orden
preestablecido.
Ascendente: A1 <= A2 <= A3 <= A4 ......<= An
Descendente: A1 >= A2 >= A3 >= A4 ...... >=An
En el procesamiento de datos, a los métodos de ordenación se
les clasifica en dos categorías:
– Categoría de arreglos
– Categoría de archivos
Clasificación
En cuanto a la cantidad de comparaciones que se realizan en un algoritmo se puede
clasificar en:
– Directos de orden O (N2)
– Logarítmicos de orden O(N * log N)
Los métodos directos tienen la característica de que su resolución es mas corta, de
fácil elaboración y comprensión, aunque son ineficientes cuando el número de
elementos de un arreglo N, es mediano o considerablemente grande.
Los métodos logarítmicos son mas complejos con respecto a los directos, pero
requieren menos comparaciones y movimientos para ordenar sus elementos, pero
su elaboración y compresión resulta mas sofisticada y abstracta.
•
Se debe tener en cuenta que la eficiencia entre los distintos métodos se mide por
el tiempo de ejecución del algoritmo y este depende fundamentalmente del
número de comparaciones y movimientos que se realicen entre sus elementos.
•
Por lo tanto podemos decir que cuando N es pequeño debe utilizarse métodos
directos y cuando N es mediana o grande deben emplearse métodos logarítmicos.
Clasificación
Métodos:
Directos:
– Ordenación por Intercambio Directo (Burbuja)
– Ordenación por Selección (Obtención sucesivas de
menores)
– Ordenación por Inserción (Baraja)
Logarítmicos:
– Método de Shell (Inserción con incrementos decrecientes)
– Método de QuickSort (Clasificación Rápida)
Ordenación por intercambio (BURBUJA).
Este método tiene dos versiones basadas en la misma idea
que consiste en recorrer sucesivamente la lista o arreglo,
comparando pares sucesivos de elementos adyacentes,
permutando los pares desordenados.
Se realizan (n-1) pasadas, transportando en cada pasada el
menor o mayor elemento (según sea el caso) a su
posición ideal. Al final de las (n-1) pasadas los elementos
del arreglo estarán ordenados.
El recorrido del vector se puede hacer de izquierda a
derecha (desplazando los valores mayores hacia su
derecha) o de derecha a izquierda (desplazando los
valores menores hacia su izquierda), ambos para la
clasificación en orden ascendente.
Ordenación por intercambio (BURBUJA).
El algoritmo de resolución deberá seguir los siguientes pasos:
• Comparar elemento (1) y elemento (2); si están ordenados,
se deja como está; caso contrario se realiza el intercambio.
• Se comparan los dos elementos siguientes adyacentes
elemento (2) y (3); y de nuevo se intercambia si es
necesario.
• El proceso continúa hasta que cada elemento del arreglo
haya sido comparado con sus elementos adyacentes y
hayan sido intercambiados en los casos necesarios.
Ordenación por intercambio (BURBUJA).
La acción de intercambiar los elementos
adyacentes requiere de una variable auxiliar.
El proceso de esta triangulación será:
AUX = A(I)
A(I) = A(I+1)
A(I+1) = AUX
V =
15
42
33
7
10
PRIMERA PASADA
1º Compar.
15
42
33
7
10
2º Compar.
15
42
33
7
10
7
10
I N TER C AMBI A
3º Compar.
15
33
42
I N TER C AMBI A
4º Compar.
15
33
7
42
10
I N TER C AMBI A
FIN DE LA
PA SA DA
15
33
7
10
Luego de la primera pasada y al cabo de las
n-1 comparaciones el valor mas grande f ue
situado en la última posición.
42
SEGUNDA PASADA
1º Compar.
15
33
7
10
42
2º Compar.
15
33
7
10
42
10
42
I N TER C AMBI A
3º Compar.
15
7
33
I N TER C AMBI A
4º Compar.
FIN DE LA
PA SA DA
15
15
7
10
10
7
33
33
42
42
Luego de la segunda pasada y al cabo de
las n-1 comparaciones el s egundo v alor
mas grande f ue s ituado en la penúltima
posición.
. . . . . . . .
Es te p roce so de llev ar el mayor va lor hac ia la p arte derech a d el
vector se repite hasta la última pasada, la cual nos as egura que el
vector queda completamente ordenado.
7
10
15
33
42
Ordenación por intercambio (BURBUJA).
Luego de este análisis y en forma genérica podemos observar
que si se efectúan n-1 pasadas y a su vez cada pasada
requiere n-1 comparaciones, la ordenación total de una
tabla exigirá
(n-1) * (n-1) = (n-1)2 comparaciones de elementos.
La cantidad de movimientos que se realicen en el arreglo
dependerá del grado de desorden en que estén los datos.
Otro aspecto a considerar es el tiempo necesario para la
ejecución del algoritmo, el mismo es proporcional a n2.
COMENZAR
INGRESAR
N
LEER
A(I)
I = 1, N
J = 1
I = 1
Ciclo de
Comparaciones dentro
de cada pasada
A(I) > A(I+1)
NO
Ciclo de Pasadas
SI
AUXI = A(I)
A(I) = A(I+1)
A(I+1) = AUXI
Se permuta el par
utlizando una v ariable
auxiliar, si están
desordenados
I = N - 1
NO
I = I + 1
NO
J = J + 1
SI
J = N - 1
SI
PARAR
Ordenación por intercambio (BURBUJA).
Comenzar
Ingresar N
Ingresar A(I) I = 1,N
Desde J = 1 hasta N –1
Desde I = 1 hasta N –1
Si A(I) > A(I+1)
Entonces
AUXI = A(I)
A(I) = A(I+1)
A(I+1) = AUXI
Fin_si
Fin_desde
Fin_desde
Parar
Ordenación por selección
Este método consiste en buscar o seleccionar el elemento menor del arreglo
y colocarlo en la primera posición, si el ordenamiento es ascendente.
Luego se busca el segundo elemento mas pequeño y se lo ubica en la
segunda posición y así sucesivamente hasta llegar al último elemento. Por
basarse este mecanismo en obtener los menores y ubicarlos en la posición
ideal, recibe el nombre de obtención sucesiva de menores.
•
Con este mecanismo, si pretendemos ordenar en forma creciente una
tabla que posee 100 elementos, el método obliga a recorrer la tabla tantas
veces como elementos tenga menos uno.
•
En el primer recorrido se averigua cual es el elemento menor y se
intercambia con el que esté en la primera posición de la tabla.
•
En el segundo recorrido se averigua el menor entre los restantes
elementos y se lo intercambia con el que está en la segunda posición.
•
El resto de los recorridos utilizará la misma lógica.
V =
15
42
10
7
33
TERCER RECORRIDO: Asigna 42 como menor valor
PRIMER RECORRIDO: Se asigna 15 como menor valor
1º
MENOR
15
2º
MENOR
10
7
15
42
10
7
<
15
42
10
10
42
15
33
33
7
1º
MENOR
15
2º
MENOR
15
7
10
42
15
33
42
15
33
33
GU AR DA MENOR
GU AR DA MENOR
3º
MENOR
7
4º
MENOR
7
15
42
10
7
FIN DE
R EC ORR I D O
GU AR DA MENOR
15
42
7
10
10
33
7
7
10
15
42
33
33
I N TER C AMBI A
FIN DE
R EC ORR I D O
7
42
10
15
Al f inalizar el ter cer re corr ido int erca mbia el me nor va lor
av erig uado ent re los e leme ntos res tant es, en la p osic ión
c or re sp o nd ie nt e al t e rc er r ec o rr id o. En es t a in st ac ia se
realizaron (n-3) comparaciones.
33
I N TER C AMBI A
En el primer recorrido averigua el menor valor y guarda el mismo
y s u po sic ió n en v ar iab le s au x ilia re s . Al f in al de l re co r rido
intercambia. En este recorrido realizó (n-1) comparaciones.
SEGUNDO RECORRIDO: Asigna 42 como menor valor
7
1º
MENOR
10
2º
MENOR
10
42
7
10
42
15
CUARTO RECORRIDO: Asigna 42 como menor valor
33
7
10
15
33
1º
MENOR
33
10
7
GU AR DA MENOR
3º
MENOR
10
FIN DE
R EC ORR I D O
15
10
42
15
33
42
33
33
42
GU AR DA MENOR
7
42
10
15
33
7
42
10
15
33
7
10
42
15
33
FIN DE
R EC ORR I D O
7
10
15
I N TER C AMBI A
I N TER C AMBI A
En el segundo recorrido averigua siguiente de menor valor y lo
g ua rda co n su p os ic ión e n v ariab les au xiliare s. A l f inal de l
r e c o r r id o in t e r c a mb ia . En es t e r e c o r r id o r e a liz ó ( n - 2 )
comparaciones.
A l c ab o d e l cu a r t o y ú lt imo r ec o rr id o rea liz a u n a s o la
co mpar ació n en tre el ú ltimo elemen to y el supu esto menor
guardado en la variable auxiliar. En este caso corresponde el
intercambio dado que el valor 42 es el mayor y por lo tanto
de be ser movido a la últ ima po sición. En e sta in stan cia el
vector queda ordenado completamente. En la última pasada
se realiza 1 sola comparación.
Ordenación por selección
Si analizamos el desarrollo anterior podemos darnos cuenta que se realizan (n-1)
recorridos, lo cual es un inconveniente del método dado que nos obliga a
recorrer la lista un número fijo de veces, sin detectar si esta queda ordenada en
alguno de los recorridos.
Al igual que en el método por intercambio, el número de comparaciones entre
elementos es independiente de la disposición inicial de los mismos.
En el primer recorrido se realizan (n-1) comparaciones, en el segundo recorrido (n-2)
comparaciones y así sucesivamente hasta llegar al último recorrido en la cual se
realiza 1 comparación.
Por lo tanto la cantidad total de comparaciones la expresamos de la siguiente
manera:
C = (n-1) + (n-2) + ...... + 2 + 1 = n * (n-1) / 2
Que es igual a:
C = n2 – n / 2
En cuanto al número de movimientos será n-1 ya que el método, tal cual está
desarrollado, realiza intercambio de un elemento consigo mismo.
COMENZAR
LEER N
LEER
V(I) I = 1, N
Comenzar
Leer N
Ingresar V(I) I = 1,N
Desde I = 1 hasta N –1
MENOR = V(I)
K=I
Desde J = I + 1 hasta J = N
Si V(J) < MENOR
Entonces
MENOR = V(J)
K=J
Fin_si
Fin_desde
V(K) = V(I)
V(I) = MENOR
Fin_desde
Parar
I = 1
MENOR= V(I)
K = I
J = I + 1
V(J) < MENOR
Selecciona los
elementos menores
SI
MENOR = V(J)
K = J
NO
J = J + 1
No
J = N
Realiza el intrecambio
SI
V(K) = V(I)
V(I) = MENOR
I = N - 1
SI
PARAR
No
I = I + 1
Ordenación por Inserción
• Continuamos en la próxima clase …
Descargar