Let’s say we have an algorithm runtime function . can be a runtime function for worst, average, or best case scenario; note that these three scenarios may require different runtime functions. We can describe with an approximation function like so (in order of upper to lower bounds):

  • : little-o notation
    • is an asymptotic upper bound that is strictly not asymptotically tight
    • algorithm runtime grows no faster than
  • : big-O notation
    • is an asymptotic upper bound that is not necessarily tight
    • algorithm runtime grows no faster than
  • : big-Theta notation
    • is an asymptotic tight bound
    • algorithm runtime grows as fast as
    • exists only if big-O and big-Omega is within a constant factor of each other
  • : big-Omega notation
    • is an asymptotic lower bound that is not necessarily tight
    • algorithm runtime grows faster than
  • : little-omega notation
    • is an asymptotic lower bound that is strictly not asymptotically tight
    • algorithm runtime grows faster than