二进制搜索减少列表?

时间:2013-08-21 13:31:51

标签: c++ arrays search iterator

我有一个按严格降序排列的数组和一个元素val;我想找到数组中最大元素的索引,该索引小于val (如果val已经存在,则相等),我想在logn时间内这样做。并且反转数组并执行upper_bound()不是一种选择。

EG。如果array为{10,5,3,1}且val为6,则该函数应返回1.

我对迭代器很新,并试着在upper_bound()中添加一个比较函数,以使其工作但失败了。我应该怎么做呢。

注意:我在发布之前检查了类似的问题并找到了一个,但不幸的是它与Java有关,所以。

3 个答案:

答案 0 :(得分:3)

只需使用upper_bound和正确的比较功能:

  • 您的列表已被撤消(upper_bound通常需要增加订单),因此您需要使用>而不是<
  • 您想要包含搜索到的元素(而upper_bound通常会将其排除在外),因此您需要使用>=而不仅仅是>

int data[] = {10,5,3,1};
auto item = std::upper_bound(std::begin(data), std::end(data), 6,
                             [](int a, int b) { return a >= b; });

现在你只需要将生成的迭代器转换为索引(在检查它之后有效):

if (item != std::end(data)) {
    auto index = std::distance(std::begin(data), item);
    std::cout << index << std::endl;
}
else
    std::cout << "not found" << std::endl;

答案 1 :(得分:0)

使用带有比较功能的upper_bound() arg。

答案 2 :(得分:0)

对于迭代方式,我可能会做的是从数组的末尾开始我的搜索val值。即:

int indexFinder(int array[], int arraySize, int val){
    for(int i = (val >= arraySize ? 0 : (arraySize - val)); i < arraySize; ++i){
        if(array[i] <= val) return i;
    }
}

此循环的一个关键是,一旦遇到任何小于或等于的值,它就会返回索引,将其限制为它找到的第一个案例。

它还会检查val是否大于最大数组索引。