tarea arboles
DESCRIPTION
sTRANSCRIPT
Guia de Ejercicios.
Arboles Binarios. Matematicas Discretas
Sergio HernandezFacultad de ciencias de la Ingenieria
Universidad Catolica del [email protected]
November 24, 2015
1 Introduccion
Las busquedas en espacios multidimensionales (datos espaciales, imagenes, audio, etc)son costosas debido a la comparacion exhaustiva de distancias entre objetos. De modode obtener una indexacion adecuada, podemos recurrir a las propiedades de los espaciosmetricos. Dado un espacio vectorial X ⊂ RD y una funcion 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 dependeno solo de la cantidad de objetos n sino que tambien de la dimensionalidad D. Por lo tantose hace necesario contemplar otros mecanismos de indexacion.
2 Busqueda por ındices
Un metodo de busqueda por ındices son los KD-trees, los cuales se basan en arboles binarios,pero cortando uno de los ejes de manera ortogonal.
El metodo para realizar los cortes se basa en la mediana del eje seleccionado y produceun arbol de altura log(n). El arbol puede ser construido de manera recursiva con un costoO(n log n), el cual efectivamente es menor que la busqueda exhaustiva O(n2).
1
La Figura 1 muestra una arbol binario. Los hijos de cada nodo corresponden a laposicion de la mediana del eje seleccionado para cada profundidad.
A
B C
D
E F
Figure 1: Arbol binario que representa un KD-Tree. Cada nivel del arbol representa uncorte basado en la mediana del eje de corte
De manera de consultar por los vecinos mas proximos (nn), descendemos por el arboly mantenemos un punto candidato a ser el nn y un valor maximo conocido de la distanciaal punto de consulta. Luego chequeamos los sub-arboles dependiendo del eje de cortecontinuamos por una de las ramas.
Otro ejemplo tıpico es la busqueda por rangos en consultas geoespaciales. Supongamosque tenemos una aplicacion movil que busca ciudades cercanas y la recomendacion dependede la ubicacion del usuario. La base de datos podria contener los siguientes datos:
Longitud −71.661999Latitud −35.432349Ciudad Talca
3 Ejercicios
Se solicita implementar el algoritmo KD-trees para hacer busquedas de ciudades de Chile.El siguiente codigo lee datos (nombre, latitud, longitud) desde un archivo ESRI shapefiley los carga en memoria. Completar las siguientes funcionalidades:
2
Program 1 Ciudades de Chileimport osgeo.ogr
import math
class Node:pass
def haversine_distance((lat1,lon1),(lat2,lon2)):
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
return 6371 * c
def kdtree_create(pointlist,names,depth=0):
#Retornar nodo y sub-arboles
node=Node()
return node
def kdtree_knn(kdtree,point,n=1):
#Retornar lista de n ciudades mas cercanas al punto point=(p1,p2)
return None
def kdtree_range(kdtree,point,range=0):
#Retornar lista de ciudades cercanas al punto point=(p1,p2) dentro de un rango
return None
ciudades={}
shapefile=osgeo.ogr.Open("cl_ciudades_geo.shp")
layer=shapefile.GetLayer(0)
spatialRef=layer.GetSpatialRef().ExportToProj4()
numFeatures=layer.GetFeatureCount()
for i in range(numFeatures):
feature=layer.GetFeature(i)
geometry=feature.GetGeometryRef()
point=geometry.GetPoint(0)
ciudades[feature.items()[’NOMBRE’]]=(point[1],point[0])
kdtree=kdtree_create(ciudades.values(),ciudades.keys())
3