找到超过阈值的最小连续值的最快方法是什么?
即
假设我有一个值向量:
std::vector<int> v = [10 25 8 49 50 61 55 45 34 10 8]
一种简单的方法是迭代向量;
int threshold = 40;
int consecutive = 5;
bool success = false;
for(int i = 0; i < v.size()-consecutive; ++i)
{
int counter = 0;
while(i+counter < v.size())
{
if(v[i+counter] > threshold)
{
counter++;
}
}
if(counter >= consecutive)
{
success = true;
break;
}
}
编辑:for @cmbasnett
如果在success = true
向量5
中找到40
个v
个连续值,则预期结果为false
。
答案 0 :(得分:2)
您可以使用std::search_n()
执行此操作:
bool success = search_n(begin(v), end(v), 5, 40, [](int x, int y) { return y < x; }) != end(v);
你可以跳过一个失败的元素,有点像Boyer-Moore-Hoorspool搜索,从而更有效地编写自己的优化版本:
template<typename It, typename T>
bool contains_n_gt_x(It first, It last, size_t n, const T& x) {
for (auto curr = first; first != last;) {
first = find_if(curr, last, [&](const auto& y){ return x < y; });
curr = find_if(first, last, [&](const auto& y){ return !(x < y); });
if (distance(first, curr) >= n) return true;
}
return false;
}