Sei sulla pagina 1di 4

GUIA DE EJERCICIOS.

ARBOLES BINARIOS. MATEMÁTICAS DISCRETAS

SERGIO HERNÁNDEZ
FACULTAD DE CIENCIAS DE LA INGENIERIA
UNIVERSIDAD CATÓLICA DEL MAULE
SHERNANDEZ@UCM.CL

1. Introducción
Las búsquedas en espacios multidimensionales (datos espaciales, imágenes, audio, etc)
son costosas debido a la comparación exhaustiva de distancias entre objetos. De modo
de obtener una indexación adecuada, podemos recurrir a las propiedades de los espacios
métricos. Dado un espacio vectorial X ⊂ RD y una función de distancia d : X × X 7→ R,
para cada par de elementos x, y ∈ X tenemos que :

d(x, y) > 0
d(x, y) = 0 =⇒ x = y
d(x, x) = 0
d(x, y) + d(y, z) ≥ d(x, z) desigualdad triangular
La complejidad de evaluar de manera exhaustiva las distancias entre objetos depende no
solo de la cantidad de objetos n sino que también de la dimensionalidad D. Por lo tanto
se hace necesario contemplar mecanismos eficientes de indexación.

2. Búsqueda por ı́ndices


Un método de búsqueda por ı́ndices son los KD-trees, los cuales se basan en árboles
binarios. El método para construir los árboles binarios realiza cortes sobre la mediana de un
eje y produce un árbol de altura log(n). El árbol puede ser construido de manera recursiva
con un costo O(n log n), el cual efectivamente es menor que la búsqueda exhaustiva O(n2 ).
La Figura 1 muestra una árbol binario. Los hijos de cada nodo corresponden a la posición
de la mediana del eje seleccionado para cada profundidad.

1
2
SERGIO HERNÁNDEZ FACULTAD DE CIENCIAS DE LA INGENIERIA UNIVERSIDAD CATÓLICA DEL MAULE SHERNANDEZ@UCM.

B C

E F

Figure 1. Arbol binario que representa un KD-Tree. Cada nivel del árbol
representa un corte basado en la mediana del eje de corte

De manera de consultar por los vecinos más próximos (nn), descendemos por el árbol y
mantenemos un punto candidato a ser el nn y un valor máximo conocido de la distancia
al punto de consulta. Luego chequeamos los sub-árboles dependiendo del eje de corte
continuamos por una de las ramas. Un ejemplo tı́pico es la búsqueda por rangos en consultas
geoespaciales.

3. Ejercicios
Supongamos que tenemos una aplicación móvil que busca ciudades cercanas y la re-
comendación depende de la ubicación del usuario. Se solicita implementar el algoritmo
KD-trees para hacer búsquedas de puntos de referencia. Dado un punto de origen y otro
de destino, se necesita implementar:
(1) Un método que retorne los K nodos más cercanos en ambos puntos.
(2) Un método que retorne todos los nodos dentro de un radio de M metros hacia
ambos puntos.

Ciudad Longitud Latitud


Origen −71.6200539 −35.434415
Destino −71.666645 −35.425901
El informe debe incluir el detalle del problema y la implementacin, cdigo y evaluacin de
la solucin. El siguiente código lee datos (nombre, latitud, longitud) desde un archivo ESRI
shapefile y los carga en memoria. Completar las siguientes funcionalidades:
GUIA DE EJERCICIOS. ARBOLES BINARIOS. MATEMÁTICAS DISCRETAS 3

Program 1 Ciclovias de Talca


import networkx as nx
import pandas as pd
import numpy as np

from math import radians, cos, sin, asin, sqrt

class Node:pass

def haversine(lon1, lat1, lon2, lat2):


lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r

def kdtree_create(point_list,depth=0):
if len(point_list)==0:
return
D = len(point_list.columns) # assumes all points have the same dimension
axis = depth % D
key=point_list.columns[axis]
A=point_list.sort_values(by=key)
median = len(point_list)/2 # choose median
# Create node and construct subtrees
node = Node()
node.location = A.iloc[median]
node.left_child = kdtree_create(A.iloc[0:median], depth+1)
node.right_child = kdtree_create(A.iloc[median+1:], depth+1)
return node

def get_point_list(G):
point_list=pd.DataFrame()
for g in G.nodes():
lat=np.float(G.node[g][’y’])
lon=np.float(G.node[g][’x’])
df=pd.DataFrame([[lat,lon]],columns=[’lat’,’lon’])
if (len(point_list)==0):
point_list=df
else:
point_list=point_list.append(df,ignore_index=True)
return point_list
4
SERGIO HERNÁNDEZ FACULTAD DE CIENCIAS DE LA INGENIERIA UNIVERSIDAD CATÓLICA DEL MAULE SHERNANDEZ@UCM.

Program 2 Ciclovias de Talca


G=nx.read_graphml(’data/talca_ciclovias.graphml’)
print nx.info(G)
origin_point = (-35.434415,-71.620053)
destination_point = (-35.425901, -71.666645)

point_list=get_point_list(G)

kdtree=kdtree_create(point_list)

Potrebbero piacerti anche