How to calculate Time Complexity for a given algorithm
One of my friends wanted to know "How to calculate the time complexity of a given algorithm". My obvious answer to him was... "Why do YOU want to calculate it?. There are tools available that do it for you!!" (E.g. Analyze menu in VS Team Suite, NDepend are a few). Well... I don't want to say what his answer was, but he wanted to know :-)
In my personal view, it's a good to know "cool" thing, but not really required for ALL.
With that note, let me write a small program and calculate the time complexity for it.
Here is a sample code to remove an invalid character from an array.
1: namespace TimeComplexity
2: {
3: class Program
4: {
5: static void Main(string[] args)
6: {
7: char[] arr = { 'a', 'b', 'b', 'd', 'e' };
8: char invalidChar = 'b';
9: int ptr = 0, N = arr.Length;
10: for (int i = 0; i < n; i++)
11: {
12: if (arr[i] != invalidChar)
13: {
14: arr[ptr] = arr[i];
15: ptr++;
16: }
17: }
18:
19: for (int i = 0; i < ptr; i++)
20: {
21: Console.Write(arr[i]);
22: Console.Write(' ');
23: }
24: Console.ReadLine();
25: }
26: }
27: }
Output for the above code will look like
a d e
Let's look at each loop one at a time. That's the key; you calculate the time complexity for each loop
1: for (int i = 0; i < N; i++)
2: {
3: if (arr[i] != invalidChar)
4: {
5: arr[ptr] = arr[i];
6: ptr++;
7: }
8: }
The above Code snippet contains a lot of basic operations which will be repeated. (That's why it's called a loop.. duh !!). The basic operations it contains are
int i=0; | This will be executed only once. The time is actually calculated to i=0 and not the declaration. |
i<N; | This will be executed N+1 times |
i++ ; | This will be executed N times |
if(arr[i]!=invalidChar) | This will be executed N times |
arr[ptr]=arr[i]; | This will be executed N times (in worst case scenario) |
ptr++; | This will be executed N times (in worst case scenario) |
Note: I considered the worst case scenario and am calculating the Worst Case Time Complexity for the above code
So the number of operations required by this loop are
{1+(N+1)+N}+N+N+N = 5N+2
The part inside the curly braces is the time consumed by Loop alone (i.e.. for(int i =0;i<N;i++)), it is 2N+2. Keep this mind; it is usually the same (unless you have a non-default FOR loop)
Now for the second loop
1: for (int i = 0; i < ptr; i++)
2: {
3: Console.Write(arr[i]);
4: Console.Write(' ');
5: }
Remember, a loop takes 2N+2 iterations. So, here it will take 2ptr+2 operations. Again, considering the worst case scenario ptr will be N so the above expression evaluates to (again) 2N+2. Then there are these additional 2 operations of Console.Write with will be executed N times each (Again, worst case scenario).
So the above code snippet will take
{1+(N+1)+N}+N+N = 4N+2
Oh.. I almost forgot the other statements
char[] arr = { 'a', 'b', 'b', 'd', 'e' }; | This will be executed N times |
char invalidChar = 'b'; | This will be executed 1 time |
int ptr = 0; | This will be executed 1 time |
N = arr.Length; | This will be executed 1 time |
Console.ReadLine(); | This will be executed 1 time |
Note: The character array initialization will actually execute N times. This is because you are assigning one character at a time.
So the rest of the code requires
N+4
Adding everything up I get
(N+4)+(5N+2)+(4N+2) = 10N+8
So the asymptotic time complexity for the above code is O(N), which means that the above algorithm is a liner time complexity algorithm.
There you have it, now you know how to calculate the time complexity of a simple program.