二进制搜索,何时应该增加高或低?

时间:2016-10-21 05:41:30

标签: binary-search

我很难理解如何增加低或高。

例如,这是来自leetcode的问题:

  

实现int sqrt(int x)。

我的代码:

class Solution {
public:
    int mySqrt(int x) {
        if (x<=0) return 0;
        int low=1, high=x, mid=0; 
        while (low<=high){          // should I do low<high?
            mid=low+(high-low)/2;
            if (x/mid==mid) return mid; 
            if (x/mid>mid) low= mid+1;  //can I just do low=mid?
            else           high=mid-1; // can I do high =mid?

        }
        return high;  //after breaking the loop, should I return high or low?

    }
};

你知道,在条件满足之后,我不知道是否应该设置low=midlow=mid+1。为什么mid+1

总的来说,我很难看出我是否应该从中点增加低点。如果我在low <= high循环中包含low < highwhile,我也会遇到问题。

2 个答案:

答案 0 :(得分:2)

你的算法不是二元搜索。 此外,它不起作用。

举例x = 5

Initial:
low = 1, high = 5

Iter 1:
mid = 3
5/3 = 1 so high = 4

Iter 2:
mid = 2.5 => 2 (because int)
5/2 = 2 (because int)

<returns 2>

对于完美的方形输入,您的算法只能通过mid而不是highlow来提供正确的结果。

顺便说一句,如果mid你需要增加x/mid > mid,否则你需要减少它。您增加和减少mid的方法分别递增low或递减high

这没关系,但这并不能产生二进制搜索。您的high将遍历从x(2*sqrt - 1)的所有整数。

请关注@sinsuren评论以获得更好的解决方案

答案 1 :(得分:0)

这是平方根的Babylonian方法:

/*Returns the square root of n.*/
float squareRoot(float n)
{
  /*We are using n itself as initial approximation
   This can definitely be improved */
  float x = n;
  float y = 1;
  float e = 0.000001; /* e decides the accuracy level*/
  while(x - y > e)
  {
    x = (x + y)/2;
    y = n/x;
  }
  return x;
}

为了更加了解,您可以随时关注this link