Why Binary Search and What Sorted Order Gives You in DSA Rust - Performance Analysis
We want to understand why searching in a sorted list is faster with binary search.
How does sorting help us find items quickly?
Analyze the time complexity of the following binary search code.
fn binary_search(arr: &[i32], target: i32) -> Option {
if arr.is_empty() {
return None;
}
let mut left = 0;
let mut right = arr.len() - 1;
while left <= right {
let mid = left + (right - left) / 2;
if arr[mid] == target {
return Some(mid);
} else if arr[mid] < target {
left = mid + 1;
} else {
right = mid - 1;
}
}
None
}
This code searches for a target number in a sorted array by repeatedly dividing the search range in half.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Checking the middle element of the current search range.
- How many times: The search range halves each time, so this check repeats about log2(n) times.
Each step cuts the search area in half, so the number of steps grows slowly as the list gets bigger.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 checks |
| 100 | About 7 checks |
| 1000 | About 10 checks |
Pattern observation: Doubling the input size adds only one more check, showing very slow growth.
Time Complexity: O(log n)
This means the number of steps grows very slowly even if the list gets much bigger.
[X] Wrong: "Binary search checks every element like linear search, so it's also O(n)."
[OK] Correct: Binary search skips half the list each time, so it does far fewer checks than looking at every element.
Knowing why binary search is fast shows you understand how sorting helps speed up searching, a key skill in many coding problems.
"What if the array was not sorted? How would that affect the time complexity of searching with binary search?"
Practice
Solution
Step 1: Understand binary search method
Binary search works by repeatedly dividing the list and comparing the middle element to the target.Step 2: Importance of sorted order
This division and comparison only make sense if the list is sorted, so we know which half to discard.Final Answer:
Because binary search divides the list and compares middle elements, which only works if the list is sorted -> Option CQuick Check:
Sorted list needed for binary search = True [OK]
- Thinking binary search works on unsorted lists
- Believing binary search requires unique elements
- Confusing binary search with linear search
Solution
Step 1: Identify sorted vector
Binary search requires the vector to be sorted in ascending order. let v = vec![1, 2, 3, 4]; is sorted ascending: 1, 2, 3, 4.Step 2: Check other options
let v = vec![3, 1, 4, 2]; is unsorted. let v = vec![4, 3, 2, 1]; is sorted descending, which is not standard for binary search. let v = vec!["apple", "banana", "cherry"]; is sorted alphabetically but contains strings, not integers.Final Answer:
let v = vec![1, 2, 3, 4]; -> Option AQuick Check:
Sorted vector for binary search = let v = vec![1, 2, 3, 4]; [OK]
- Using unsorted vectors for binary search
- Assuming descending order works without modification
- Mixing data types in vector
let v = vec![2, 4, 6, 8, 10];
let result = v.binary_search(&6);
println!("{:?}", result);Solution
Step 1: Understand binary_search return
binary_search returns Ok(index) if found, Err(insert_pos) if not found.Step 2: Find index of 6 in vector
Vector is [2,4,6,8,10]. 6 is at index 2 (0-based).Final Answer:
Ok(2) -> Option AQuick Check:
Index of 6 = 2, so output = Ok(2) [OK]
- Confusing Ok and Err results
- Miscounting zero-based index
- Assuming Err means found
let v = vec![5, 3, 8, 1];
let result = v.binary_search(&3);
println!("{:?}", result);Solution
Step 1: Check vector order
The vector is [5, 3, 8, 1], which is unsorted.Step 2: Understand binary_search requirement
binary_search requires sorted vectors; otherwise, the result is unpredictable or incorrect.Final Answer:
Logical error: vector is unsorted, so binary_search result is unreliable -> Option BQuick Check:
Unsorted vector breaks binary_search logic [OK]
- Assuming binary_search works on unsorted vectors
- Confusing syntax errors with logical errors
- Thinking binary_search needs mutable vector
v = vec![1, 3, 5, 7, 9], how can you find the position to insert 6 to keep the vector sorted using binary search?Solution
Step 1: Understand binary_search return for missing element
When element is not found, binary_search returns Err(insert_pos) where insert_pos is the index to insert to keep sorted order.Step 2: Find insert position for 6 in vector
Vector is [1,3,5,7,9]. 6 fits between 5 (index 2) and 7 (index 3), so insert position is 3.Final Answer:
Use v.binary_search(&6) which returns Err(3) -> Option DQuick Check:
Insert position for 6 = 3, so Err(3) returned [OK]
- Confusing Ok and Err results
- Misunderstanding insert position index
- Using iterator position instead of binary_search
Ready to prove it?
Pass the test and this pattern moves unknown
