Problem : Define "Big-O notation".

Big-O notation is a theoretical measure of the execution of an algorithm, usually the time or memory needed, given the problem size n, which is usually the number of items in the input. Informally, saying some equation f (n) = O(g(n)) means it is less than some constant multiple of g(n). More formally it means there are positive constants c and k, such that 0 < = f (n) < = cg(n) for all n > = k. The values of c and k must be fixed for the function f and must not depend on n.

Problem : Prove that the function f (n) = n2 + 3n + 1 is O(n2).

We can come up with an equation g(n) like g(n) = 2n2 such that f (n) < g(n) when n > = 3. Therefore, f (n) = O(g(n)), and n2 + 3n + 1 is O(n2).

Problem : You are given two functions, one which has an average case running time of O(n2) and the other which has an average running time of O(nlogn). In general, which would you choose?

You would most likely choose the algorithm with an efficiency of O(nlogn). For a large enough input size, an algorithm with O(nlogn) will run faster than an algorithm with O(n2).

Problem : True or false: A function with O(n) efficiency will always run faster than a function with O(n2) efficiency?

False. Remember that we only care about the dominant term in an equation when determining the big-O of a function. For example, function 1 could have been 1000n and function 2 could have been n2 + 1. Note than for some n, the first function will actually take longer than the second, but for significantly large n the second function will be faster.

Problem : Draw a graph showing how n, logn, n2, and 2n compare as n increases.

Figure %: Graph of the rates of growth