Академический Документы
Профессиональный Документы
Культура Документы
Algoritmos de Bsqueda
INSTRODUCCION
Los algoritmos de bsqueda tienen
como
finalidad
localizar
un
elemento dado dentro de una
estructura de datos o determinar
su inexistencia.
Naturalmente, la bsqueda ser
mucho
ms
eficiente
si
la
estructura de datos (en nuestro
caso el vector) est ordenada.
As,
los
algoritmos
que
estudiaremos
servirn
para
realizar bsquedas en vectores
ordenados.
ALGORITMOS DE
BUSQUEDA
A
lo
largo
de
esta
leccin
estudiaremos
los
siguientes
algoritmos de bsqueda:
Bsqueda secuencial.
Bsqueda
secuencial
con
centinela.
Bsqueda binaria (o dicotmica)
Bsqueda por interpolacin.
Se
presentar
pseudocdigo
y
anlisis de la complejidad para cada
uno de los algoritmos.
BUSQUEDA
SECUENCIAL
El algoritmo de bsqueda ms
sencillo recorre el vector desde el
primer elemento hasta el ltimo y
si encuentra el valor buscado
retorna su posicin o avisa que lo
encontro.
Obviamente, se trata del nico
algoritmo posible si el vector no
est ordenado.
Sin embargo, si el vector est
ordenado resulta muy ineficiente.
BUSQUEDA SECUENCIAL
Funcion busquedaSecuencial(v, n, valor): lgico
entero: i, n
logico: encontro
encontrofalso
para i0 hasta n hacer
si v(i)=valor entonces
encontroverdadero
fin si
finpara
retornar encontro
finbusquedaSecuencial
Como se puede apreciar el algoritmo
BUSQUEDA SECUENCIAL
CON CENTINELA
El
algoritmo
de
bsqueda
secuencial resulta muy ineficiente
puesto que no se aprovecha del
hecho de que el vector est
ordenado.
Es posible modificarlo para que,
teniendo
en
cuenta
esa
circunstancia, finalice en cuanto
localice el elemento o se determine
que ste no existe.
Esta modificacin se conoce como
bsqueda secuencial con centinela.
Funcion BusSecSentinela(v, n,
valor):logico
i0
mientras v(i)<valor y i<n
hacer
ii+1
finmientras
si v(i)=valor entonces
encontroverdadero
sino
encontrofalso
finsi
finBusSecSentinela
BUSQUEDA SECUENCIAL
CON CENTINELA
La bsqueda secuencial con
centinela no precisa recorrer el
vector por completo.
El caso mejor se produce cuando
el elemento a buscar es el primero
del vector o menor que todos los
elementos del vector. Entonces la
complejidad es O(1).
El caso peor se da cuando el
elemento a buscar es el ltimo del
vector o mayor que todos los
elementos del vector. Entonces la
complejidad es O(n).
Por trmino medio, el algoritmo
emplea
del
orden
de
n/2
iteraciones,
por
lo
cual
la
complejidad del caso medio
tambin sera O(n).
BUSQUEDA BINARIA
La idea bsica de la bsqueda
binaria o dicotmica es reducir el
tamao del problema a la mitad en
cada iteracin.
Cuando el tamao del problema,
esto es del vector, sea 1 se puede
resolver la bsqueda de forma
directa.
La estrategia empleada por este
algoritmo es muy similar a la del
juego patata caliente...
BUSQUEDA BINARIA
Funcion BusquedaBinaria(v, valor): entero
posicion-1
encontradofalso
izq1
derMAX
mientras no encontrado y izq der hacer
medio(izq+der)/2
Si v(medio)=valor entonces
posicionmedio
encontradoverdadero
sino
si v(medio)>valor entonces
dermedio-1
sino
izqmedio+1
finsi
finsi
fin mientras
busquedaBinariaposicion
fin funcion
BUSQUEDA BINARIA
En el vector (1,1,2,3,4,5,5,5,6,9) se va a
buscar, de forma binaria, el nmero 7
Observacin
que bastan 4 iteraciones para determinar
que el nmero 7 no se encuentra en el
vector.
BUSQUEDA BINARIA
El algoritmo de bsqueda
binaria divide el tamao
del vector por 2 hasta
quedarse con un vector de
tamao 1.
Al llegar al tamao unitario
se
puede
determinar
directamente
si
el
elemento buscado existe o
no.
As, el algoritmo de
bsqueda binaria realiza
log2(n) iteraciones y, por
tanto, su complejidad es
O(log n).
BUSQUEDA POR
INTERPOLACION
Consiste en tratar de acertar en qu
parte del intervalo est la clave que
se esta buscando en lugar de
ciegamente dividir el arreglo a la
mitad. Para ello se utiliza la siguiente
frmula:
BUSQUEDA POR
INTERPOLACION
funcion busquedaInterpolacion (v,valor) :entero
entero: v(max), valor
entero: izq,der, presunto, busqueda
izq1
dermax
mientras ((v[der] valor) y (v[izq] < valor))
pizq+(valor-v[izq])*(der - izq) /(v[der]-v[izq])
si (valor > v[p]) entonces
izqp+1
sino
si (valor < v[p]) entonces
derp-1
sino
izqp
finsi
finsi
finmientras
si (v[izq]=valor) then
busquedaizq
sino
busqueda -1
finsi
retornar busqueda
finBusquedaDeInterpolacion
CONCLUSIONES DE
BUSQUEDA
La bsqueda es una de las operaciones de
tratamiento de vectores ms habituales.
Una bsqueda en un vector no ordenado
tendra una complejidad O(n); por esa razn es
preferible implementar algoritmos de bsqueda
en vectores ordenados.
Hemos estudiado 4 algoritmos de bsqueda:
Bsqueda secuencial.
Bsqueda secuencial con centinela.
Bsqueda binaria.
Bsqueda por interpolacin.
CONCLUSIONES DE
BUSQUEDA
El primer algoritmo es el ms simple de los cuatro,
recorre completamente el vector y no precisa que el
vector es ordenado; su complejidad es O(n).
El segundo algoritmo recorre el vector hasta que se
encuentra el valor buscado o se determina que ste no
existe. Su complejidad es O(n).
El algoritmo de bsqueda binaria divide en cada iteracin
el vector en dos realizando la bsqueda en una sola de
las mitades. Su complejidad es O(log n).
La bsqueda por interpolacin es una modificacin del
algoritmo de bsqueda binaria, tambin de complejidad
O(log n).
ALGORITMICA III
Algoritmos de Clasificacin
INTRODUCCIN
Sea A una lista de N elementos:
A1, A2, A3, ..., An
Se busca permutar estos elementos de
tal forma que los mismos queden de
acuerdo con un orden preestablecido.
Ascendente: A1 A2 A3 ... An
Descendente: A1 A2 A3 ... An
INTRODUCCIN
Aunque tanto el tipo y tamao de los
elementos como el dispositivo en donde se
encuentran almacenados pueden influir en
el mtodo que utilicemos para ordenarlos,
en este tema vamos a solucionar el caso en
que los elementos son nmeros enteros y se
encuentran almacenados en un vector.
Si bien existen distintos criterios para
clasificar a los algoritmos de ordenacin,
una posibilidad es atendiendo a su
eficiencia. De esta forma, en funcin de la
complejidad que presentan en el caso
medio, podemos establecer la siguiente
clasificacin:
(n 2):
Burbuja, Insercin, Seleccin.
(nlogn): Mezcla, Quicksort.
Otros:
Shell (n1.25).
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
c7
(c 4 c 7)
t (n) ( (c1 c 2 (c3
(n i )) c5 c6))
2
i 1
n 1
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
algoritmo seleccin(a, n)
para i1 hasta n-1 hacer
menora[i]
ki
para ji+1 hasta n
si a[j]<menor entonces
menora[j]
kj
finsi
finpara
a[k]a[i]
a[i]menor
finpara
finseleccion
C (n 1) (n 2) ... 2 1
n2 n
C
2
n * (n 1)
2
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
es
de
complejidad
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
C (n 1) (n 2) ... 2 1
n2 n
C
2
algoritmo burbuja(a, n)
para i1 hasta n-1 hacer
para jn hasta i+1 por -1 hacer
si a[ j-1]> a[ j ] entonces
auxa[j-1]
a[ j-1]a[ j ]
a[ j ]aux
finsi
finpara
finpara
finburbuja
n * (n 1)
2
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
algoritmo insercion(a, n)
para i2 hasta n
xa[i]
ji-1
mientras (j1) y (x<a[j]) hacer
a[ j+1]a[ j ]
jj-1
finmientras
a[j+1]x
finpara
fininsercion
Observacin:
se sale de REPETIR ..HASTA cuando la condicin es verdadera
1 5
5
2 1
2 ra . P a sa d a :
1
1 5
5
2 1
1 5
5
0 8
1 5
0
0 7
7
6 7
1 6
2 1
1
1 0
0
0 8
8
1 6
4 4
0 8
1 6
4
4 4
4
4 4
2 7
4 4
2 7
2 7
0 7
2 7
0
0 8
8
1 2
3 5
1 0
0 7
1
1 6
5 6
5 6
1 0
5 6
5
5 6
2 1
6 7
6 7
3
3 6
1 3
1 3
1 3
1 2
2
2 8
6 0
2 8
2 8
6 0
6 0
2 8
3 6
3 6
6
6 0
0
0 7
3 6
1 2
6
6 7
7
1 0
1 2
3 5
3 5
1
1 3
3
3 5
5
3 r a .. P a s a d a :
0 7
7
1 0
0
0 8
8
4 t a . P a ss a
ada :
0 7
0
0 8
8
1 5
0 7
1 0
2 1
1
1 6
1 0
0
1 2
0 7
1 2
0 8
1
1 3
1 0
0
2 1
1 6
1 5
4 4
4
2 7
1 3
1 2
2
1 6
0 8
2 7
2 1
1 3
2
2 1
1
1 6
1 5
2 7
2 7
5 6
2 8
1 5
2 8
3 6
1 2
4 4
2 8
3 5
2 8
3 5
4 4
3 6
6 0
6 7
5 6
3 5
1 3
3
3 6
5 6
4 4
3 5
6 0
3 6
5 6
6 7
6 0
0
6 0
0
6 7
6 7
rpida
no hay intercambio
no hay intercambio
no hay intercambio
si hay intercambio
44 27 67 35
C (n 1) 2 *
(n 1)
(n 1)
(n 1)
4*
... (n 1) *
2
4
(n 1)
C (n 1) (n 1) (n 1) ... (n 1)
C (n 1) * m
Considerando que el numero de trminos de la sumatoria
es igual al numero de pasadas y que este es igual a log n
la expresin queda:
C (n 1) * log n
Laboratorio
Implementando los siguientes algoritmos de clasificacin en
java o C++, en arreglos:
Seleccin
Insercion
Shell
Quicksort
1.Pruebe todos ellos con la misma entrada (n) y evalu la
diferencia en el numero de comparaciones e intercambios que
realiza para ordenar el conjunto de datos.
2.Pruebe luego para todos ellos con diferentes tamaos de
entrada(n) y aprecie la evolucin del tiempo de ordenacin con
respecto al numero de datos a ordenar. Haga una grafica.