提高此搜索的性能?

时间:2016-07-12 13:28:18

标签: c++

有没有办法用更快的方式进行以下搜索? A数组中的项目按DESC顺序排序。

int find_pos(int A[], int value, int items_no, bool only_exact_match)
{
    for(int i = 0; i < items_no; i++)
        if(value == A[i] || (value > A[i] && !only_exact_match))
            return i;

    return -1;
}

3 个答案:

答案 0 :(得分:5)

您可以在案例中使用std::lower_bound算法。正如其他人写的那样,它用O(log N)执行二进制搜索。它将是这样的:

int find_pos(int A[], int value, int items_no, bool only_exact_match)
{
    const int *pos_ptr = std::lower_bound(A, A + items_no, value, std::greater<int>());
    const ptrdiff_t pos = pos_ptr - A;

    if (pos >= items_no)
        return -1;
    if (*pos_ptr != value && only_exact_match)
        return -1;
    return pos;
}

答案 1 :(得分:1)

因为您的数组已排序,您可以按步骤搜索,类似于二分法。首先,根据您的价值检查中点。如果它是平等的,你有答案。如果它更大,则您的值位于数组的下半部分。如果没有,你的价值就在上半部分。通过将数组的其余元素二等分直到找到您的值或耗尽元素来重复此过程。至于你的第二个if子句,如果没有找到匹配的值,最接近的较小元素是元素i + 1,如果存在(即你不在数组的末尾)。

答案 2 :(得分:1)

二元搜索

int left = 0;
int right = items_no; // Exclusive
while (left < right) {
    int mid = (left + right) / 2;

    if (value == A[mid])
        return mid;
    if (value < A[mid]) {
        left = mid + 1;
    } else {
        right = mid;
    }
}
return only_exact_match ? -1 : right - 1; // The greater