Open In App

Understanding Time Complexity with Simple Examples

A lot of students get confused while understanding the concept of time complexity, but in this article, we will explain it with a very simple example.

Q. Imagine a classroom of 100 students in which you gave your pen to one person. You have to find that pen without knowing to whom you gave it. 

Here are some ways to find the pen and what the O order is.

I might need to do:

The above O -> is called Big - Oh which is an asymptotic notation. There are other asymptotic notations like theta and Omega.

NOTE: We are interested in the rate of growth over time with respect to the inputs taken during the program execution.

Is the Time Complexity of an Algorithm/Code the same as the Running/Execution Time of Code?

The Time Complexity of an algorithm/code is not equal to the actual time required to execute a particular code, but the number of times a statement executes. We can prove this by using the time command

For example: Write code in C/C++ or any other language to find the maximum between N numbers, where N varies from 10, 100, 1000, and 10000. For Linux based operating system (Fedora or Ubuntu), use the below commands: 

To compile the program: gcc program.c – o program
To execute the program: time ./program

You will get surprising results i.e.:

So, we can say that the actual time required to execute code is machine-dependent (whether you are using Pentium 1 or Pentium 5) and also it considers network load if your machine is in LAN/WAN. 

What is meant by the Time Complexity of an Algorithm?

Now, the question arises if time complexity is not the actual time required to execute the code, then what is it? 

The answer is: 

Instead of measuring actual time required in executing each statement in the code, Time Complexity considers how many times each statement executes. 

Example 1: Consider the below simple code to print Hello World

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World";
    return 0;
}

// This code is contributed by vikash36905.
#include <stdio.h>

int main()
{
    printf("Hello World");
    return 0;
}
import java.io.*;

class GFG {
    public static void main(String[] args)
    {
        System.out.print("Hello World");
    }
}

// This code is contributed by vikash36905.
print("Hello World")

# This code is contributed by akashish__
using System;

public class GFG{

    static public void Main (){

        // Code
          Console.WriteLine("Hello World");
    }
}
// This code is contributed by lokesh
console.log("Hello World")

// This code is contributed by nilha72xi.

Output
Hello World

Time Complexity: In the above code “Hello World” is printed only once on the screen. 
So, the time complexity is constant: O(1) i.e. every time a constant amount of time is required to execute code, no matter which operating system or which machine configurations you are using. 
Auxiliary Space: O(1)

Example 2:

#include <iostream>
using namespace std;

int main()
{

    int i, n = 8;
    for (i = 1; i <= n; i++) {
        cout << "Hello World !!!\n";
    }
    return 0;
}

// This code is contributed by vikash36905.
#include <stdio.h>
void main()
{
    int i, n = 8;
    for (i = 1; i <= n; i++) {
        printf("Hello World !!!\n");
    }
}
class GFG {

    public static void main(String[] args)
    {
        int i, n = 8;
        for (i = 1; i <= n; i++) {
            System.out.printf("Hello World !!!\n");
        }
    }
}

// This code is contributed by Rajput-Ji
# Python code
n = 8
for i in range(1, n + 1):
    print("Hello World !!!")

# This code is contributed by lokesh
using System;
public class GFG {

    public static void Main(String[] args)
    {
        int i, n = 8;
        for (i = 1; i <= n; i++) {
            Console.Write("Hello World !!!\n");
        }
    }
}

// This code contributed by Rajput-Ji
let i, n = 8;
for (i = 1; i <= n; i++) {
    console.log("Hello World !!!");
   }

Output
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!

Time Complexity: In the above code “Hello World !!!” is printed only n times on the screen, as the value of n can change. 
So, the time complexity is linear: O(n) i.e. every time, a linear amount of time is required to execute code.
Auxiliary Space: O(1)

Example 3:

#include <iostream>
using namespace std;

int main()
{

    int i, n = 8;
    for (i = 1; i <= n; i=i*2) {
        cout << "Hello World !!!\n";
    }
    return 0;
}

// This code is contributed by Suruchi Kumari
#include <stdio.h>
void main()
{
    int i, n = 8;
    for (i = 1; i <= n; i=i*2) {
        printf("Hello World !!!\n");
    }
}
// This code is contributed by Suruchi Kumari
class GFG {

