给定一个有序整数数组,我想找到最接近给定数字的值。数组可能包含重复值和负数。 一个例子 : 输入:arr [] = {-5,2,5,6,7,8,8,9}; 目标数量= 4 输出:5
哪个是最快的算法?二进制搜索? STL找到算法了吗?
感谢您的帮助。
答案 0 :(得分:3)
std
库中有一种算法几乎可以完全满足您的要求:std::lower_bound
返回指向[[first, 不小于(即大于或等于)值,或不大于 如果找不到这样的元素。
您可以使用它来查找等于或高于目标的第一个元素。答案是前面的那个数字。
检查以下示例:
int find_closest(const vector<int>& A, const int a)
{
if(A.size() <=0)
throw std::invalid_argument("empty array");
const auto lb = std::lower_bound(A.begin(), A.end(), a);
int ans = lb!= A.end() ? *lb : A.back();
if (lb != A.begin()) {
auto prec = lb - 1;
if (abs(ans - a) > abs(*prec - a))
ans = *prec;
}
return ans;
}
由于lower_bound
执行二进制搜索,因此此方法的复杂度在输入集合的大小上是对数的。
这比幼稚的解决方案要快得多,在幼稚的解决方案中,您将遍历整个集合并逐个检查每个元素。