Lesson 3

Greetings, curious minds! Today, we'll explore **binary search** applications that transcend basic searching. We'll apply binary search to complex data structures, such as *bitonic arrays* and *rotated sorted arrays*, to find specific elements efficiently.

Consider a bitonic array as a numerical sequence simulating the trajectory of a roller coaster — first, it rises to a peak, then descends. For example, consider the array `[1, 2, 3, 4, 5, 3, 1]`

: its first part ascends, and the last descends, making it bitonic. Your goal is to find a value in such an array. You might walk the entire path, which is exhaustive and represents our naive approach with a time complexity of $O(n)$. Our aim today is a more efficient method.

To apply binary search, we first locate the *peak* of the array, then perform binary search on either side of the peak: one for the increasing sub-array and one for the decreasing sub-array.

The first step is akin to finding a vantage point at the carnival for a better view:

JavaScript`1let start = 0, end = arr.length - 1; 2 3// Here, we start our search for the peak, akin to scanning the crowd for higher ground. 4while (start < end) { 5 let mid = Math.floor((start + end) / 2); 6 if (arr[mid] > arr[mid + 1]) { 7 // Our peak is to the left. 8 end = mid; 9 } else { 10 // The peak is to the right. 11 start = mid + 1; 12 } 13} 14let peak = start; // The peak is found—a place where you can see far and wide!`

Now, let's perform a targeted binary search on sub-arrays:

JavaScript`1// Binary search on the ascending sub-array 2start = 0, end = peak; 3while (start <= end) { 4 let mid = Math.floor((start + end) / 2); 5 if (arr[mid] === target) return mid; 6 else if (arr[mid] < target) start = mid + 1; 7 else end = mid - 1; 8} 9 10// Binary search on the descending sub-array 11start = peak, end = arr.length - 1; 12while (start <= end) { 13 let mid = Math.floor((start + end) / 2); 14 if (arr[mid] === target) return mid; 15 else if (arr[mid] > target) start = mid + 1; 16 else end = mid - 1; 17} 18return -1; // If the target is not found in either sub-array`

The searching logic for the ascending part checks if the middle element is our target and updates `start`

or `end`

based on how the target compares. For the descending part, the logic flips since the values are now descending.

Imagine you have a shuffled deck of cards that needs to be reordered. That could be represented with a rotated sorted array. For example, if we rotate array `[1, 2, 3, 4, 5]`

, we could get `[3, 4, 5, 1, 2]`

. You could check each element, one by one, to find the lowest, which is our naive approach with a time complexity of $O(n)$. Or, we could use binary search for a more efficient find.

For the naive approach to finding the minimum element in a rotated sorted array, we'd sequentially traverse the array until we found the point where the current element is less than the preceding element, indicating the minimum.

Instead, we adopt binary search to identify the rotation point, which harbors the smallest element. This is like deducing the first card in the shuffled deck without flipping through every card.

Here, we apply our strategy to solve this arranged chaos:

JavaScript`1let start = 0, end = arr.length - 1; 2 3// Akin to deducing where the deck split happened. 4while (start < end) { 5 let mid = Math.floor((start + end) / 2); 6 if (arr[mid] > arr[end]) { 7 // The rotation point is to the right. 8 start = mid + 1; 9 } else { 10 // Or to the left? 11 end = mid; 12 } 13} 14 15// The rotation point is found—the start of the natural order of the deck. 16return arr[start];`

Mastering binary search in JavaScript is akin to mastering quick decision-making in a labyrinth; each choice is a pivot leading to a more efficient exit. Today, you have learned to tackle problems that, at first glance, seemed intricate and daunting. Those tasks become easily solvable puzzles when approached with the binary search methodology.

With this enhanced understanding, we now advance to practice exercises. Apply the binary search principles you've learned to navigate through and solve the forthcoming challenges. Happy coding!