用于存储范围的起点和终点的数据结构。
rangename start end
range1 10 11
range2 20 22
range3 0 5
现在如果我必须找到可能存在数字'x'的范围。
在c ++中存储它的有效方法是什么?
我正在尝试使用地图。但然后搜索找到范围可能是昂贵的(我不确定)。建议一个好的数据结构。
我应该能够找到元素是否存在于范围内。范围不应混合和匹配,也不应相邻或其他边界。
如果我需要找到一个元素3,它存在于范围3中,但是元素12根本不存在。只是循环通过不是一种有效的方式。
答案 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 +树,扇出会很小,搜索也会很快。