C++ 在整数数组中查找最近的数字

C++ 在整数数组中查找最近的数字,c++,arrays,closest,C++,Arrays,Closest,给定一个排序整数数组,我想找到与给定数字最接近的值。数组可能包含重复的值和负数。 例如: 输入:arr[]={-5,2,5,6,7,8,8,9}; 目标数量=4 产出:5 哪种算法最快?二进制搜索?STL查找算法 感谢您的帮助。std库中有一个算法,它几乎完全符合您的要求: 返回指向范围[first]中第一个元素的迭代器, 不小于即大于或等于值的最后一个,或 如果没有找到这样的元素 你可以用它来找到第一个元素,它等于或高于你的目标。答案是它前面的那个数字 检查以下示例: int find_clo

给定一个排序整数数组,我想找到与给定数字最接近的值。数组可能包含重复的值和负数。 例如: 输入:arr[]={-5,2,5,6,7,8,8,9}; 目标数量=4 产出:5

哪种算法最快?二进制搜索?STL查找算法


感谢您的帮助。

std库中有一个算法,它几乎完全符合您的要求:

返回指向范围[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;
}
这种方法的复杂性是输入集合大小的对数,因为下限执行二进制搜索。
这比简单的解决方案要快得多,在这种解决方案中,您可以循环整个集合并逐个检查每个元素。

std库中有一种算法,几乎完全满足您的要求:

返回指向范围[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;
}
这种方法的复杂性是输入集合大小的对数,因为下限执行二进制搜索。
这比一个简单的解决方案要快得多,在这个解决方案中,你可以循环整个集合,然后逐个检查每个元素。

请用“我将使用二进制搜索x”阅读我不认为会有更快的方法二进制搜索-std::lower_bound,检查返回的迭代器(如果不是结束迭代器),如果存在迭代器,则检查之前的迭代器。二进制搜索只能在数组被排序时才能工作。否则,除了穷举搜索之外别无选择。前面提到数组被排序请使用我将使用二进制搜索x读取。我不认为有更快的方法二进制搜索-std::lower_bound,检查返回的迭代器,如果它不是结束迭代器和之前的迭代器如果存在。二进制搜索只能在数组被排序后才能工作。否则,除了穷举搜索之外别无选择。前面提到数组被排序。下界假定数组已排序。@ALX23z数组已排序。请再次阅读问题=Sry.MB。但是,此算法找不到最接近的值。您应该调整它一位。不,它将返回一个不小于给定值的值。尝试并搜索3。它将返回5,但应为2。最后的边大小写是,如果搜索的元素大于向量中的所有值,则必须返回.back或throw(如果a.empty.std::lower_bound假定数组已排序)。@ALX23z数组已排序。@ALX23z排序。再次阅读问题=Sry.MB。但是,此算法找不到最接近的值。您应该稍微调整迭代器。不,它将返回一个不小于给定值的值。尝试并搜索3。它将返回5,但应为2。如果您搜索一个元素,则最终的边大小写将大于v中的所有值如果A.back为空,则必须返回A.back或抛出。