--- id: binary-search-sorted title: "Binary Search on a Sorted Array" author: Siyong Huang, Michael Cao, Nathan Chen description: "Using binary search to find elements quickly in a sorted array." prerequisites: - intro-ds frequency: 2 --- import { Problem } from "../models"; export const metadata = { problems: { bubble: [ new Problem("HR", "Bubble Sort", "https://www.hackerrank.com/challenges/ctci-bubble-sort/problem", "Easy", false, [], "O(N^2)"), new Problem("Silver", "Out of Sorts", "834", "Very Hard", false, []), ], count: [ new Problem("Silver", "Counting Haybales", "666", "Normal", false, []), ], } }; Suppose that we want to find an element in a sorted array of size $N$ in $O(\log N)$ time. We can do this with [**binary search**](https://en.wikipedia.org/wiki/Binary_search_algorithm); each iteration of the binary search cuts the search space in half, so the algorithm tests $O(\log N)$ values. This is efficient and much better than testing every element in an array. animations! animation! ## Library Functions ## Coordinate Compression A related topic is **coordinate compression**, which takes some points and reassigns them to remove wasted space. > Farmer John has just arranged his $N$ haybales $(1\le N \le 100,000)$ at various points along the one-dimensional road running across his farm. To make sure they are spaced out appropriately, please help him answer $Q$ queries ($1 \le Q \le 100,000$), each asking for the number of haybales within a specific interval along the road. However, each of the points are in the range $0 \ldots 1,000,000,000$, meaning you can't store locations of haybales in, for instance, a boolean array. Let's place all of the locations of the haybales into a list and sort it. (fix part below so transform to range $1\ldots N$)