Java 基于矩形的点搜索优化
我有一组房间和通道,可以转换成矩形(x,y,宽度,高度)或点列表(x,y)<代码>房间和Java 基于矩形的点搜索优化,java,search,optimization,hashmap,interval-tree,Java,Search,Optimization,Hashmap,Interval Tree,我有一组房间和通道,可以转换成矩形(x,y,宽度,高度)或点列表(x,y)房间和通道都扩展了可指向界面。getPoints()方法是为Room类实现的 public Set<Point> getPoints() { Set<Point> array = new HashSet<Point>(); for (int i = 0; i < width; i++) { for (int j = 0; j < height;
通道
都扩展了可指向界面。getPoints()方法是为Room类实现的
public Set<Point> getPoints() {
Set<Point> array = new HashSet<Point>();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
array.add(new Point(x + i, y + j));
}
}
return array;
}
public Set getPoints(){
Set数组=新的HashSet();
对于(int i=0;i
问题:
我必须识别给定的点
所属的可点
。没有房间相交。我最初使用HashMap
将每个点关联到可点
,该点能够在O(n)时间内快速访问答案。但是,现在需要在生成级别时多次重新计算HashMap
。
在这一点上,使用HashMap(考虑到生成和访问)还是应该使用另一种方法,例如一组2-D间隔树,效率更高
在这一点上,使用HashMap(考虑到生成和访问)还是应该使用另一种方法,例如一组2-D间隔树,效率更高
除了那个测量过的人,没人能分辨出来。这完全取决于您需要更新数据的频率、数据更改的频率以及数据被查询的频率
以及房间的大小。在一个典型的场景中,HashMap
只需要几点积分就可以获胜,而在数千点积分的情况下,更新积分的开销占主导地位
您不能对所有点使用数组吗?如果是这样的话,那么它肯定会比HashMap快得多,尤其是对于更新(除非它变得非常庞大)
这可能有用,也可能无用
实际上,不仅每个房间
都有一些点
s,而且每个点
都可能有一个房间
(n:1)。它是如何实现的,这是一个不同的问题
鉴于此,我们有一个标准问题:如果双向链接,那么必须保持两个链接同步。最简单的解决方案是使setter(“adder”/“removers”)尽可能私有,并且只从方法调用它们
void link(Room room, Point point) {
Room oldRoom = point.getRoom();
if (oldRoom!=null) oldRoom.removePoint(point);
room.addPoint(point);
point.setRoom(room);
}
您从点
到房间
的链接是外部的,但这几乎不会改变任何事情(除了使点
更小,可能更干净,并为每次访问增加哈希映射的微小开销)
它通常也是最快的,因为通常查询比更新多得多。您的问题是更新成本会随着房间的大小而增加如果您不告诉我们一些数字,就无法进行估算。
如果有太多的点和大小变化不大的房间,可以将点坐标四舍五入为某些n
的倍数,并保留一个数组,其中包含与栅格相交的所有房间集。您可以像以前一样继续,但是更新开销将比房间面积(*)给出的系数低,而搜索开销则更高,因为您必须从集合中选择真正匹配的房间(如果有)
(*)对于未与网格对齐的房间,相交矩形的数量明显更高。您可能可以为此实现一个。对于R形树,我可能遇到的唯一问题是通道太长,这会增加矩形的大小并降低效率。