用于查找包含数字的非重叠范围的高效数据结构

时间:2011-12-14 21:23:00

标签: c++ search data-structures range

用于存储范围的起点和终点的数据结构。

rangename      start     end

range1          10        11

range2          20        22

range3          0         5

现在如果我必须找到可能存在数字'x'的范围。

在c ++中存储它的有效方法是什么?

我正在尝试使用地图。但然后搜索找到范围可能是昂贵的(我不确定)。建议一个好的数据结构。

我应该能够找到元素是否存在于范围内。范围不应混合和匹配,也不应相邻或其他边界。

如果我需要找到一个元素3,它存在于范围3中,但是元素12根本不存在。只是循环通过不是一种有效的方式。

5 个答案:

答案 0 :(得分:4)

(我已经改变了这个答案,因为提问者澄清了他的范围不重叠。)

如果范围集没有改变,你可以使用有序矢量和二分搜索,如ravenspoint的回答所示。

如果范围集随时间而变化,您可能仍会使用已排序的向量,或者您可能希望使用std::map。在这种情况下,您需要尝试两者并查看哪一个更快。

答案 1 :(得分:2)

存储已排序的

vector< pair< int>>,以便您可以进行二进制搜索?

答案 2 :(得分:1)

假设范围不重叠:

将每个范围存储在一个简单的结构中

range {
  int low;
  int high;
  string name;
}

将范围存储在已排序的矢量中,低位。

使用二进制搜索找到所需范围,以获得最大低于目标的低值。

答案 3 :(得分:0)

将所有值转储,开始和结束为向量或数组,然后对其进行排序。由于范围不重叠,一旦数组排序,您将有启动,停止,启动,停止等。然后,您可以使用二进制搜索来查找向量的索引。那它只是一个奇怪的甚至是

的问题

假设您从流

获取范围
vector<int> ranges;
int n;
while(in >> n){
    ranges.push_back(n);
}
sort(ranges.begin(),ranges.end())

int x;
cout <<"please enter a value to search for: ";
cin >> x;
int index = binary_search(x,ranges);

if(index % 2){
    cout << "The value " << x << "is in the range of "
         << ranges[index-1] << " to " <<       ranges[index] << endl;
}else{
    if(ranges[index] == x){
         cout << "The value " << x << "is in the range of "
              << ranges[index] << " to " <<       ranges[index+1] << endl;
    }
    else{
         cout << "Value " << x << " is not in any range\n";
    }
 }

其中二进制搜索将被定义为

 int binary_search(int x, vector<int>& vec, int s = 0; int f = -1){
     if(f == -1)f=vec.size();
     if(s >= f) return s;
     int n = (f-s)/2 + s;
     if(vec[n] == x)return n;
     if(vec[n] < x)return binary_search(x,vec,s,n-1);
     return binary_search(x,vec,n+1,f);
 }

希望我没有弄乱二进制搜索,但它的设计方式是,如果找不到该值,则返回下一个最大值的索引。

答案 4 :(得分:0)

为什么不使用B +树? 使用B +树,扇出会很小,搜索也会很快。