我正在实现一个四叉树。对于那些不知道此数据结构的人,我包括以下简短描述:
四叉树是一种数据结构,在欧几里得平面中就像3维空间中的八叉树一样。四叉树的常见用途是空间索引。
总结一下它们是如何工作的,四叉树是一个集合(假设这里是矩形),具有最大容量和一个初始边界框。当尝试将元素插入达到最大容量的四叉树中时,该四叉树被细分为4个四叉树(其几何表示将比插入前的树小四倍)。每个元素根据其位置重新分配在子树中。使用矩形时的左上边界。
因此,四叉树要么是叶子,其元素数量少于其容量,要么是一棵有4个四叉树作为孩子的树(通常是西北,东北,西南,东南)。
我担心的是,如果您尝试添加重复项,可能是同一元素多次或具有相同位置的多个不同元素,则四叉树在处理边缘时存在一个基本问题。
例如,如果您使用容量为1的四叉树并将单位矩形作为边框:
[(0,0),(0,1),(1,1),(1,0)]
然后您尝试插入两次以其左上边界为原点的矩形:(或类似地,如果尝试在容量为N> 1的四叉树中将其插入N + 1次)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
第一次插入不会有问题:
但是然后第一个插入将触发细分(因为容量为1):
因此,两个矩形都放在同一子树中。
然后,这两个元素将到达相同的四叉树并触发细分…
依此类推,依此类推,细分方法将无限期地运行,因为(0,0)始终位于所创建的四个子树中的同一子树中,这意味着将发生无限递归问题。
有可能有重复的四叉树吗?(如果没有,则可以将其实现为Set
)
我们如何解决这个问题而又不完全破坏四叉树的体系结构?