存储一组非重叠范围并严格查找任何一个范围中是否存在值

Kin*_*ing 3 c++ algorithm search binary-tree range

我有一组范围:

Range1 ----(0-10)

Range2 ----(15-25)

范围3 ----(100-1000)和同样.我想只存储边界,因为存储大范围,它会很有效.

现在我需要搜索一个数字,比如14.在这种情况下,14不存在于任何范围内,而(例如数字)16存在于其中一个范围内.

我需要一个功能

bool search(ranges, searchvalue)
{
    if searchvalues present in any of the ranges
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

如何才能做到最好?这是严格不重叠的,重要的标准是搜索必须最有效.

vis*_*tor 5

一种可能性是将范围表示为一对值并定义合适的比较函数.如果其边界较小且没有重叠,则以下应考虑一个小于另一个的范围.作为副作用,此比较功能不允许您在集合中存储重叠范围.

要查找整数n,可以将其视为范围[n, n]

#include <set>
#include <iostream>

typedef std::pair<int, int> Range;
struct RangeCompare
{
    //overlapping ranges are considered equivalent
    bool operator()(const Range& lhv, const Range& rhv) const
    {   
        return lhv.second < rhv.first;
    } 
};

bool in_range(const std::set<Range, RangeCompare>& ranges, int value)
{
    return ranges.find(Range(value, value)) != ranges.end();
}

int main()
{
    std::set<Range, RangeCompare> ranges;
    ranges.insert(Range(0, 10));
    ranges.insert(Range(15, 25));
    ranges.insert(Range(100, 1000));
    std::cout << in_range(ranges, 14) << ' ' << in_range(ranges, 16) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

  • 严格的周订购要求`equiv`的传递性定义为`!comp(a,b)&&!comp(b,a)`:`equiv(a,b)&& equiv(b,c) - > equiv(a, C)`.对于你的`RangeCompare`,`(10,20)'=='(15,25)&&(15,25)'=='(21,30)`,但是`(10,20)'!='( 21,30)`. (2认同)
  • 您不能保证容器不允许插入重叠范围,因为正如 @fefe 所说,容器的要求已被违反。通过将比较器更改为 `lhv.first &lt; rhv.first &amp;&amp; lhv.second &lt; rhv.first` 可以保证严格的弱排序。这与建议的解决方案没有什么不同,只是现在容器将具有定义的行为。重叠范围将被视为相等,因此无法插入。 (2认同)