我的数据集由许多位于x,y平面上的矩形组成(由一组四边形点表示)。 99.9%的时间这些矩形不会重叠,但他们很少会重叠。我正在尝试找到一个用于存储矩形的最佳数据结构,以便我可以找到交集的实例。
顺便说一句,矩形包含文本,所以我这样做是为了找到相同文本重叠的出现。这是因为这样的事件应该被视为一个文本矩形而不是两个。
例如: 假设我正在搜索文本“123”。 有两个矩形。第一个矩形包含“TEST 123”,第二个矩形包含“123”。如果“123”与第一个矩形内的“123”重叠(在给定的阈值内),那么我的搜索结果应该只返回一次出现的文本“123”。
到目前为止,我简要介绍了四叉树,r树,k-d树和范围树。我对这些树知之甚少,也不知道是否有任何可以解决这个问题。 在这种情况下,我觉得r树不是最佳的,因为重叠的可能性非常小。
答案 0 :(得分:2)
我知道你不希望索引做任何文本识别,它应该只检测重叠(轴对齐)矩形。这有时被称为“空间连接”操作。
据我所知,除了TOUCH algorithm(我认为是优化的R-Tree)之外,很少有专用算法。所以我会使用强力方法,对每个矩形执行数据集上的一个窗口查询。
有许多基于空间索引的可能算法。这取决于你的要求(除了kd-tree通常只适用于点,而不适用于矩形)。
对于磁盘,通常会推荐R-Tree变体,例如R * tree或X-tree。 但是,R-Trees在更新时往往效果不佳,但通常与初始批量加载一起使用。 R-Tree中的Windows查询倾向于使用更大的结果集更好地工作,但这可能取决于实际的数据集。
Quadtrees对于你的'稀疏'数据集应该没问题,它们也很容易实现,但需要大量内存,不适合磁盘使用。
如果您正在使用Java,请查看我的PH-Tree,它的工作方式有点像四叉树,但空间效率更高,并且可以很好地处理大型数据集,支持更新,窗口非常快查询,特别是如果结果集很小(0或1结果)。它可能正是您所需要的,除了它实现起来有点复杂(我的版本是Java和Apache v2许可),并且目前没有有效的方法将它存储在磁盘上。