我必须实现Fortunes algorithm来构建Voronoi图。
算法的重要部分是名为"海滩线数据结构的数据结构"。
它是一个二进制平衡树,类似于AVL,但数据仅存储在叶子上的方式不同(还有其他差异,但对于这个问题并不重要)。
我不确定如何实现它。显然,使用AVL""因为平衡AVL树叶节点可以成为内部节点而反之亦然。
我还尝试在维基百科上查看其他一些已知的数据结构,但没有一种能够满足需求。 我已经看到一些使用链表执行此操作的实现,但这并不好,因为搜索链表是O(n),并且它需要是O(log n)才能使算法有效。
答案 0 :(得分:2)
树叶确实存储(单个)点,事件结构的内部节点(“海滩线树”)存储抛物线/弧线彼此相邻的点的有序元组。如果指向 P a 的抛物线位于由 P b 形成的抛物线左侧(并且这些抛物线)两个抛物线相交),内部节点存储有序元组(P a ,P b )。
显然使用AVL“按原样”将不起作用,因为平衡AVL树叶节点可以成为内部节点,反之亦然。
如果您担心在AVL树中存储不同类型的对象,一个简单的方案就是将叶子存储为元组。所以不要将点 P j 存储为叶子,而是存储元组(P j ,P j < / sub>)而不是。如果 P j ,叶子从事件树(海滩线)消失,其父亲(P i ,P < sub> j ),只需将父项更改为(P j ,P j ),当然其父母也需要从(P j ,P ?)更改为(P i ,P ?)等。与常规AVL树一样:沿着树向上走,修改需要更改的内部节点和/或重新平衡。
请注意,算法的良好实现不能轻易地写在SO答案中(至少,不是我!)。有关整个算法的正确解释,包括其使用的数据结构的说明,请参阅Computational geometry: algorithms and applications by Mark de Berg et al.。第7章仅专注于Voronoi图。