Binary Search on a Sorted Array
Authors: Siyong Huang, Michael Cao, Nathan Chen, Andrew Wang
Prerequisites
Quickly finding elements in a sorted array.
Suppose that we want to find an element in a sorted array of size in time. We can do this with binary search; each iteration of the binary search cuts the search space in half, so the algorithm tests values. This is efficient and much better than testing every element in an array.
| Resources | |||
|---|---|---|---|
| CSA | animation, code, lower_bound + upper_bound | ||
| CPH | code, lower_bound + upper_bound, some applications | ||
| CF | problems similar to those covered in this module | ||
| KA | plenty of diagrams, javascript implementation | ||
Warning!
The code provided in the CSAcademy link under "Binary search on functions" is not correct! See Binary Search on the Answer for details.
Library Functions
C++
| Resources | |||
|---|---|---|---|
| CPP | with examples | ||
Java
| Resources | |||
|---|---|---|---|
| JAVA | |||
| JAVA | |||
Python
| Resources | |||
|---|---|---|---|
| Python | |||
| GFG | |||
Example - Counting Haybales
Focus Problem – read through this problem before continuing!
As each of the points are in the range , storing locations of haybales in a boolean array and then taking prefix sums of that would take too much time and memory.
Instead, let's place all of the locations of the haybales into a list and sort it. Now we can use binary search to count the number of cows in any range in time.
C++
We can use the the builtin lower_bound and upper_bound functions.
1#include <bits/stdc++.h>2using namespace std;34using ll = long long;56using vi = vector<int>;7#define pb push_back8#define rsz resize9#define all(x) begin(x), end(x)10#define sz(x) (int)(x).size()
Java
We can use the builtin Arrays.binarySearch function.
1import java.io.*;2import java.util.*;34public class haybales{5 public static void main(String[] args) throws IOException6 {7 BufferedReader br = new BufferedReader(new FileReader(new File("haybales.in")));8 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("haybales.out")));9 StringTokenizer st = new StringTokenizer(br.readLine());10 int N = Integer.parseInt(st.nextToken());
Python
We can use the builtin bisect.bisect function.
1from bisect import bisect23inp = open("haybales.in", 'r')4out = open("haybales.out", 'w')56N, Q = map(int, inp.readline().split())7arr = sorted(list(map(int, inp.readline().split())))89for i in range(Q):10 a, b = map(int, inp.readline().split())
Of course, the official solution does not use a library implementation of binary search.
Module Progress:
Join the USACO Forum!
Stuck on a problem, or don't understand a module? Join the USACO Forum and get help from other competitive programmers!