Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad de Inform
atica, Grupo 2B
Universidad Polit
ecnica de Valencia
Tema 1:
Divide y Vencer
as
Selecci
on del N-
esimo mnimo
Enrique Vidal Ruiz
evidal@iti.upv.es
Octubre, 2000
E. Vidal UPV
AD3-D&V/Select-1.4
Octubre, 2000
Divide y Vencer
as (D&V): Indice
E. Vidal UPV
Pagina 1.4.1
AD3-D&V/Select-1.4
Octubre, 2000
Selecci
on simple por intercambio ((N n), O(n2)),
por ordenaci
on (n log n) y por partici
on (O(n))
/*
Programa de prueba de algoritmos de Selecci
on
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
*/
#define maxTalla
4096
int v[maxTalla];
/* v[0..4095]
/* ---------------------------------------------------------------------Inselec Selecci
on por b
usqueda exhaustiva -- peor caso cuadr
atico
*/
int inSelec(int p, int r, int i) {
/* [ 0<p<=r<maxVec, 1<=i<=r-p+1 ]
int j, k, q, menor, aux;
for (k = 1; k <= i; k++) {
/* buscamos los i primeros m
nimos
q = p+k-1; menor=q;
for (j = q+1; j <= r; j++) if (v[j] < v[menor]) menor=j;
aux=v[q]; v[q]=v[menor]; v[menor]=aux;
/* intercambio
}
return(v[p+i-1]);
}
E. Vidal UPV
*/
*/
*/
*/
Pagina 1.4.2
AD3-D&V/Select-1.4
Octubre, 2000
/* intercambio */
Pagina 1.4.3
AD3-D&V/Select-1.4
Octubre, 2000
/* ---------------------------------------------------------------------Selecci
on por divide/vencer
as basada en partici
on -- Coste medio O(n)
*/
int partSelec(int p, int r, int i) {
/* [ 0<p<=r<maxVec, 1<=i<=r-p+1 ] */
int m,q;
if (p==r) /* && (i==1) */ return(v[p]);
q=separa(p,r);
m=q-p+1;
/* precondici
on:
if (i<=m) return(partSelec(p,q,i));
else
return(partSelec(q+1,r,i-m));
E. Vidal UPV
Pagina 1.4.4
AD3-D&V/Select-1.4
Octubre, 2000
/* =======================================================================
Lectura de datos e invocaci
on algoritmo
*/
void main() {
int i,j,N,M, vv, indDat, algor; int w[maxTalla];
printf("Prueba de algoritmos de selecci
on "
"(N-best) [0=inSelec, 1=qks, 2=partSel] \n");
printf("Introduce valores a considerar (fin con ^D):\n\n");
j=0; while ((scanf("%d", &vv) != EOF) && (j<=maxTalla)) w[j++]=vv;
indDat=j-1;
printf("\n");
E. Vidal UPV
Pagina 1.4.5
AD3-D&V/Select-1.4
Octubre, 2000
/* ----------------------------------------------------------------------Especificaci
on de N y del Algoritmo a usar e invocaci
on del mismo
*/
do {
printf("Valor de N (N-
esimo m
nimo) y Algoritmo [0, 1, 2]): ");
if ((scanf(" %d %d", &N, &algor) == EOF) || (N<1) || (N>maxTalla)) break;
Pagina 1.4.6
AD3-D&V/Select-1.4
Octubre, 2000
Selecci
on del N-
esimo mnimo por D&V: Traza
Instancia: v = [55, 33, 22, 66, 44, 11, 33, 77]; N = 3
Vector ordenado: v 0 = [11, 22, 33, 33, 44, 55, 66, 77]
Selec(1, 8, 3)
Separa(1, 8) = 5
Selec(1, 5, 3)
Separa(1, 5) = 2
Selec(3, 5, 1)
Separa(3, 5) = 3
Selec(3, 3, 1)
E. Vidal UPV
55
33
33
33
22
22
66
11
44
44
11
66
33
55
77
77
33
11
33
22
22
33
11
33
44
44
33
33
33
33
44
44
33
Pagina 1.4.7
AD3-D&V/Select-1.4
Octubre, 2000
Prestaciones de 3 t
ecnicas de selecci
on con datos (short) aleatorios
# Inst. aleatorias; algoritmos:
# N-esimo minimo, N <= talla (N
#
for t in 100 1000 10000 100000 ;
echo -n "
" ; selectime -a
done ; done ; echo
a=2 N=100
a=1 N=100
a=0 N=100
t=100
t=100
t=100
60.00 segundos
60.01 segundos
60.01 segundos
a=2 N=1000
a=1 N=1000
a=0 N=1000
t=1000
t=1000
t=1000
60.00 segundos
60.00 segundos
60.03 segundos
a=2 N=10000
a=1 N=10000
a=0 N=10000
t=10000
t=10000
t=10000
: Procesadas
: Procesadas
: Procesadas
60.00 segundos
60.04 segundos
62.80 segundos
11105 instancias en
1335 instancias en
15 instancias en
AD3-D&V/Select-1.4
Octubre, 2000
t=100
t=100
t=100
60.00 segundos
60.01 segundos
60.00 segundos
a=2 N=5
a=1 N=5
a=0 N=5
t=1000
t=1000
t=1000
: Procesadas
: Procesadas
: Procesadas
164317 instancias en
17544 instancias en
173162 instancias en
60.00 segundos
60.01 segundos
60.01 segundos
a=2 N=5
a=1 N=5
a=0 N=5
t=10000
t=10000
t=10000
: Procesadas
: Procesadas
: Procesadas
17218 instancias en
1410 instancias en
16382 instancias en
60.00 segundos
60.02 segundos
60.00 segundos
a=2 N=5
a=1 N=5
a=0 N=5
t=100000 : Procesadas
t=100000 : Procesadas
t=100000 : Procesadas
1674 instancias en
117 instancias en
1643 instancias en
60.01 segundos
60.22 segundos
60.03 segundos
E. Vidal UPV
Pagina 1.4.9