区间范围树数据结构c ++

时间:2015-01-20 19:36:08

标签: c++ stl range-tree

我有一个要求,我必须根据某个属性值更新图形前端的颜色。属性值有不同的范围....比如-30到-45,-60到-80等等。 ....所以,我需要一个数据结构,我可以存储这些范围(预填充它们)....当我确定这一点时,我想知道这一点落入O(1)的范围时间或O(logN)时间....因此,我的查询将由一个点组成,输出应该是包含该点的唯一范围...

我在范围树和段树之间感到困惑....我想在c ++ stl map之上构建树。

3 个答案:

答案 0 :(得分:5)

您需要的是间隔树。 http://en.wikipedia.org/wiki/Interval_tree。 遗憾的是,您无法使用std::set<>来获取O(log N)插入,删除和查询,因为树节点需要包含其他数据。你可以在这里阅读它们http://syedwaqarahmad.webs.com/documents/t.cormen-_introduction_to_algorithms_3rd_edition.pdf 第14.3章。

相反,你可以使用提升。它有间隔容器库。

http://www.boost.org/doc/libs/1_46_1/libs/icl/doc/html/index.html

答案 1 :(得分:1)

也许这个图书馆可以帮到你: https://github.com/ekg/intervaltree

答案 2 :(得分:1)

如果我理解正确,你可以使用std :: set:

轻松地理解这一点
#include <iostream>
#include <set>


struct Interval {
    int min;
    int max;
};

struct ComInt {
    bool operator()(const Interval& lhs, const Interval& rhs){
        return lhs.max < rhs.min;
    }
};

std::set<Interval, ComInt> intervals = { { -10, -5 }, { -4, 4 }, { 5, 10 } };


int main() {
    int point = 3;
    Interval tmp = { point, point };

    auto result=intervals.find(tmp);
    if (result != intervals.end()) {

        std::cout << "Min:" << result->min << " - Max:" << result->max << std::endl;
    } else {
        std::cout << "No matching Interval found" << std::endl;
    }
}

当然你应该围绕它构建一个包装类