Formulate the mathematical definitions of Big-O, Big-Omega, and Big-Theta asymptotic notations, and explain their role in algorithmic analysis.
Asymptotic notations characterize the limiting behavior of an algorithm's resource consumption (runtime or memory) as the input problem size n approaches infinity, independent of specific hardware clock speeds, instruction sets, or compiler optimizations. Formally, for two non-negative functions f(n) and g(n):
1. Big-O Notation (Asymptotic Upper Bound): We write f(n) = O(g(n)) if there exist positive constants c > 0 and n₀ >= 0 such that f(n) <= c · g(n) for all n >= n₀. In limit form, limsup_{n → ∞} f(n)/g(n) < ∞. This provides a worst-case guarantee that growth rate does not exceed g(n).
2. Big-Omega Notation (Asymptotic Lower Bound): We write f(n) = Ω(g(n)) if there exist positive constants c > 0 and n₀ >= 0 such that f(n) >= c · g(n) for all n >= n₀, or liminf_{n → ∞} f(n)/g(n) > 0. This establishes an insurmountable theoretical lower bound on the operations required.
3. Big-Theta Notation (Asymptotically Tight Bound): We write f(n) = Θ(g(n)) if and only if f(n) = O(g(n)) and f(n) = Ω(g(n)). That is, there exist positive constants c₁, c₂ > 0 and n₀ >= 0 such that c₁ · g(n) <= f(n) <= c₂ · g(n) for all n >= n₀. For Binary Search, the worst-case number of comparisons is bounded above and below by logarithmic functions, establishing that T_worst(n) = Θ(log₂ n).