Understanding Big O Notation with Examples in Ruby, Python, and JavaScript: Mastering Algorithms

Deciphering Algorithmic Complexity: A Comparative Exploration in Python, Ruby, and JavaScript

--

Big O notation is a mathematical notation used in computer science to describe the performance or complexity of an algorithm. Specifically, it describes the worst-case scenario and can be used to describe the execution time required or the space used by an algorithm.

Steps to Calculate Big O

Identify Basic Operations: Determine the most frequently performed operation.

Count Operations: Count the number of basic operations in terms of the input size n.

Find the Upper Bound: Determine the upper bound of the number of operations as n approaches infinity.

Simplify: Simplify the expression to the highest order term.

Examples in Different Languages

Constant Time — O(1)

Python

def constant_time_algo(arr):
return arr[0]

Ruby

def constant_time_algo(arr)
arr[0]
end

Javascript

function constantTimeAlgo(arr) {
return arr[0];
}

In each of these examples, the algorithm performs a single operation, accessing the first element of an array, which takes constant time regardless of the array’s size.

Linear Time — O(n)

Python

def linear_time_algo(arr):
for elem in arr:
print(elem)

Ruby

def linear_time_algo(arr)
arr.each do |elem|
puts elem
end
end

JavaScript

function linearTimeAlgo(arr) {
arr.forEach(function(elem) {
console.log(elem);
});
}

In these examples, the algorithms perform a single operation for each element in the input array, leading to a linear time complexity.

Quadratic Time — O(n²)

Python

def quadratic_time_algo(arr):
for i in arr:
for j in arr:
print(i, j)

Ruby

def quadratic_time_algo(arr)
arr.each do |i|
arr.each do |j|
puts "#{i}, #{j}"
end
end
end

JavaScript

function quadraticTimeAlgo(arr) {
arr.forEach(function(i) {
arr.forEach(function(j) {
console.log(i, j);
});
});
}

These examples illustrate algorithms with quadratic time complexity due to the presence of two nested loops, each running for the length of the input array.

Detailed Calculation of Big O

Let’s consider a more detailed example in Python, Ruby, and JavaScript:

Python

def example_algo(arr):
sum = 0
product = 1
for num in arr:
sum += num
for num in arr:
product *= num
print("Sum =", sum, ", Product =", product)

Ruby

def example_algo(arr)
sum = 0
product = 1
arr.each { |num| sum += num }
arr.each { |num| product *= num }
puts "Sum = #{sum}, Product = #{product}"
end

JavaScript

function exampleAlgo(arr) {
let sum = 0;
let product = 1;
arr.forEach(function(num) {
sum += num;
product *= num;
});
console.log("Sum =", sum, ", Product =", product);
}

Calculating

  1. Identify Basic Operations: Addition and multiplication are the basic operations.
  2. Count Operations: There are two loops, each performing n basic operations.
  3. Find the Upper Bound: The upper bound is the sum of the operations inside and outside the loops.
  4. Simplify: Simplify to the highest order term.

Simplifying

O(1)+O(1)+O(n)+O(n)+O(1)=2∗O(n)=O(n)

So, the time complexity of example_algo in Python, Ruby, and JavaScript is O(n).

Conclusion

Understanding Big O notation is crucial for analyzing the efficiency of algorithms. It provides a high-level understanding of the algorithm in terms of time and space complexity, allowing developers to make informed decisions when designing and implementing algorithms in any programming language, be it Python, Ruby, JavaScript, or any other.

--

--