Binary Search as Divide and Conquer in DSA C# - Time & Space Complexity
We want to understand how the time taken by binary search changes as the list size grows.
How does splitting the search area in half affect the number of steps?
Analyze the time complexity of the following code snippet.
public int BinarySearch(int[] arr, int target) {
int left = 0, right = arr.Length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
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 and adjusting the search range.
- How many times: The search range halves each time until the target is found or range is empty.
Each step cuts the search area in half, so the number of steps grows slowly as the list grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: Doubling the input size adds only one extra step.
Time Complexity: O(log n)
This means the time grows slowly, adding just one step each time the input size doubles.
[X] Wrong: "Binary search checks every element like linear search."
[OK] Correct: Binary search skips half the elements each step, so it does far fewer checks.
Understanding binary search time complexity shows you can analyze efficient algorithms that use smart dividing steps.
"What if the array was not sorted? How would the time complexity change?"
Practice
Binary Search as a divide and conquer algorithm?Solution
Step 1: Understand divide and conquer in binary search
Binary search splits the array into two halves and decides which half to search next.Step 2: Identify the repeated halving process
It keeps dividing the search space by half until the target is found or no elements remain.Final Answer:
It repeatedly divides the search interval in half to find the target value. -> Option AQuick Check:
Divide and conquer = repeated halving [OK]
- Thinking binary search checks every element
- Confusing binary search with linear search
- Assuming binary search sorts the array
Solution
Step 1: Understand overflow risk in mid calculation
Adding low and high directly can overflow if both are large.Step 2: Use safe formula to avoid overflow
Calculating mid as low + (high - low) / 2 prevents overflow by subtracting first.Final Answer:
int mid = low + (high - low) / 2; -> Option CQuick Check:
Safe mid calculation = low + (high - low) / 2 [OK]
- Using (low + high) / 2 causing overflow
- Subtracting incorrectly in mid calculation
- Multiplying indices instead of adding
int[] arr = {2, 4, 6, 8, 10};
int target = 6;
int low = 0, high = arr.Length - 1;
int result = -1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
result = mid;
break;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
Console.WriteLine(result);Solution
Step 1: Trace the binary search steps
Initial low=0, high=4, mid=2 (element 6). arr[2] == target 6, so result=2 and loop breaks.Step 2: Output the result
Since target found at index 2, Console.WriteLine prints 2.Final Answer:
2 -> Option BQuick Check:
Target 6 found at index 2 [OK]
- Confusing index with value
- Not updating low and high correctly
- Assuming target not found and returning -1
int BinarySearch(int[] arr, int target) {
int low = 0, high = arr.Length - 1;
while (low < high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}Solution
Step 1: Analyze the loop condition
The condition 'low < high' misses checking when low equals high, possibly skipping last element.Step 2: Fix loop to include all elements
Changing condition to 'low <= high' ensures the last element is checked.Final Answer:
Change while condition to 'low <= high' to include last element. -> Option DQuick Check:
Loop condition must cover all indices [OK]
- Using 'low < high' and missing last element
- Changing mid calculation unnecessarily
- Returning wrong index when not found
int[] arr = {1, 2, 2, 2, 3, 4}. How would you modify binary search to find the first occurrence of 2?Solution
Step 1: Understand duplicates in binary search
Standard binary search returns any occurrence, not necessarily the first.Step 2: Modify search to find first occurrence
When target found, move high pointer to mid - 1 to check left side for earlier occurrence, keep track of current mid.Final Answer:
After finding target, continue searching left half to find first occurrence. -> Option AQuick Check:
Find first occurrence by searching left after match [OK]
- Stopping at first found index ignoring duplicates
- Searching right half instead of left for first occurrence
- Using linear search unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
