Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于矩形的点搜索优化_Java_Search_Optimization_Hashmap_Interval Tree - Fatal编程技术网

Java 基于矩形的点搜索优化

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;

我有一组房间和通道,可以转换成矩形(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; 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形树,我可能遇到的唯一问题是通道太长,这会增加矩形的大小并降低效率。