š§ Mental Model: Dictionary Lookup Strategy
The Dictionary Search
Think of looking up a word in a physical dictionary. You don't start from page 1 and read every word! Instead, you open to the middle, see if your word comes before or after, then eliminate half the dictionary. Repeat until found.
- šÆ Target - The value you're searching for
- š Middle Point - Check the center of current range
- āļø Eliminate Half - Discard the impossible half
- š Repeat - Continue with remaining half until found
š® Interactive Binary Search Visualizer
Watch binary search in action! Enter a target value and see how it eliminates half the possibilities each step:
Sorted Array:
āļø Algorithm Implementation
Binary search works by maintaining three pointers: left, right, and middle. With each comparison, we eliminate half the remaining possibilities, achieving O(log n) time complexity.
Binary Search Implementation
def binary_search(arr, target):
"""
Search for target in sorted array using binary search.
Returns index if found, -1 if not found.
"""
left = 0
right = len(arr) - 1
steps = 0
while left <= right:
steps += 1
middle = (left + right) // 2
middle_value = arr[middle]
print(f"Step {steps}: Checking index {middle}, value = {middle_value}")
if middle_value == target:
print(f"Found {target} at index {middle} in {steps} steps!")
return middle
elif middle_value < target:
print(f" {middle_value} < {target}, search right half")
left = middle + 1
else:
print(f" {middle_value} > {target}, search left half")
right = middle - 1
print(f"Value {target} not found after {steps} steps")
return -1
# Example usage:
sorted_numbers = [2, 5, 8, 12, 16, 23, 38, 42, 56, 67, 78, 84, 99]
result = binary_search(sorted_numbers, 42)
ā ļø Critical Pitfall: Sorted Data Requirement
Dangerous Assumption: Any Array Can Be Binary Searched
Beginner trap: Binary search ONLY works on sorted data! Using it on unsorted data will give incorrect results because the algorithm's logic depends on the sorted property.
ā Wrong: Unsorted Array
unsorted = [42, 8, 23, 5, 78, 16, 99]
# Binary search will fail!
# Might miss the target even if it exists
ā Correct: Sorted Array
sorted_array = [5, 8, 16, 23, 42, 78, 99]
# Binary search works perfectly!
# Guaranteed to find target if it exists
š§ Always Sort First
If your data isn't sorted, sort it first with sorted() or array.sort(). The O(n log n) sorting cost is often worth it if you'll be searching multiple times.
š Performance: Binary vs Linear Search
Binary search's power becomes clear when comparing it to linear search. The larger the dataset, the more dramatic the difference becomes.
š Linear Search: O(n)
- 1,000 items: up to 1,000 checks
- 1,000,000 items: up to 1,000,000 checks
- Worst case: check every element
š Binary Search: O(log n)
- 1,000 items: max 10 checks
- 1,000,000 items: max 20 checks
- Eliminates half each step
šÆ Mastery Check: Binary Search Understanding
Question 1: Time Complexity
What is the time complexity of binary search in the worst case?
O(log n) - logarithmic time
O(n) - linear time
O(n²) - quadratic time
Question 2: Prerequisite
What must be true about the data before you can use binary search?
The data must be sorted
The data must be unique (no duplicates)
The data must be numerical
šÆ Ready for Object-Oriented Programming!
What You've Mastered
- ā Binary search algorithm and divide-and-conquer strategy
- ā O(log n) time complexity advantage over linear search
- ā Critical requirement for sorted data
- ā Implementation with left, right, and middle pointers
- ā Performance comparison with linear search
Now that you've mastered efficient searching, let's learn how to organize code with classes and objects in Object-Oriented Programming!
Continue to OOP Basics ā