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