此处不细细讲解,只做简单构造k-d Tree
选轴策略:
1.依次X,Y,Z....K轴划分
2.按方差大的轴划分,及数据分散的轴
3.按数据差值大的轴划分(本文以此策略划分)
构造k-d Tree
def get_kdtree(tree_list):
list_lend = len(tree_list)
if list_lend == 0:
return None
elif list_lend == 1:
return {"value": tree_list[0], "left": None, "right": None}
else:
# 取最大差值为轴
xlist = []
ylist = []
for i in tree_list:
x, y = i
xlist.append(x)
ylist.append(y)
xmax = max(xlist)
xmin = min(xlist)
ymax = max(ylist)
ymin = min(ylist)
if (xmax - xmin) >= (ymax - ymin):
tree_list.sort(key=lambda i: i[0])
else:
tree_list.sort(key=lambda i: i[1])
midNum = list_lend // 2
left_list = tree_list[0:midNum]
right_list = tree_list[midNum + 1:]
return {"value": tree_list[midNum], "left": get_kdtree(left_list), "right": get_kdtree(right_list)}
if __name__ == '__main__':
point_list = [(2, 3), (5, 4), (9, 6), (4, 7), (8, 1), (7, 2)]
kdtree = get_kdtree(point_list)
print(kdtree)
输出结果
{'value': (7, 2), 'left': {'value': (4, 7), 'left': {'value': (2, 3), 'left': None, 'right': None}, 'right': {'value': (5, 4), 'left': None, 'right': None}}, 'right': {'value': (9, 6), 'left': {'value': (8, 1), 'left': None, 'right': None}, 'right': None}}