Binary Search Iterative Approach in DSA Go - Time & Space Complexity
We want to understand how the time taken by binary search changes as the list size grows.
Specifically, how many steps does it take to find a number in a sorted list?
Analyze the time complexity of the following code snippet.
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
for low <= high {
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
}
This code searches for a target number in a sorted list by repeatedly dividing the search range in half.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop that halves the search range each time.
- How many times: The loop runs until the search range is empty, roughly halving the size each time.
Each step cuts the list size 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 steps needed grow slowly, increasing by one step each time the list size doubles.
[X] Wrong: "Binary search checks every element one by one, so it is O(n)."
[OK] Correct: Binary search does not check every element; it cuts the search area in half each time, so it takes far fewer steps than checking all elements.
Knowing how binary search scales helps you explain efficient searching in sorted data, a common skill interviewers look for.
"What if the list was not sorted? How would the time complexity of searching change?"
Practice
mid variable in the iterative binary search algorithm?Solution
Step 1: Understand the role and importance of
Themidin binary searchmidvariable calculates the middle index between the currentlowandhighindices to split the search range. By checking the element atmid, the algorithm decides whether to search the left or right half next, making the search efficient.Final Answer:
To find the middle index of the current search range -> Option CQuick Check:
mid= middle index [OK]
- Confusing mid with target value
- Using mid as a counter instead of index
- Not updating mid inside the loop
mid in Go to avoid integer overflow?Solution
Step 1: Understand integer overflow risk and safe calculation
Addinglow + highdirectly can overflow if both are large integers. Calculatingmidaslow + (high - low) / 2avoids overflow by subtracting first.Final Answer:
mid := low + (high - low) / 2 -> Option DQuick Check:
Safe mid calculation avoids overflow [OK]
- Using (low + high)/2 directly causing overflow
- Subtracting incorrectly causing negative mid
- Confusing order of operations
package main
import "fmt"
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
for low <= high {
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
}
func main() {
arr := []int{2, 4, 6, 8, 10}
result := binarySearch(arr, 6)
fmt.Println(result)
}Solution
Step 1: Trace the binary search for target 6 and verify return
Array is [2,4,6,8,10]. Initial low=0, high=4. mid=2. arr[2]=6 matches target. Function returns mid = 2 immediately.Final Answer:
2 -> Option BQuick Check:
Index of 6 in array = 2 [OK]
- Returning value instead of index
- Off-by-one errors in mid calculation
- Not updating low/high correctly
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)
for low <= high {
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: Check high initialization and correct it
High is set to len(arr), which is out of array index range (max index is len(arr)-1). Set high to len(arr) - 1 to avoid index out of range error when accessing arr[mid].Final Answer:
The initial value of high should be len(arr) - 1 -> Option AQuick Check:
High = len(arr)-1 fixes index error [OK]
- Setting high to len(arr) causing runtime error
- Using wrong loop condition
- Returning value instead of index
Solution
Step 1: Understand duplicates issue and modify search logic
Standard binary search returns any occurrence, not necessarily the first. When arr[mid] == target, move high to mid - 1 to continue searching left side for earlier occurrence, but store mid as potential answer.Final Answer:
When arr[mid] == target, update high = mid - 1 and continue searching -> Option AQuick Check:
Adjust high to find first occurrence [OK]
- Returning immediately on first match
- Moving low right on match losing first occurrence
- Using linear search unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
