Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 改进的二进制搜索_C++_Arrays_Binary Search - Fatal编程技术网

C++ 改进的二进制搜索

C++ 改进的二进制搜索,c++,arrays,binary-search,C++,Arrays,Binary Search,我一直在试图解决一个问题,我有一个数组,比如a[]={5,9,11,15};2个变量的值,比如2和10。我需要找出数组中的任何元素是否属于(2,10),也就是说它的值在2(排除)到10(包含)之间。我只需旋转一个循环,然后搜索>if(2=a[i])

我一直在试图解决一个问题,我有一个数组,比如a[]={5,9,11,15};2个变量的值,比如2和10。我需要找出数组中的任何元素是否属于(2,10),也就是说它的值在2(排除)到10(包含)之间。我只需旋转一个循环,然后搜索>if(2=a[i])<但这在较大的数组大小值(比如10^5)下不起作用。我还尝试使用修改过的二进制搜索,该搜索返回的索引值小于或等于键提供的值,但失败了。有人能为我提供一个快速算法吗? 编辑:这里的位置是元素数,呼吸是数组层是函数(修改的二进制)

}

//

int-ret=地板(呼吸、位置、迷你型);
printf(“%d\n”,ret);
printf(“mini是%d,maxi是%d”,mini,maxi);
如果(位置==0)
{  
printf(“数组中没有断点:)(pos==0)\n”);
printf(“是\n”);
}
else if(ret==-1)
{ 
printf(“Mini小于最小的断裂元素\n”);

if(breaking[0]您只需使用
std::lower_bound
返回一个包含所有值的范围。如果没有值,该范围将为空

#include <iostream>
#include <algorithm>
#include <tuple>

template<typename ForwardIterator>
std::pair<ForwardIterator, ForwardIterator>
range_inside(ForwardIterator b, ForwardIterator end, 
                  int lower, int upper) {
  auto it = std::lower_bound(b, end, lower);
  auto it2 = std::upper_bound(it, end, upper);
  return std::make_pair(it, it2);
}

int main()
{
  int arr[] = { 2, 5, 9, 10, 11, 15};
  int *r, *e;
  std::tie(r, e) = range_inside(std::begin(arr), std::end(arr), 2, 10);
  std::for_each(r, e, [] (int& x) { std::cout << x << " "; }); 
  // output: 2 5 9

  return 0;
}
#包括
#包括
#包括
模板
std::pair
范围_内部(ForwardIterator b、ForwardIterator end、,
整数下限,整数上限){
自动it=std::下限(b,结束,下限);
自动it2=std::上限(it、end、上限);
返回std::make_pair(it,it2);
}
int main()
{
int arr[]={2,5,9,10,11,15};
int*r,*e;
std::tie(r,e)=范围_内(std::begin(arr),std::end(arr),2,10);

std::for_each(r,e,[](int&x){std::不能让你的二进制搜索工作。二进制搜索非常快;你修改的BS以什么方式失败了?我做得很完美,但它没有给我我所需的输出。我在某个地方未能正确实现它。你真的想自己实现它吗?为什么不使用标准库(查看)或者这是一个奇怪的赋值吗?听起来你做得不太好。如果x不是这个范围内的元素,那么x将包含什么呢?在这种情况下,
r==e
,所以
对于每个
都不做任何事情。
it2
应该使用
上限
作为OP-want,包括上限。
return Floor(A, 0, size, key);
  int ret=Floor(breaaking,pos,mini);

 printf("%d\n",ret);

   printf("mini is %d and maxi is %d",mini,maxi);

    if(pos==0)
{  
    printf("There is no breaking point in the array :) (pos==0)\n");
    printf("Yes\n"); 
}
else if(ret==-1)
 { 
    printf("Mini is smaller than smallest element of breaking\n");

        if(breaaking[0]<maxi)
        { 

             printf("but maxi is greater than smallest element hece it lies between so:\n");
             printf("No\n");
        }
     else {
               printf("even maxi is less than smallest element hence:\n");
               printf("Yes\n");
           }
}
else if(ret==pos-1)
{ 
    printf("mini is either equal to last element of breaker set or greater than it\n");

       if(mini==breaaking[pos-1])
        {
             printf("mini is equal to the last element hence\n");    
                  printf("No\n");}
     else
        { 
        printf("mini is greater than the last element hence:"); 
         printf("Yes\n");
       }
 }
else
 { 
     printf("returned a valid index which is less than or equal to mini which is btw %d\n",ret);

        if(breaaking[ret]==mini)
        {
                 printf("mini was equal to one of the element of array hence\n"); 
                 printf("No\n");
        }
    else
    {  printf("mini is smaller than this element but greater than next element\n");
        if(breaaking[ret+1]<maxi)
             { 
                printf("next element lies between mini and maxi hence:\n")  ;      
                printf("No\n"); 
             }
        else
             {   printf("even maxi is smaller than next element hence\n");
                printf("Yes\n");
             }
     }
`}
#include <iostream>
#include <algorithm>
#include <tuple>

template<typename ForwardIterator>
std::pair<ForwardIterator, ForwardIterator>
range_inside(ForwardIterator b, ForwardIterator end, 
                  int lower, int upper) {
  auto it = std::lower_bound(b, end, lower);
  auto it2 = std::upper_bound(it, end, upper);
  return std::make_pair(it, it2);
}

int main()
{
  int arr[] = { 2, 5, 9, 10, 11, 15};
  int *r, *e;
  std::tie(r, e) = range_inside(std::begin(arr), std::end(arr), 2, 10);
  std::for_each(r, e, [] (int& x) { std::cout << x << " "; }); 
  // output: 2 5 9

  return 0;
}