When analyzing the time complexity of algorithms, we often encounter arithmetic operations. Understanding how these operations affect the overall Big-O notation is crucial.

Basic Rules:

  1. Addition:

    • O(f(n)) + O(g(n)) = O(max(f(n), g(n)))

    This means that the combined complexity of two operations is dominated by the slower one. For example:

    • O(n) + O(log n) = O(n)
    • O(n^2) + O(n) = O(n^2)

    Addition is normally use in consecutive operations.

  2. Multiplication:

    • O(f(n)) * O(g(n)) = O(f(n) * g(n))

    The complexity of multiplying two operations is the product of their individual complexities. For example:

    • O(n) * O(log n) = O(n log n)
    • O(n^2) * O(n) = O(n^3)

    Multiplication is normally use in nested operations.

Example: Analyzing a Simple Algorithm

Let's consider a simple algorithm that iterates through an array of size n and performs two operations on each element:

for i = 1 to n:
  // Operation 1: O(1)
  // Operation 2: O(log n)
  • Operation 1: This operation takes constant time, O(1).
  • Operation 2: This operation takes logarithmic time, O(log n).

The loop iterates n times, so the overall complexity is:

O(n * (1 + log n)) = O(n + n log n)

Using the addition rule, we can simplify this to:

O(max(n, n log n)) = O(n log n)

Therefore, the time complexity of the algorithm is O(n log n).

Key Points to Remember:

  • Constant Factors: Constant factors don't affect the Big-O notation. For example, O(2n) is the same as O(n).
  • Lower-Order Terms: Lower-order terms can be ignored. For instance, O(n^2 + n) is the same as O(n^2).
  • Focus on the Dominant Term: When analyzing complex expressions, identify the term with the highest growth rate. This term will dominate the overall complexity.

By understanding these rules and applying them to specific algorithms, you can accurately assess their time and space complexity.