二进制搜索代码未通过效率检查

时间:2018-12-19 21:12:37

标签: c++ performance search binary-search

我受命完成涉及简单C ++编码练习的职位的技术评估。问题是检查排序数组中是否存在数字,其中:

  • ints[]是要排序的数组
  • size是数组的大小
  • k是要检查的号码

要求是实施一个使用尽可能少的CPU周期的解决方案。我的解决方法如下:

static bool exists(int ints[], int size, int k)
{
    std::vector<int> v(ints,ints+size);

    if (std::binary_search (v.begin(), v.end(), k))
        return true;

    return false;
}

这使阵列中的百万个项目的性能测试失败。我对为什么有些困惑。我是根据向量创建新结构的事实吗?是否涉及将所有项目复制到内存中的新位置?

1 个答案:

答案 0 :(得分:8)

std::vector<int> v(ints,ints+size);将复制您的数组。您真的不想在二进制搜索功能中执行此操作,因为它是O(N)操作。这完全支配了二分搜索的O(logN),并使您的算法等效于线性搜索(只会更糟,因为您还占用O(N)空间)。您应该在调用binary_search时直接使用数组,就像使用以下方法创建向量一样:

static bool exists(int ints[], int size, int k)
{
    return std::binary_search(ints, ints+size, k);
}