    public static void main(String[] args)
    {
        int i, n = 8;
        for (i = 1; i <= n; i=i*2) {
            System.out.println("Hello World !!!");
        }
    }
}

// This code is contributed by Suruchi Kumari
n = 8
# for (i = 1; i <= n; i=i*2) {
for i in range(1, n+1, 2):
    print("Hello World !!!")

# This code is contributed by akashish__
using System;

public class GFG{

    static public void Main (){

        // Code
          int i, n = 8;
        for (i = 1; i <= n; i=i*2) {
            Console.Write("Hello World !!!\n");
        }
    }
}
// This code is contributed by lokeshmvs21.
for (i = 1; i <= 8; i=i*2) {
    console.log("Hello World !!!");
    }
    
    // This code is contributed by nilha7xi.

Output
Hello World !!!
Hello World !!!
Hello World !!!
Hello World !!!

Time Complexity: O(log2(n))
Auxiliary Space: O(1)

Example 4:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{

    int i, n = 8;
    for (i = 2; i <= n; i=pow(i,2)) {
        cout << "Hello World !!!\n";
    }
    return 0;
}

// This code is contributed by Suruchi Kumari
#include <stdio.h>
#include <math.h>
void main()
{
    int i, n = 8;
    for (i = 2; i <= n; i=pow(i,2)) {
        printf("Hello World !!!\n");
    }
}
// This code is contributed by Suruchi Kumari
import java.lang.Math;
class GFG {
  public static void main(String args[]){
    int i, n = 8;
    for (i = 2; i <= n; i=(int)Math.pow(i,2)) {
        System.out.println("Hello World !!!");
    }
  }   
}
n = 8
i = 2
for j in range(2,n+1):
    if(i >= n):
        break 
    print("Hello World !!!")   
    i *= i
# This code is contributed by akashish__
using System;
using System.Collections.Generic;

public class GFG {

  static public void Main()
  {

    int i, n = 8;
    for (i = 2; i <= n; i = (int)Math.Pow(i, 2)) {
      Console.WriteLine("Hello World !!!");
    }
  }
}

// This code is contributed by akashish__
for (let i = 2; i <= 8; i=Math.pow(i,2)) {
        console.log("Hello World !!!");
       }
       
       // This code is contributed by nilha7xi.

Output
Hello World !!!
Hello World !!!

Time Complexity: O(log(log n))
Auxiliary Space: O(1)

How To Find The Time Complexity Of An Algorithm?

Now let us see some other examples and the process to find the time complexity of an algorithm:

Example: Let us consider a model machine that has the following specifications: 

Q1. Find the Sum of 2 numbers on the above machine:

For any machine, the pseudocode to add two numbers will be something like this:

// Pseudocode : Sum(a, b) { return a + b }
#include <iostream>
using namespace std;

int sum(int a,int b)
{
 return a+b; 
}

int main() {
      int a = 5, b = 6;
    cout<<sum(a,b)<<endl;
    return 0;
}

// This code is contributed by akashish__
Pseudocode : Sum(a, b) { return a + b }
// Pseudocode : Sum(a, b) { return a + b }
import java.io.*;

class GFG {

    public static int sum(int a, int b) { return a + b; }

    public static void main(String[] args)
    {
        int a = 5, b = 6;
        System.out.println(sum(a, b));
    }
}
// This code is contributed by akashish__
# Pseudocode : Sum(a, b) { return a + b }
a = 5
b = 6

def sum(a,b):
  return a+b

 # function call
print(sum(a,b))
// Pseudocode : Sum(a, b) { return a + b }
using System;

public class GFG {

    public static int sum(int a, int b) { return a + b; }

    static public void Main()
    {

        int a = 5, b = 6;
        Console.WriteLine(sum(a, b));
    }
}
// This code is contributed by akashish__
// Pseudocode : Sum(a, b) { return a + b }

function sum(a, b) {
    return a + b;
}

let a = 5, b = 6;
console.log(sum(a, b));

// This code is contributed by akashish__

Output
11

Time Complexity:  

Auxiliary Space: O(1)

Q2. Find the sum of all elements of a list/array

The pseudocode to do so can be given as:

