Soluci on de la pregunta 2

Anuncio
Solucion de la pregunta 2
Nuestra solucion se fundamenta en una funcion recursiva proximos y otra funcion auxiliar,
en recursiva.
proximos raiz tambi
Si el (sub)arbol T que nos dan es vaco obviamente ningun par de puntos se encuentra a
distancia inferior a r. Si T no es vaco y existiese un par de puntos a distancia inferior a r, dicho
par o estara en el subarbol izquierdo o en el subarbol derecho o bien estara constitudo por la raz
y otro punto. La operacion proximos raiz tiene como mision determinar si nos encontramos en
el ultimo caso, es decir, devuelve cierto si y solo si existe un punto q, distinto de la raz p del
arbol dado T , tal que la distancia entre p y q es menor que el valor dado r.
Tanto la funcion proximos como la funcion proximos raiz reciben adicionalmente como
parametros el nivel j del subarbol T en curso y la dimension K del conjunto (en la llamada
inicial j = 0 y K = C:dim).
Se~nalamos tambien que evitaremos efectuar calculos y llamadas recursivas tan pronto como
el resultado pueda quedar determinado: p.e. si encontramos un par de puntos en el subarbol
izquierdo, no buscaremos en el subarbol derecho ni llamaremos a proximos raiz, ya que no es
necesario.
funcion proximos(t : kdtree; r : real; j; K : nat) retorna bool
var hay prox : bool fvar
si t =6 nil entonces
si : proximos(t " :f e; r; j + 1; K ) entonces
si : proximos(t " :f d; r; j + 1; K ) entonces
hay prox := proximos raiz(t; r; j; K )
sino . hay un par proximo en el subarbol derecho
hay prox := cierto
fsi
sino . hay un par en el subarbol izquierdo
hay prox := cierto
fsi
sino
hay prox := falso
fsi
retorna hay prox
uncion
La funcion proximos raiz consistira en una sencilla modicacion del procedimiento de
busqueda en region para arboles K -dimensionales: pero en vez de hallar todos los puntos a
distancia inferior a r del punto p en la raz, basta con encontrar un punto (distinto de p) que se
encuentre dentro de la region mencionada.
1
funcion proximos raiz(t : kdtree; r : real; j; K : nat) retorna bool
var hay prox raiz : bool fvar
si : hay en region(t " :f e; t " :p; r; j + 1; K ) entonces
hay prox raiz := hay en region(t " :f d; t " :p; r; j + 1; K )
sino
hay prox raiz := cierto
fsi
retorna hay prox raiz
uncion
funcion hay en region(t : kdtree; p : puntkd; r : real; j; K : nat)
retorna bool
var q : puntkd; d : nat; hay prox : bool fvar
si t =6 nil entonces
q := t " :p
si dist(q; p) < r entonces
hay prox := cierto
sino
hay prox := falso
d := (j + 1) mod K
si coord(p; d) coord(q; d) + r entonces
hay prox := hay en region(t " :f e; p; r; j + 1; K )
fsi
si (coord(p; d) > coord(q; d) , r) ^ : hay prox entonces
hay prox := hay en region(t " :f d; p; r; j + 1; K )
fsi
fsi
sino
hay prox := falso
fsi
retorna hay prox
uncion
Para calcular el coste promedio proximos |no se peda que lo hicierais| en funcion del
numero de puntos en el arbol, supondremos que el arbol esta razonablemente equilibrado y que
r no es muy grande.
Entonces el coste promedio de proximos raiz es O(n ) con < 1, ya que es una variante de
la busqueda en region. Y el coste promedio P (n) de proximos viene descrito por la recurrencia
P (n) O(n ) + 2P (n=2):
Puesto que log2 2 = 1 y < 1, conclumos que P (n) = O(n).
2
Documentos relacionados
Descargar