Overview
Optimized search algorithms for competitive programming including binary search variants and ternary search for unimodal functions.Binary Search
Binary search finds elements or boundaries in sorted data with O(log n) complexity.Binary Search Template I
Finds the minimum value where a condition becomes true.works(x) is true
Usage Example:
Binary Search Template II
Finds the maximum value where a condition is true.works(x) is true
Usage Example:
Binary Search Template III
Classic binary search to find exact element.Binary Search on Real Values
Binary search adapted for continuous domains.Template I (Fixed Iterations)
Template II (Epsilon)
Template III (Relative Epsilon)
Ternary Search
Finds minimum or maximum of unimodal functions.Ternary Search on Integers
Ternary Search on Real Values (Template I)
Ternary Search on Real Values (Template II)
With epsilon termination.Common Patterns
Pattern 1: Minimize Maximum
Pattern 2: Maximize Minimum
Pattern 3: Count Elements
Available Implementations
| Algorithm | File | Use Case |
|---|---|---|
| Binary Search I | searches_binary_search_I.cpp | Find min where condition true |
| Binary Search II | searches_binary_search_II.cpp | Find max where condition true |
| Binary Search III | searches_binary_search_III.cpp | Find exact element |
| Binary Search Real I | searches_binary_search_on_real_values_I.cpp | Fixed iterations |
| Binary Search Real II | searches_binary_search_on_real_values_II.cpp | Epsilon convergence |
| Binary Search Real III | searches_binary_search_on_real_values_III.cpp | Relative epsilon |
| Ternary Search Int | searches_ternary_search_on_integers_I.cpp | Unimodal integer functions |
| Ternary Search Real I | searches_ternary_search_on_real_values_I.cpp | Unimodal real functions |
| Ternary Search Real II | searches_ternary_search_on_real_values_II.cpp | With epsilon |
Tips and Best Practices
Choose Right Template
Template I for minimum, II for maximum, III for exact match
Define Monotonicity
Ensure search space has monotonic property
Handle Overflow
Use
low + (high - low) / 2 instead of (low + high) / 2Test Boundaries
Always test edge cases at boundaries
See Also
Techniques
Two pointers and sliding window
Range Query
Binary search on data structures