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