This Algorithms with Javascript tutorial is designed to help you understand and implement fundamental algorithms using the versatile JavaScript programming language. Whether you are a beginner in programming or looking to enhance your algorithmic skills, this guide will walk you through essential concepts, algorithms, and their implementations.
The algorithm is defined as a process or set of well-defined instructions that are typically used to solve a particular set of problems or perform a specific type of calculation. To explain it in simpler terms, it is a set of operations performed step-by-step to execute a task.
How to Start learning Algorithms in JavaScript?
Follow the below mentioned points for how to learn Algorithms in JavaScript:
- Know the fundamentals of Algorithms inside and out.
- Know exactly what happens in an algorithm.
- Understand the examples and grasp the algorithm's steps.
- Clearly know complexity analysis of algorithms in best, average and worst case.
- Solve problems based on the algorithms on your own.
Must know Algorithms in DSA using JavaScript Tutorial
The algorithms are divided into several categories, as shown below:
1. Searching Algorithms in Javascript:
Searching algorithms are used to find a specific element in an array, string, linked list, or some other data structure.
The most common search algorithms are:
In the Linear searching algorithm, we check for the element iteratively one by one from start to end to the other.
Linear searchHow Linear Search Works?
- Step 1: First, read the array's search element (Target element).
- Step 2: Set an integer i = 0 and repeat steps 3 to 4 until i reaches the array's end.
- Step 3: Match the key with arr[i].
- Step 4: If the key matches, return the index. Otherwise, increment i by 1.
Below is the implementation of Linear Search in javascript:
JavaScript
// Javascript code to linearly search x in arr[].
// If x is present then return its location,
// otherwise return -1
function linearSearch(arr, n, x) {
let i;
for (i = 0; i < n; i++)
if (arr[i] == x)
return i;
return -1;
}
// Function to call Linear Search method
function searchInArr(arr, n, x) {
// Function call
let result = linearSearch(arr, n, x);
if (result == -1)
console.log("Element is not present in array");
else
console.log("Element is present at index " + result);
}
// Driver code
let arr = [10, 30, 50, 60, 70];
let n = arr.length;
let x1 = 50;
searchInArr(arr, n, x1);
let x2 = 5;
searchInArr(arr, n, x2);
OutputElement is present at index 2
Element is not present in array
Complexity Analysis of Linear Search Algorithm
- Time Complexity of Linear Search: O(N), where N is the number of elements in the Array
- Auxiliary Space Complexity of Linear Search: O(1)
- In this type of searching algorithm, we break the data structure into two equal parts and try to decide in which half we need to find the element target element.
Binary SearchHow does Binary Search work?
To understand the working of binary search, consider the following illustration:
- First Step:
- Initially, the search space is from 0 to 9.
- Let’s denote the boundary by L and H where L = 0 and H = 9 initially.
- Now mid of this search space is M = 4.
- So compare the target with arr[M].
- Second Step:
- As arr[4] is less than the target, switch the search space to the right of 16, i.e., [5, 9].
- Now L = 5, H = 9, and M becomes 7.
- Compare target with arr[M].
- Third Step:
- arr[7] is greater than the target.
- Shift the search space to the left of M, i.e., [5, 6].
- So, now L = 5, H = 6 and M = 6.
- Compare arr[M] with the target.
- Here arr[M] and target are the same.
- So, we have found the target.
Here is the implementation of the above approach:
JavaScript
// Iterative function to implement Binary Search
let iterativeFunction = function (arr, x) {
let start=0, end=arr.length-1;
// Iterate while start not meets end
while (start<=end){
// Find the mid index
let mid=Math.floor((start + end)/2);
// If element is present at mid, return True
if (arr[mid]===x) return true;
// Else look in left or right half accordingly
else if (arr[mid] < x)
start = mid + 1;
else
end = mid - 1;
}
return false;
}
// Driver code
let arr = [1, 3, 5, 7, 8, 9];
let x = 5;
if (iterativeFunction(arr, x, 0, arr.length-1))
console.log("Element found!");
else console.log("Element not found!");
x = 6;
if (iterativeFunction(arr, x, 0, arr.length-1))
console.log("Element found!");
else console.log("Element not found!");
OutputElement found!
Element not found!
Time Complexity: O(logN)
Auxiliary Space: O(1)
A Sorting Algorithm is used to arrange a given array or list of elements according to a comparison operator on the elements. The comparison operator is used to decide the new order of elements in the respective data structure.
The most common sorting algorithms are:
Bubble sortBelow is the implementation of bubble sort in javascript:
JavaScript
function swap(arr, xp, yp)
{
var temp = arr[xp];
arr[xp] = arr[yp];
arr[yp] = temp;
}
// An optimized version of Bubble Sort
function bubbleSort( arr, n)
{
var i, j;
for (i = 0; i < n-1; i++)
{
for (j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j+1])
{
swap(arr,j,j+1);
}
}
}
}
/* Function to print an array */
function printArray(arr, size)
{
var i;
for (i=0; i < size; i++)
console.log(arr[i]+ " ");
}
// Driver program to test above functions
var arr = [5, 1, 4, 2, 8];
var n = 5;
console.log("UnSorted array:");
printArray(arr, n);
bubbleSort(arr, n);
console.log("Sorted array: ");
printArray(arr, n);
OutputUnSorted array:
5
1
4
2
8
Sorted array:
1
2
4
5
8
Insertion sortBelow is the implementation of Insertion sort in javascript:
JavaScript
// Javascript program for insertion sort
// Function to sort an array using insertion sort
function insertionSort(arr, n)
{
let i, key, j;
for (i = 1; i < n; i++)
{
key = arr[i];
j = i - 1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
// A utility function to print an array of size n
function printArray(arr, n)
{
let i;
for (i = 0; i < n; i++)
console.log(arr[i] + " ");
}
// Driver code
let arr = [12, 11, 13, 5, 6 ];
let n = arr.length;
console.log("Elements before sorting:")
printArray(arr, n);
insertionSort(arr, n);
console.log("Elements after sorting:")
printArray(arr, n);
OutputElements before sorting:
12
11
13
5
6
Elements after sorting:
5
6
11
12
13
Selection sortBelow is the implementation of selection sort in javascript:
JavaScript
// Javascript program for implementation of selection sort
function swap(arr,xp, yp)
{
var temp = arr[xp];
arr[xp] = arr[yp];
arr[yp] = temp;
}
function selectionSort(arr, n)
{
var i, j, min_idx;
// One by one move boundary of unsorted subarray
for (i = 0; i < n-1; i++)
{
// Find the minimum element in unsorted array
min_idx = i;
for (j = i + 1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// Swap the found minimum element with the first element
swap(arr,min_idx, i);
}
}
function printArray( arr, size)
{
var i;
for (i = 0; i < size; i++)
console.log(arr[i] + " ");
}
var arr = [64, 25, 12, 22, 11];
var n = 5;
console.log("UnSorted array: ");
printArray(arr, n);
selectionSort(arr, n);
console.log("Sorted array:");
printArray(arr, n);
OutputUnSorted array:
64
25
12
22
11
Sorted array:
11
12
22
25
64
The process in which a function calls itself directly or indirectly is called recursion and the corresponding function is called a recursive function. Using a recursive algorithm, certain problems can be solved quite easily. Examples of such problems are Towers of Hanoi (TOH), Inorder/Preorder/Postorder Tree Traversals, DFS of Graph, etc
Tower of HanoiBelow is the implementation of Tower of Hanoi in javascript:
JavaScript
// javascript recursive function to
// solve tower of hanoi puzzle
function towerOfHanoi(n, from_rod, to_rod, aux_rod)
{
if (n == 0)
{
return;
}
towerOfHanoi(n - 1, from_rod, aux_rod, to_rod);
console.log("Move disk " + n + " from rod " + from_rod +
" to rod " + to_rod);
towerOfHanoi(n - 1, aux_rod, to_rod, from_rod);
}
// Driver code
var N = 3;
// A, B and C are names of rods
towerOfHanoi(N, 'A', 'C', 'B');
// This code is contributed by gauravrajput1
OutputMove disk 1 from rod A to rod C
Move disk 2 from rod A to rod B
Move disk 1 from rod C to rod B
Move disk 3 from rod A to rod C
Move disk 1 from rod B to rod A
Move disk 2 from rod B to rod C
Move disk 1 from rod A to rod C
DFS of a GraphBelow is the implementation of DFS in javascript:
JavaScript
// JavaScript program to print DFS
// traversal from a given
// graph
// This class represents a
// directed graph using adjacency
// list representation
class Graph
{
// Constructor
constructor(v) {
this.V = v;
this.adj = new Array(v).fill([]);
}
// Function to Add an edge into the graph
AddEdge(v, w) {
this.adj[v].push(w); // Add w to v's list.
}
// A function used by DFS
DFSUtil(v, visited)
{
// Mark the current
// node as visited and print it
visited[v] = true;
console.log(v + " ");
// Recur for all the
// vertices adjacent to this
// vertex
for (const n of this.adj[v]) {
if (!visited[n]) this.DFSUtil(n, visited);
}
}
// The function to do
// DFS traversal. It uses recursive
// DFSUtil()
DFS()
{
// Mark all the vertices as not visited(set as
var visited = new Array(this.V).fill(false);
// Call the recursive helper
// function to print DFS
// traversal starting from
// all vertices one by one
for (var i = 0; i < this.V; ++i)
if (visited[i] == false) this.DFSUtil(i, visited);
}
}
// Driver Code
var g = new Graph(4);
g.AddEdge(0, 1);
g.AddEdge(0, 2);
g.AddEdge(1, 2);
g.AddEdge(2, 0);
g.AddEdge(2, 3);
g.AddEdge(3, 3);
console.log("Following is Depth First Traversal<br>");
g.DFS();
// This code is contributed by rdtank.
OutputFollowing is Depth First Traversal<br>
0
1
2
3
Fibonacci numberBelow is the implementation of the Fibonacci number in javascript:
JavaScript
//Fibonacci Series using Recursion
let n = 9;
// function returns the Fibonacci number
function fib(n) {
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
//function call
console.log(fib(n));
//This code is contributed by Surbhi Tyagi
Backtracking can be defined as a general algorithmic technique that considers searching every possible combination in order to solve a computational problem
Sudoku AlgorithmBelow is the implementation of the sudoku algorithm in javascript:
JavaScript
// Javascript program for above approach
// N is the size of the 2D matrix N*N
let N = 9;
/* Takes a partially filled-in grid and attempts
to assign values to all unassigned locations in
such a way to meet the requirements for
Sudoku solution (non-duplication across rows,
columns, and boxes) */
function solveSudoku(grid, row, col)
{
/* If we have reached the 8th
row and 9th column (0
indexed matrix) ,
we are returning true to avoid further
backtracking */
if (row == N - 1 && col == N)
return true;
// Check if column value becomes 9 ,
// we move to next row
// and column start from 0
if (col == N)
{
row++;
col = 0;
}
// Check if the current position
// of the grid already
// contains value >0, we iterate
// for next column
if (grid[row][col] != 0)
return solveSudoku(grid, row, col + 1);
for(let num = 1; num < 10; num++)
{
// Check if it is safe to place
// the num (1-9) in the given
// row ,col ->we move to next column
if (isSafe(grid, row, col, num))
{
/* assigning the num in the current
(row,col) position of the grid and
assuming our assigned num in the position
is correct */
grid[row][col] = num;
// Checking for next
// possibility with next column
if (solveSudoku(grid, row, col + 1))
return true;
}
/* removing the assigned num , since our
assumption was wrong , and we go for next
assumption with diff num value */
grid[row][col] = 0;
}
return false;
}
/* A utility function to print grid */
// Check whether it will be legal
// to assign num to the
// given row, col
function isSafe(grid, row, col, num)
{
// Check if we find the same num
// in the similar row , we
// return false
for(let x = 0; x <= 8; x++)
if (grid[row][x] == num)
return false;
// Check if we find the same num
// in the similar column ,
// we return false
for(let x = 0; x <= 8; x++)
if (grid[x][col] == num)
return false;
// Check if we find the same num
// in the particular 3*3
// matrix, we return false
let startRow = row - row % 3,
startCol = col - col % 3;
for(let i = 0; i < 3; i++)
for(let j = 0; j < 3; j++)
if (grid[i + startRow][j + startCol] == num)
return false;
return true;
}
// Driver Code
let grid = [ [ 3, 0, 6, 5, 0, 8, 4, 0, 0 ],
[ 5, 2, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 8, 7, 0, 0, 0, 0, 3, 1 ],
[ 0, 0, 3, 0, 1, 0, 0, 8, 0 ],
[ 9, 0, 0, 8, 6, 3, 0, 0, 5 ],
[ 0, 5, 0, 0, 9, 0, 6, 0, 0 ],
[ 1, 3, 0, 0, 0, 0, 2, 5, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 7, 4 ],
[ 0, 0, 5, 2, 0, 6, 3, 0, 0 ] ];
if (solveSudoku(grid, 0, 0))
console.log(grid);
else
console.log("no solution exists ");
// This code is contributed by rag2127
Output[
[
3, 1, 6, 5, 7,
8, 4, 9, 2
],
[
5, 2, 9, 1, 3,
4, 7, 6, 8
],
[
4, 8, 7, 6, 2,
9, 5, 3, 1
],
[
2, 6, 3, 4, 1,
5, 9, 8, 7
],
[
9, 7, 4, 8, 6,
3, 1, 2, 5
],
[
8, 5, 1, 7, 9,
2, 6, 4, 3
],
[
1, 3, 8, 9, 4,
7, 2, 5, 6
],
[
6, 9, 2, 3, 5,
1, 8, 7, 4
],
[
7, 4, 5, 2, 8,
6, 3, 1, 9
]
]
M Coloring ProblemBelow is the implementation of the M-coloring Problem in javascript:
JavaScript
// Number of vertices in the graph
let V = 4;
/* A utility function to print solution */
function printSolution(color)
{
console.log("Solution Exists:" +
" Following are the assigned colors ");
for (let i = 0; i < V; i++)
console.log(" " + color[i]);
console.log(" ");
}
// check if the colored
// graph is safe or not
function isSafe(graph,color)
{
// check for every edge
for (let i = 0; i < V; i++)
for (let j = i + 1; j < V; j++)
if (graph[i][j] && color[j] == color[i])
return false;
return true;
}
/* This function solves the m Coloring
problem using recursion. It returns
false if the m colours cannot be assigned,
otherwise, return true and prints
assignments of colours to all vertices.
Please note that there may be more than
one solutions, this function prints one
of the feasible solutions.*/
function graphColoring(graph,m,i,color)
{
// if current index reached end
if (i == V) {
// if coloring is safe
if (isSafe(graph, color))
{
// Print the solution
printSolution(color);
return true;
}
return false;
}
// Assign each color from 1 to m
for (let j = 1; j <= m; j++)
{
color[i] = j;
// Recur of the rest vertices
if (graphColoring(graph, m, i + 1, color))
return true;
color[i] = 0;
}
return false;
}
// Driver code
/* Create following graph and
test whether it is 3 colorable
(3)---(2)
| / |
| / |
| / |
(0)---(1)
*/
let graph=[[ false, true, true, true],
[ true, false, true, false ],
[ true, true, false, true ],
[true, false, true, false]];
let m = 3; // Number of colors
// Initialize all color values as 0.
// This initialization is needed
// correct functioning of isSafe()
let color = new Array(V);
for (let i = 0; i < V; i++)
color[i] = 0;
if (!graphColoring(graph, m, 0, color))
console.log("Solution does not exist");
// This code is contributed by unknown2108
OutputSolution Exists: Following are the assigned colors
1
2
3
2
N Queen ProblemBelow is the implementation of the N-Queen Problem in javascript:
JavaScript
// JavaScript program to solve N Queen
// Problem using backtracking
const N = 4
function printSolution(board)
{
for(let i = 0; i < N; i++)
{
for(let j = 0; j < N; j++)
{
if(board[i][j] == 1)
console.log("Q ")
else
console.log(". ")
}
}
}
// A utility function to check if a queen can
// be placed on board[row][col]. Note that this
// function is called when "col" queens are
// already placed in columns from 0 to col -1.
// So we need to check only left side for
// attacking queens
function isSafe(board, row, col)
{
// Check this row on left side
for(let i = 0; i < col; i++){
if(board[row][i] == 1)
return false
}
// Check upper diagonal on left side
for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
if (board[i][j])
return false
// Check lower diagonal on left side
for (i = row, j = col; j >= 0 && i < N; i++, j--)
if (board[i][j])
return false
return true
}
function solveNQUtil(board, col){
// base case: If all queens are placed
// then return true
if(col >= N)
return true
// Consider this column and try placing
// this queen in all rows one by one
for(let i=0;i<N;i++){
if(isSafe(board, i, col)==true){
// Place this queen in board[i][col]
board[i][col] = 1
// recur to place rest of the queens
if(solveNQUtil(board, col + 1) == true)
return true
// If placing queen in board[i][col
// doesn't lead to a solution, then
// queen from board[i][col]
board[i][col] = 0
}
}
// if the queen can not be placed in any row in
// this column col then return false
return false
}
// This function solves the N Queen problem using
// Backtracking. It mainly uses solveNQUtil() to
// solve the problem. It returns false if queens
// cannot be placed, otherwise return true and
// placement of queens in the form of 1s.
// note that there may be more than one
// solutions, this function prints one of the
// feasible solutions.
function solveNQ(){
let board = [ [0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0] ]
if(solveNQUtil(board, 0) == false){
console.log("Solution does not exist")
return false
}
printSolution(board)
return true
}
// Driver Code
solveNQ()
// This code is contributed by shinjanpatra
Output.
.
Q
.
Q
.
.
.
.
.
.
Q
.
Q
.
.
Dynamic Programming is mainly an optimization over plain recursion. Wherever we see a recursive solution that has repeated calls for same inputs, we can optimize it using Dynamic Programming. The idea is to simply store the results of subproblems, so that we do not have to re-compute them when needed later. This simple optimization reduces time complexities from exponential to polynomial.
Dynamic ProgrammingStandard problems on Dynamic Programming:
- Fibonacci numbers
- nth Catalan Number
- Bell Numbers (Number of Ways to Partition a Set)
- Binomial Coefficient
- Coin change problem
- Subset Sum Problem
Catalan numbers are defined as a mathematical sequence that consists of positive integers, which can be used to find the number of possibilities of various combinations.
The nth term in the sequence denoted Cn, is found in the following formula:
The first few Catalan numbers for n = 0, 1, 2, 3, … are : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …
Below is the implementation of the Nth Catalan number in javascript:
JavaScript
// Javascript Program for nth
// Catalan Number
// A recursive function to
// find nth catalan number
function catalan(n)
{
// Base case
if (n <= 1)
return 1;
// catalan(n) is sum of
// catalan(i)*catalan(n-i-1)
let res = 0;
for(let i = 0; i < n; i++)
res += catalan(i) *
catalan(n - i - 1);
return res;
}
// Driver Code
for (let i = 0; i < 10; i++)
console.log(catalan(i) + " ");
// This code is contributed _saurabh_jaiswal
Output1
1
2
5
14
42
132
429
1430
4862
A binomial coefficient C(n, k) can be defined as the coefficient of x^k in the expansion of (1 + x)^n.
A binomial coefficient C(n, k) also gives the number of ways, disregarding order, that k objects can be chosen from among n objects more formally, the number of k-element subsets (or k-combinations) of a n-element set.
Below is the implementation of the Binomial coefficient in javascript:
JavaScript
// A Dynamic Programming based
// solution that uses table C to
// calculate the Binomial Coefficient
// Returns value of Binomial
// Coefficient C(n, k)
function binomialCoeff(n, k)
{
var C = Array(n + 1).fill(0).map(
x => Array(k + 1).fill(0));;
var i, j;
// Calculate value of Binomial
// Coefficient in bottom up manner
for(i = 0; i <= n; i++)
{
for(j = 0; j <= min(i, k); j++)
{
// Base Cases
if (j == 0 || j == i)
C[i][j] = 1;
// Calculate value using
// previously stored values
else
C[i][j] = C[i - 1][j - 1] +
C[i - 1][j];
}
}
return C[n][k];
}
// A utility function to return
// minimum of two integers
function min(a, b)
{
return (a < b) ? a : b;
}
// Driver code
var n = 5, k = 2;
console.log("Value of C(" + n + "," + k +
") is " + binomialCoeff(n, k));
// This code is contributed by 29AjayKumar
OutputValue of C(5,2) is 10
Given a set of non-negative integers and a value sum, the task is to check if there is a subset of the given set whose sum is equal to the given sum.
Below is the implementation of the Subset Sum Problem in javascript:
JavaScript
// A Dynamic Programming solution for subset sum problem
// Returns true if there is a subset of
// set[] with sum equal to given sum
function isSubsetSum(set, n, sum)
{
// The value of subset[i][j] will be
// true if there is a subset of
// set[0..j-1] with sum equal to i
let subset = new Array(sum + 1);
for(let i = 0; i < sum + 1; i++)
{
subset[i] = new Array(sum + 1);
for(let j = 0; j < n + 1; j++)
{
subset[i][j] = 0;
}
}
// If sum is 0, then answer is true
for (let i = 0; i <= n; i++)
subset[0][i] = true;
// If sum is not 0 and set is empty,
// then answer is false
for (let i = 1; i <= sum; i++)
subset[i][0] = false;
// Fill the subset table in bottom
// up manner
for (let i = 1; i <= sum; i++) {
for (let j = 1; j <= n; j++) {
subset[i][j] = subset[i][j - 1];
if (i >= set[j - 1])
subset[i][j] = subset[i][j]
|| subset[i - set[j - 1]][j - 1];
}
}
return subset[sum][n];
}
let set = [ 3, 34, 4, 12, 5, 2 ];
let sum = 9;
let n = set.length;
if (isSubsetSum(set, n, sum) == true)
console.log("Found a subset" + " with given sum");
else
console.log("No subset with" + " given sum");
// This code is contributed by decode2207.
OutputFound a subset with given sum
Standard problems on Mathematical algorithms:
- Prime Numbers
- Sieve of Eratosthenes
- LCM of array
- GCD of array
- Program to add two polynomials
- Check divisibility by 7
- Euclidean algorithms
- Generate Pythagorean Triplets
Prime numbersBelow is the implementation of the Prime number in javascript:
JavaScript
//javascript program for prime number
function isPrime(n) {
// Corner case
if (n <= 1)
return false;
// Check from 2 to n-1
for (let i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
// Driver Code
isPrime(11)
? console.log("true")
: console.log("false");
Given an array of n numbers, find the LCM of it.
Below is the implementation of the LCM of array elements in javascript:
JavaScript
// Javascript program to find LCM of n elements
// Utility function to find
// GCD of 'a' and 'b'
function gcd(a, b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Returns LCM of array elements
function findlcm(arr, n)
{
// Initialize result
let ans = arr[0];
// ans contains LCM of arr[0], ..arr[i]
// after i'th iteration,
for (let i = 1; i < n; i++)
ans = (((arr[i] * ans)) /
(gcd(arr[i], ans)));
return ans;
}
// Driver Code
let arr = [ 2, 7, 3, 9, 4 ];
let n = arr.length;
console.log(findlcm(arr, n));
// This code is contributed by Mayank Tyagi
The Euclidean algorithm is a way to find the greatest common divisor of two positive integers. GCD of two numbers is the largest number that divides both of them. A simple way to find GCD is to factorize both numbers and multiply common prime factors.
Below is the implementation of the Euclidean algorithm in javascript:
JavaScript
// Javascript program to demonstrate
// working of extended
// Euclidean Algorithm
// Javascript function for
// extended Euclidean
// Algorithm
function gcdExtended(a, b,
x, y)
{
// Base Case
if (a == 0)
{
x = 0;
y = 1;
return b;
}
// To store results
// of recursive call
let gcd = gcdExtended(b % a,
a, x, y);
// Update x and y using
// results of recursive
// call
x = y - (b / a) * x;
y = x;
return gcd;
}
// Driver Code
let x = 0;
let y = 0;
let a = 35;
let b = 15;
let g = gcdExtended(a, b, x, y);
console.log("gcd(" + a);
console.log(", " + b + ")");
console.log(" = " + g);
Standard Problems on Bit Algorithms:
- Count set bits in an integer
- Add two-bit strings
- Turn off the rightmost set bit
- Rotate bits of a number
- Program to find parity
- Check if a number is Bleak
count set bitBelow is the implementation of the Count set bits in an integer in javascript:
JavaScript
// JavaScript program to Count set
// bits in an integerclass
/* Function to get no of set
bits in binary representation
of passed binary no. */
function countSetBits(n)
{
var count = 0;
while (n > 0)
{
n &= (n - 1);
count++;
}
return count;
}
// driver program
var i = 9;
console.log(countSetBits(i));
// This code is contributed by 29AjayKumar
Given two bit sequences as strings, write a function to return the addition of the two sequences. Bit strings can be of different lengths also. For example, if string 1 is “1100011” and second string 2 is “10”, then the function should return “1100101”.
Below is the implementation of the Add two-bit strings in javascript:
JavaScript
// JavaScript code to implement the approach
// Helper method: given two unequal sized bit strings, converts them to
// same length by adding leading 0s in the smaller string. Returns the
// new length
function makeEqualLength(str1, str2)
{
var len1 = str1.length;
var len2 = str2.length;
if (len1 < len2)
{
for (var i = 0 ; i < len2 - len1 ; i++)
str1 = '0' + str1;
return len2;
}
else if (len1 > len2)
{
for (var i = 0 ; i < len1 - len2 ; i++)
str2 = '0' + str2;
}
return len1; // If len1 >= len2
}
// The main function that adds two-bit sequences and returns the addition
function addBitStrings(first, second )
{
var result = ""; // To store the sum bits
// make the lengths same before adding
var length = makeEqualLength(first, second);
var carry = 0; // Initialize carry
// Add all bits one by one
for (var i = length-1 ; i >= 0 ; i--)
{
var firstBit = first[i] - '0';
var secondBit = second[i] - '0';
// boolean expression for sum of 3 bits
var sum = (firstBit ^ secondBit ^ carry) + 48;
result += String.fromCharCode(sum);
// boolean expression for 3-bit addition
carry = (firstBit & secondBit) | (secondBit & carry) | (firstBit & carry);
}
// if overflow, then add a leading 1
if (carry)
result += '1';
return result;
}
// Driver program to test above functions
var str1 = "1100011";
var str2 = "10";
console.log("Sum is " + addBitStrings(str1, str2));
// This code is contributed by phasing17
Parity: Parity of a number refers to whether it contains an odd or even number of 1-bits. The number has “odd parity” if it contains an odd number of 1-bits and is “even parity” if it contains an even number of 1-bits.
Below is the implementation of the find parity in javascript:
JavaScript
// Javascript program to find parity
// of an integer
// Function to get parity of number n.
// It returns 1 if n has odd parity, and
// returns 0 if n has even parity
function getParity(n)
{
var parity = false;
while(n != 0)
{
parity = !parity;
n = n & (n - 1);
}
return parity;
}
// Driver code
var n = 7;
console.log("Parity of no " + n + " = " +
(getParity(n) ? "odd": "even"));
// This code is contributed by Kirti
OutputParity of no 7 = odd
- Basic understanding of JavaScript syntax, variables, loops, and functions is recommended. Familiarity with fundamental programming concepts is beneficial.
2. Do I need any specific software or tools to follow along?
- A code editor (e.g., Visual Studio Code, Sublime Text) and a JavaScript runtime environment (e.g., Node.js) are sufficient. No special tools are required.
3. Is this tutorial suitable for beginners?
- Yes, this tutorial is designed to be beginner-friendly. It starts with fundamental concepts and gradually progresses to more advanced topics.
4. How can I practice the algorithms covered in the tutorial?
- Practice by implementing the algorithms in a code editor, running them in a JavaScript environment, and experimenting with variations. Leverage coding platforms like LeetCode for additional challenges.
5. Are there any coding exercises or challenges included?
- Yes, each section includes practice problems to reinforce your understanding. Additional challenges are encouraged for further practice.
6. Can I use this tutorial for interview preparation?
- Absolutely! Understanding and practicing these algorithms will significantly contribute to your interview preparation for technical roles.
7. Are there any forums or communities to discuss the tutorial content?
- Join online coding communities like Stack Overflow, Reddit (r/learnjavascript), or platforms like Discord where you can discuss concepts, seek help, and share your solutions.
8. How do I handle difficulties or challenges in understanding certain topics?
- If you encounter challenges, revisit the explanations, experiment with the code, and seek help from online communities. Sometimes, discussing problems with others can provide valuable insights.
9. Is it necessary to complete the tutorial in order, or can I skip sections?
- While it's recommended to follow the tutorial in order to build a solid foundation, you can skip to specific sections based on your needs. However, ensure you have a good understanding of the skipped topics.
10. What's the best way to apply these algorithms in real-world projects?
- Identify opportunities in your projects where these algorithms can be applied. For example, sorting and searching algorithms in data processing, or graph algorithms in network analysis. Practice integrating them into practical scenarios.
11. How often should I revisit the tutorial for reinforcement?
- Regular reinforcement is beneficial. Consider revisiting the tutorial, solving additional problems, and exploring advanced topics as you gain more experience in programming and problem-solving.
12. Can I use this tutorial as a reference for technical interviews?
- Yes, this tutorial can serve as a valuable reference for technical interviews. Practice implementing algorithms and explaining your thought process, which is often a crucial aspect of technical interviews.
Feel free to ask additional questions or seek clarification on any topic throughout your learning journey. Happy coding!
Similar Reads
Basics & Prerequisites
Data Structures
Getting Started with Array Data StructureArray is a collection of items of the same variable type that are stored at contiguous memory locations. It is one of the most popular and simple data structures used in programming. Basic terminologies of ArrayArray Index: In an array, elements are identified by their indexes. Array index starts fr
14 min read
String in Data StructureA string is a sequence of characters. The following facts make string an interesting data structure.Small set of elements. Unlike normal array, strings typically have smaller set of items. For example, lowercase English alphabet has only 26 characters. ASCII has only 256 characters.Strings are immut
2 min read
Hashing in Data StructureHashing is a technique used in data structures that efficiently stores and retrieves data in a way that allows for quick access. Hashing involves mapping data to a specific index in a hash table (an array of items) using a hash function. It enables fast retrieval of information based on its key. The
2 min read
Linked List Data StructureA linked list is a fundamental data structure in computer science. It mainly allows efficient insertion and deletion operations compared to arrays. Like arrays, it is also used to implement other data structures like stack, queue and deque. Hereâs the comparison of Linked List vs Arrays Linked List:
2 min read
Stack Data StructureA Stack is a linear data structure that follows a particular order in which the operations are performed. The order may be LIFO(Last In First Out) or FILO(First In Last Out). LIFO implies that the element that is inserted last, comes out first and FILO implies that the element that is inserted first
2 min read
Queue Data StructureA Queue Data Structure is a fundamental concept in computer science used for storing and managing data in a specific order. It follows the principle of "First in, First out" (FIFO), where the first element added to the queue is the first one to be removed. It is used as a buffer in computer systems
2 min read
Tree Data StructureTree Data Structure is a non-linear data structure in which a collection of elements known as nodes are connected to each other via edges such that there exists exactly one path between any two nodes. Types of TreeBinary Tree : Every node has at most two childrenTernary Tree : Every node has at most
4 min read
Graph Data StructureGraph Data Structure is a collection of nodes connected by edges. It's used to represent relationships between different entities. If you are looking for topic-wise list of problems on different topics like DFS, BFS, Topological Sort, Shortest Path, etc., please refer to Graph Algorithms. Basics of
3 min read
Trie Data StructureThe Trie data structure is a tree-like structure used for storing a dynamic set of strings. It allows for efficient retrieval and storage of keys, making it highly effective in handling large datasets. Trie supports operations such as insertion, search, deletion of keys, and prefix searches. In this
15+ min read
Algorithms
Searching AlgorithmsSearching algorithms are essential tools in computer science used to locate specific items within a collection of data. In this tutorial, we are mainly going to focus upon searching in an array. When we search an item in an array, there are two most common algorithms used based on the type of input
2 min read
Sorting AlgorithmsA Sorting Algorithm is used to rearrange a given array or list of elements in an order. For example, a given array [10, 20, 5, 2] becomes [2, 5, 10, 20] after sorting in increasing order and becomes [20, 10, 5, 2] after sorting in decreasing order. There exist different sorting algorithms for differ
3 min read
Introduction to RecursionThe process in which a function calls itself directly or indirectly is called recursion and the corresponding function is called a recursive function. A recursive algorithm takes one step toward solution and then recursively call itself to further move. The algorithm stops once we reach the solution
14 min read
Greedy AlgorithmsGreedy algorithms are a class of algorithms that make locally optimal choices at each step with the hope of finding a global optimum solution. At every step of the algorithm, we make a choice that looks the best at the moment. To make the choice, we sometimes sort the array so that we can always get
3 min read
Graph AlgorithmsGraph is a non-linear data structure like tree data structure. The limitation of tree is, it can only represent hierarchical data. For situations where nodes or vertices are randomly connected with each other other, we use Graph. Example situations where we use graph data structure are, a social net
3 min read
Dynamic Programming or DPDynamic Programming is an algorithmic technique with the following properties.It is mainly an optimization over plain recursion. Wherever we see a recursive solution that has repeated calls for the same inputs, we can optimize it using Dynamic Programming. The idea is to simply store the results of
3 min read
Bitwise AlgorithmsBitwise algorithms in Data Structures and Algorithms (DSA) involve manipulating individual bits of binary representations of numbers to perform operations efficiently. These algorithms utilize bitwise operators like AND, OR, XOR, NOT, Left Shift, and Right Shift.BasicsIntroduction to Bitwise Algorit
4 min read
Advanced
Segment TreeSegment Tree is a data structure that allows efficient querying and updating of intervals or segments of an array. It is particularly useful for problems involving range queries, such as finding the sum, minimum, maximum, or any other operation over a specific range of elements in an array. The tree
3 min read
Pattern SearchingPattern searching algorithms are essential tools in computer science and data processing. These algorithms are designed to efficiently find a particular pattern within a larger set of data. Patten SearchingImportant Pattern Searching Algorithms:Naive String Matching : A Simple Algorithm that works i
2 min read
GeometryGeometry is a branch of mathematics that studies the properties, measurements, and relationships of points, lines, angles, surfaces, and solids. From basic lines and angles to complex structures, it helps us understand the world around us.Geometry for Students and BeginnersThis section covers key br
2 min read
Interview Preparation
Practice Problem