四叉树中范围和查询的复杂性

时间:2016-07-21 11:12:11

标签: c++ data-structures quadtree

我想解决一个给出n个点的(整数)坐标的问题(n <= 10 ^ 5) 并询问q个查询(q <= 10 ^ 4)。在每个查询中,它给出了两个其他点的(积分)坐标,我们需要回答这两个点创建的矩形中有多少个n点。

(编辑)坐标也很大(x,y <= 10 ^ 9)(/ edit)

我创建了一个四叉树然后使用此函数来获得答案,但是我超出了时间限制(时间限制= 2秒)。这种方法是否太慢或者我做错了什么?

int sum(int left, int right, int down, int up, int i=1, int begx=0, int endx=1e9, int begy=0, int endy=1e9)
{
    if (!i || left>right || down>up) return 0;
    if (left==begx && right==endx && down==begy && up==endy) return num[i];
    int midx = (begx+endx)/2, midy = (begy+endy)/2;
    return  sum(left,min(midx,right),down,min(midy,up),child[i][0],begx,midx,begy,midy)
        +   sum(left,min(midx,right),max(midy+1,down),up,child[i][1],begx,midx,midy+1,endy)
        +   sum(max(midx+1,left),right,down,min(midy,up),child[i][2],midx+1,endx,begy,midy)
        +   sum(max(midx+1,left),right,max(midy+1,down),up,child[i][3],midx+1,endx,midy+1,endy);
}

如果我评论此功能(并且不回答查询,只需将点添加到四叉树),我的执行时间约为0.2秒。 数组num存储节点的总和,child存储每个节点的四个子节点的索引。节点0是虚拟的。子项中矩形的分区如下所示:

 ___
|1 3|
|0 2|
 ---

0 个答案:

没有答案