【发布时间】:2016-06-21 14:22:59
【问题描述】:
我正在尝试实现一个通用的 n 维树来保存 n 维数据。通过 n 维数据,我的意思是在我的情况下具有 6-7 个坐标的数据点。这是树节点(一种复合数据类型)和树类:
#data = data points (i.e. [x,y,z,k,m,n])
#hypercube = set of tuples; coordinates [(x0,x1),(y0,y1)...]
class _Node:
def __init__(self, data, hypercube):
self.data = data
self.hypercube = hypercube
class _nTree:
def __init__(self, hypercube, depth = 0):
self.node = []
self.children = []
self.depth = depth
self.hypercube = hypercube
def __insert__(self, data):
if not self.node:
self.node = _Node(data, self.hypercube)
if (len(self.node.data) != 1):
self.__split__()
在我的例子中,每个子节点都将包含包含在其父节点中的数据 - 这就是检查 len(self.node.data) 是否不等于 1 的原因。如果我们只包含 1 个数据点超立方体,然后我们停下来,我们有一个叶节点。如果我们有多个,我们会进一步分裂。只有当数据点位于超立方体坐标定义的边界内时,它才会被放置在超立方体中。
例如,假设您有一个坐标为 [(0,1),(0,1)] 的二维平面 - 我们的根节点。我们想用数据点 [(0.5, 0.1),(0.2,0.3)] 填充它。由于我们有两个数据点,我们将平面分成 2^n 个新的超立方体(在本例中为正方形),其中 n 是维数 - 在本例中为 2。从 1x1 的平方根我们得到 4 个较小的坐标平方 [[(0, 0.5), (0, 0.5)], [(0.5, 1), (0.5, 1)], [(0.5, 1),( 0, 0.5)], [(0, 0.5),(0.5, 1)] - 基本上是根节点的子节点。这是一个可以在此处可视化的四叉树示例:https://en.wikipedia.org/wiki/Quadtree
我正在尝试做同样的事情,但有多个维度。
既然我试图解释我想要做什么,我的问题是:
超立方体变量包含当前节点的坐标。如何以正确生成坐标的方式实现拆分功能?例如,如果我有 6 个维度,我必须为每个节点生成 64 个坐标( 2^n; n = 维度数)。提醒一下,它不是 k-D 树。
编辑:我想我应该发布我当前的 split 功能:
def __split__(self):
n_of_children = 2**(len(self.node.hypercube[0]))
vector = self.__get_vector__() #returns the coordinates of all 64 hypercubes/trees
self.children = [_nTree(vector, self.depth+1) for i in range(n_of_children)[
self.__insert_children__(self.data)
我将每个子节点声明为树结构,然后调用 insert_children 来决定每个数据点进入哪个子节点。如果一个child里面有多个数据点,我们就重复整个拆分和插入的过程。
【问题讨论】:
标签: python data-structures tree