#include <iostream>
using namespace std;

int list_Sum(int A[], int n)
  
// A->array and
// n->number of elements in array
{
    int sum = 0;
    for (int i = 0; i <= n - 1; i++) {
        sum = sum + A[i];
    }
    return sum;
}

int main()
{
    int A[] = { 5, 6, 1, 2 };
    int n = sizeof(A) / sizeof(A[0]);
    cout << list_Sum(A, n);
    return 0;
}

// This code is contributed by akashish__
Pseudocode : list_Sum(A, n)
// A->array and
// n->number of elements in array
{
sum = 0           
for i = 0 to n-1    
    sum = sum + A[i] 
return sum
}
// Java code for the above approach

import java.io.*;

class GFG {

    static int list_Sum(int[] A, int n)

    // A->array and
    // n->number of elements in array
    {
        int sum = 0;
        for (int i = 0; i <= n - 1; i++) {
            sum = sum + A[i];
        }
        return sum;
    }

    public static void main(String[] args)
    {
        int[] A = { 5, 6, 1, 2 };
        int n = A.length;
        System.out.println(list_Sum(A, n));
    }
}

// This code is contributed by lokeshmvs21.
# A function to calculate the sum of the elements in an array
def list_sum(A, n):
    sum = 0
    for i in range(n):
        sum += A[i]
    return sum


# A sample array
A = [5, 6, 1, 2]

# Finding the number of elements in the array
n = len(A)

# Call the function and print the result
print(list_sum(A, n))
using System;

public class GFG {

  public static int list_Sum(int[] A, int n)

    // A->array and
    // n->number of elements in array
  {
    int sum = 0;
    for (int i = 0; i <= n - 1; i++) {
      sum = sum + A[i];
    }
    return sum;
  }

  static public void Main()
  {
    int[] A = { 5, 6, 1, 2 };
    int n = A.Length;
    Console.WriteLine(list_Sum(A, n));
  }
}

// This code is contributed by akashish__
function list_Sum(A, n)
// A->array and
// n->number of elements in array
{
    let sum = 0;
    for (let i = 0; i <= n - 1; i++) {
        sum = sum + A[i];
    }
    return sum;
}

let A = [ 5, 6, 1, 2 ];
let n = A.length;
console.log(list_Sum(A, n));

// This code is contributed by akashish__

Output
14


To understand the time complexity of the above code, let's see how much time each statement will take:

int list_Sum(int A[], int n)
{
    int sum = 0;    // cost=1  no of times=1
    for(int i=0; i<n; i++)    // cost=2  no of times=n+1 (+1 for the end false condition)
        sum = sum + A[i]  ;     // cost=2  no of times=n 
    return sum ;                // cost=1  no of times=1
}
Pseudocode : list_Sum(A, n)
{
total =0                   // cost=1  no of times=1
for i=0 to n-1             // cost=2  no of times=n+1 (+1 for the end false condition)
    sum = sum + A[i]       // cost=2  no of times=n 
return sum                 // cost=1  no of times=1
}
public class ListSum {

    // Function to calculate the sum of elements in an array
    static int listSum(int[] A, int n) {
        int sum = 0; // Cost = 1, executed 1 time

        for (int i = 0; i < n; i++) { // Cost = 2, executed n+1 times (+1 for
                                      // the end false condition)
            sum = sum + A[i]; // Cost = 2, executed n times
        }

        return sum; // Cost = 1, executed 1 time
    }

    // Main method for testing
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        int length = array.length;
        int result = listSum(array, length);
        System.out.println("Sum: " + result);
    }
}
def list_sum(A):
    sum = 0
    for i in range(len(A)):
        sum = sum + A[i]
    return sum
using System;

class Program
{
    // Function to calculate the sum of elements in a list
    static int ListSum(int[] A)
    {
        int sum = 0; // Initialize sum to 0

        // Loop to iterate through the array elements
        for (int i = 0; i < A.Length; i++)
        {
            sum = sum + A[i]; // Accumulate the sum
        }

        return sum; // Return the calculated sum
    }

