Finding square root of a number whether its perfect square or not is simple with sqrt(n) function , but what if you have to implement it on your own?
There are several ways for it. I will tell you about 2 methods:
1. Using Binary Search in O(log N) time complexity
2. Babylonian Method of O(log(log N)).
1.
Using Binary Search
float squareroot( float n)
{
// Base cases
if (n == 0 || n == 1)
return n;
// Do Binary Search for floor(sqrt(x))
float start = 1, end = n, ans;
while (start <= end)
{
cout<<start<<" "<<end<<endl;
float mid = (start + end) / 2;
// If x is a perfect square
/* It is very important to see that mid*mid can overflow, so rather than doing (mid*mid) do
if(mid<=x/mid) */
if(mid==n/mid)
return mid;
// Since we need floor, we update answer when mid*mid is
// smaller than x, and move closer to sqrt(x)
if(mid<=n/mid)
{
start = mid + 1;
ans = mid;
}
else // If mid*mid is greater than x
end = mid - 1;
}
return (ans+1);
}
2.
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;
}
There are several ways for it. I will tell you about 2 methods:
1. Using Binary Search in O(log N) time complexity
2. Babylonian Method of O(log(log N)).
1.
Using Binary Search
float squareroot( float n)
{
// Base cases
if (n == 0 || n == 1)
return n;
// Do Binary Search for floor(sqrt(x))
float start = 1, end = n, ans;
while (start <= end)
{
cout<<start<<" "<<end<<endl;
float mid = (start + end) / 2;
// If x is a perfect square
/* It is very important to see that mid*mid can overflow, so rather than doing (mid*mid) do
if(mid<=x/mid) */
if(mid==n/mid)
return mid;
// Since we need floor, we update answer when mid*mid is
// smaller than x, and move closer to sqrt(x)
if(mid<=n/mid)
{
start = mid + 1;
ans = mid;
}
else // If mid*mid is greater than x
end = mid - 1;
}
return (ans+1);
}
2.
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;
}
No comments:
Post a Comment