## Friday, 8 April 2016

### Binary Search

This blog is part of series that i wanted to start Preparation of Coding Interview

Binary search is one of the first search algorithm that we learn, it is simple to implement and very powerful, gives 0(log n) guarantee.

Quick recap of binary search

It is simple to implement but nearly all binary search were broken due to one bug for long time, you can read about it @ Nearly All Binary Searches are Broken

Enough of history lets get back to topic and discus some of the interview question on this

- Implement Binary Search

This question is still asked so you should practice it because all the logic around index manipulation is little tricky.

Look the line that is finding MID, it is the line that had the bug

-Find rotation point

This is small variation of binary search, you have to find rotation point in ordered array, for e.g

Elements are in increasing order then it drops to min value and then again elements are in increasing order.

How do you define rotation point ?
for any element if both left & right element are greater then current element is at rotation point.

In above case 5th element is at rotation point because both left(4th) and right(6th) are greater than 5th

Another example
char[] values = {'i', 'j', 'k', 'v', 'a', 'b', 'c', 'd'}

5th element(i.e 'a') is at rotation point

Simple Binary Search will not work on this because 2 sorted array are joined in this.
If you try to solve this by brute force then have to go through each element till you find element that is less than previous.

Brute force solution will look something like below

Since this array is sorted , so it is possible to write hybrid binary search that can take advantage of sorted data.

Now real question is how to decided when to go left or right ?

If we just apply normal binary search logic then mid point is 'v'(i.e 4), now which element should be compared to decided left/right ?

Ah it is the first one ('i') , if mid is greater than first then go to right or if it is less than first then go to left.

Lets put some picture to understand it.

Step 1 - v > i , so we go to right
Step 2 - b < i, so we go to left
Step 3 - mid value (a) is at rotation point and program ends.

Code will look something like below

Hopefully visualization was ok enough to explain how to approach this problem.
My visualization skills are very bad & i have to work on it.