    // Driver code
    static void Main()
    {
        // Example usage
        int[] array = { 1, 2, 3, 4, 5 };
        int result = ListSum(array);

        Console.WriteLine(result);
    }
}
function listSum(A) {
    let sum = 0; // Initialize sum to 0

    // Loop to iterate through the array elements
    for (let i = 0; i < A.length; i++) {
        sum = sum + A[i]; // Accumulate the sum
    }

    return sum; // Return the calculated sum
}

// Example usage
let array = [1, 2, 3, 4, 5];
let result = listSum(array);

console.log(result);

Therefore the total cost to perform sum operation 

Tsum=1 + 2 * (n+1) + 2 * n + 1 = 4n + 4 =C1 * n + C2 = O(n)

Therefore, the time complexity of the above code is O(n)

Q3. Find the sum of all elements of a matrix

For this one, the complexity is a polynomial equation (quadratic equation for a square matrix)

#include <iostream>
using namespace std;

int main()
{
    int n = 3;
    int m = 3;
    int arr[][3]
        = { { 3, 2, 7 }, { 2, 6, 8 }, { 5, 1, 9 } };
    int sum = 0;

    // Iterating over all 1-D arrays in 2-D array
    for (int i = 0; i < n; i++) {

        // Printing all elements in ith 1-D array
        for (int j = 0; j < m; j++) {

            // Printing jth element of ith row
            sum += arr[i][j];
        }
    }
    cout << sum << endl;
    return 0;
}
// contributed by akashish__
/*package whatever //do not write package name here */

import java.io.*;

class GFG {
    public static void main(String[] args)
    {
        int n = 3;
        int m = 3;
        int arr[][]
            = { { 3, 2, 7 }, { 2, 6, 8 }, { 5, 1, 9 } };
        int sum = 0;

        // Iterating over all 1-D arrays in 2-D array
        for (int i = 0; i < n; i++) {

            // Printing all elements in ith 1-D array
            for (int j = 0; j < m; j++) {

                // Printing jth element of ith row
                sum += arr[i][j];
            }
        }
        System.out.println(sum);
    }
}
// akashish__
n = 3
m = 3
arr = [[3, 2, 7], [2, 6, 8], [5, 1, 9]]
sum = 0

# Iterating over all 1-D arrays in 2-D array
for i in range(n):
    # Printing all elements in ith 1-D array
    for j in range(m):
        # Printing jth element of ith row
        sum += arr[i][j]

print(sum)

# This code id contributed by shivhack999
using System;

class MainClass {
    static void Main(string[] args)
    {
        int n = 3;
        int m = 3;
        int[, ] arr
            = { { 3, 2, 7 }, { 2, 6, 8 }, { 5, 1, 9 } };
        int sum = 0;

        // Iterating over all 1-D arrays in 2-D array
        for (int i = 0; i < n; i++) {
            // Printing all elements in ith 1-D array
            for (int j = 0; j < m; j++) {
                // Printing jth element of ith row
                sum += arr[i, j];
            }
        }
        Console.WriteLine(sum);
    }
}
let n = 3;
let m = 3;
let arr = [[3, 2, 7], [2, 6, 8], [5, 1, 9]];
let sum = 0;

// Iterating over all 1-D arrays in 2-D array
for (let i = 0; i < n; i++) { 
    // Printing all elements in ith 1-D array
for (let j = 0; j < m; j++) {

    // Printing jth element of ith row
    sum += arr[i][j];
}
}
console.log(sum);

Output
43

Time Complexity: O(n*m)
The program iterates through all the elements in the 2D array using two nested loops. The outer loop iterates n times and the inner loop iterates m times for each iteration of the outer loop. Therefore, the time complexity of the program is O(n*m).

Auxiliary Space: O(n*m)
The program uses a fixed amount of auxiliary space to store the 2D array and a few integer variables. The space required for the 2D array is nm integers. The program also uses a single integer variable to store the sum of the elements. Therefore, the auxiliary space complexity of the program is O(nm + 1), which simplifies to O(n*m).

In conclusion, the time complexity of the program is O(nm), and the auxiliary space complexity is also O(nm).

So from the above examples, we can conclude that the time of execution increases with the type of operations we make using the inputs.

How to Compare Algorithms?

To compare algorithms, let us define a few objective measures:

Related articles:

Article Tags :