我想实现一个通用的n维树,它将保存n维数据。对于n维数据,我是指具有6-7坐标的数据点。这里是树节点(复合数据类型)和树类:n-D树 - 计算超立方体的坐标
#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的原因(自我.node.data)不等于1.如果我们只有一个数据点包含在超立方体中,那么我们停止并且有一个叶节点。如果我们有多个,我们会进一步分裂。只有当数据点位于由超立方体的坐标定义的边界内时,数据点才会放置在超立方体中。
例如,假设您有一个坐标为[(0,1),(0,1)]的二维平面 - 我们的根节点。我们想用数据点[(0.5,0.1),(0.2,0.3)]填充它。由于我们有两个数据点,因此我们将该平面划分为2^n个新的超立方体(在这种情况下为正方形),其中n是维数 - 在这种情况下为2。从1×1的根部平方得到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树。
编辑:我想我应该张贴我目前的分裂功能:
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决定进入哪个孩子每个数据点进入。如果一个孩子有一个以上的数据点,我们重复整个分裂和插入的过程。
就我而言,我不能使用K-D树,因为它们依赖于数据。就我而言,我所要做的就是插入数据并计算包含特定级别数据点的节点数。感谢您分享您的想法!在我开始构建自己的数据库之前,我已经阅读过您提到的数据结构,但没有一个可以给我想要的结果。 – vFlav
那么,就像你说的那样,所有树状结构都依赖于数据。没有真正的方法:-)。我不确定'特定级别'是什么意思,你的意思是在一定范围内的值? – TilmannZ
按等级我的意思是树的深度。当我完成插入数据时,我想计算包含数据的特定深度的节点数量,忽略那些不包含数据的节点数量。 – vFlav