【问题标题】:implement 2d range tree c++实现二维范围树 C++
【发布时间】:2013-03-17 19:59:29
【问题描述】:

我一直在尝试理解范围树,但我仍然无法理解。

有人可以通过实现向我解释一下吗,因为我想用它来解决 2D RMQ,我知道分段树,我的老师告诉我范围树类似于 2d 分段树,但我就是想不出来空间复杂度如何能像 2d 段树一样小于 n^2。

对此我不确定,但它是不是真的,它就像归并排序,所以使用向量的内存将小于 n^2

void merge(vector<int> &res,vector<int> &a,vector<int> &b)
{
    int la = 0;
    int lb = 0;
    int sa = SIZE(a);
    int sb = SIZE(b);
    while(la < sa || lb < sb)
    {
        if (la >= sa) {res.pb(b[lb]);lb++;}
        else if (lb >= sb) {res.pb(a[la]);la++;}
        else
        {
            if (a[la] < b[lb]) {res.pb(a[la]);la++;}
            else {res.pb(b[lb]);lb++;}
        }
    }
}

void build(int n,int l,int r)
{
    if (l == r)
    {
        rtree[n].pb(ar[l]);
        return;
    }
    int m = (l+r)/2;
    build(2*n,l,m);
    build(2*n+1,m+1,r);
    merge(rtree[n],rtree[2*n],rtree[2*n+1]);
}

谢谢:)

【问题讨论】:

    标签: c++ structure segment range-tree


    【解决方案1】:

    你检查过通常的饼干罐吗?

    例如Wikipedia,我在 Google 上找到的几个former lecture 以及一个Stack Question

    我没有在大学学习它的乐趣,但它似乎是一个有趣的数据结构。

    【讨论】:

    • @zeulb 你不明白范围树具体是什么?
    • 我不明白它是如何实现的,是分段树,每个节点上都有一个分段树吗?
    • @zeulb 刚刚阅读了维基百科的文章,似乎范围树递归地从二叉搜索树构造每个维度。二叉搜索树只是一棵二叉树(小于根推左子树,大于等于根推右子树);一种有序的数据结构,允许有效地存储和检索数据。文章提到了分段树和 k-d,我建议将其作为起点。
    • 我尝试制作范围树,这是我的实现,但它似乎真的很慢stackoverflow.com/questions/15675417/2d-rmq-range-tree
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多