У меня есть набор интервалов, описываемых парами [min, max]
. Я хочу найти все наборы интервалов, которые содержат заданное значение.C++ эффективный поиск значения в наборе интервалов
Я сделал это решение, которое работает в O (N) времени и служит в качестве примера того, что я после:
#include <iostream>
#include <vector>
using namespace std;
struct data
{
int minValue;
int maxValue;
};
void searchValue(const vector<data> &v, int target)
{
for(size_t i = 0; i < v.size(); i++)
{
if(target >= v[i].minValue && target <= v[i].maxValue)
cout << "Found target at set " << i << " (" << v[i].minValue << "," << v[i].maxValue << ")" << endl;
}
}
int main()
{
data d1 = {-1, 0};
data d2 = {0, 3};
data d3 = {-1, 5};
data d4 = {10, 11};
data d5 = {9, 12};
// Vector to hold the interval sets
vector<data> v{d1, d2, d3, d4, d5};
// Search for the interval sets which contain the number 2
searchValue(v, 2);
return 0;
}
Это очень важно найти все возможные наборы, а не только один.
Я сейчас ищу решение, которое более эффективно вычислительно, возможно, в логарифмическом времени. Я думаю, что может быть решение с multiset/multimap, lower_bound/upper_bound и т. Д., Но пока у меня не было никакого успеха.
Это может быть достигнуто с использованием интервальных деревьев, но я считаю, что может быть решение, использующее только STL.
вам нужны интервалы, чтобы быть в каком-то для того, чтобы достичь времени журнала – UmNyobe
Похоже, это действительно зависит от того, если вы делаете больше, вставки или поиск относительно того, можете ли вы сделать лучше, чем O (n) – xaxxon
@xaxxon Меня беспокоит только поиск, данные неизменны. r. – user344499