【发布时间】:2014-10-07 19:44:10
【问题描述】:
我在 java 中实现此方法时遇到问题。我在 Computational Geometry 3rd Edition 中专门使用 AVL BST 树来实现算法FINDINTERSECTIONS 的状态。书中的描述如下:
我遇到的问题是在HANDLEEVENTPOINT 中实施第 5 步。当事件点是一个交点时,那里的状态不再是完全有序的,因为对于交点线,它们在它们的交点处相交,需要在状态中进行交换。由于我使用的 BST 是 AVLTree,delete 方法失败,因为重新平衡方法需要元素的正确排序(即 delete 方法假定树是正确排序的,并根据顺序执行轮换以维护日志(n) 高度)。此外,我使用的状态将数据存储在节点而不是叶子中,如图所示。如果我理解正确的话,书上说任何一种树都可以使用。
【问题讨论】:
-
按常规方式编写时,旋转代码甚至不会检查键。您能否更具体地说明问题所在?除非您使用的是不灵活的库,否则重复键应该不是问题(这是在事件点可能发生的最糟糕的情况)。
-
@DavidEisenstat 我认为您可能正在做某事,但我使用的删除方法需要首先找到元素,它通过将输入数据与树中的节点进行比较来找到它。 (即看
remove方法here)。 -
我会简单地使用来自
java.util包的现有数据结构,而不是使用第 3 方 AVL 树。例如,您的事件队列T可以保存TreeMap<Point, List<Event>>。Event将包含(至少)一个线段和一个类型(START、END、INTERSECTION 之一)。 -
@BartKiers 出于调试目的,也许我会按照您的建议使用现有的数据结构。现在我正在使用我在java中实现的贫困AVLTree,因为我正在尝试了解更多关于数据结构的信息。我认为大卫可能让我走上了正确的道路,因为再平衡不应该检查关键值(它纯粹基于我认为的树的结构)。我需要重新检查我的代码。
-
酷,祝你好运@jucestain。
标签: java algorithm computational-geometry avl-tree