在Java SE 7中,我正在尝试解决我有一系列矩形的问题。通过一些用户交互,我得到一个点。我需要做的是找到包含Point的(第一个)Rectangle(如果有的话)。
目前,我正在通过非常简单的解决方案来实现这一点,只需将矩形存储在ArrayList中,并通过遍历列表并使用contains()
来搜索包含的Rectangle。问题在于,因为这需要对用户来说是交互式的,所以即使是相对较少数量的矩形(例如200),这种技术也开始变得太慢。
我当前的代码看起来像这样:
// Given rects is an ArrayList<Rectangle>, and p is a Point:
for(Rectangle r : rects)
{
if(r.contains(p))
{
return r;
}
}
return null;
是否有更聪明的方法来解决这个问题(即,在O(log n)而不是O(n)中,和/或通过尽早消除明显不良候选者而对contains()
的调用较少?)< / p>
答案 0 :(得分:3)
是的,有。构建2 interval trees,它将告诉您x1到x2之间以及y1和y2之间是否存在矩形。然后,当您拥有该点的坐标时,在两个树中执行O(log n)搜索。
那将告诉你是否有可能的兴趣点周围的矩形。你仍然需要检查这两棵树是否有一个共同的矩形。