Double hashing is a collision resolution technique used in hash tables. It works by using two hash functions to compute two different hash values for a given key. The first hash function is used to compute the initial hash value, and the second hash function is used to compute the step size for the probing sequence.
Double hashing has the ability to have a low collision rate, as it uses two hash functions to compute the hash value and the step size. This means that the probability of a collision occurring is lower than in other collision resolution techniques such as linear probing or quadratic probing.
However, double hashing has a few drawbacks. First, it requires the use of two hash functions, which can increase the computational complexity of the insertion and search operations. Second, it requires a good choice of hash functions to achieve good performance. If the hash functions are not well-designed, the collision rate may still be high.
Advantages of Double hashing
- The advantage of Double hashing is that it is one of the best forms of probing, producing a uniform distribution of records throughout a hash table.
- This technique does not yield any clusters.
- It is one of the effective methods for resolving collisions.
Double hashing can be done using :
(hash1(key) + i * hash2(key)) % TABLE_SIZE
Here hash1() and hash2() are hash functions and TABLE_SIZE
is size of hash table.
(We repeat by increasing i when collision occurs)
Method 1: First hash function is typically hash1(key) = key % TABLE_SIZE
A popular second hash function is hash2(key) = PRIME - (key % PRIME) where PRIME is a prime smaller than the TABLE_SIZE.
A good second Hash function is:
- It must never evaluate to zero
- Just make sure that all cells can be probed

Below is the implementation of the above approach:
CPP
/*
** Handling of collision via open addressing
** Method for Probing: Double Hashing
*/
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
#define MAX_SIZE 10000001ll
class doubleHash {
int TABLE_SIZE, keysPresent, PRIME;
vector<int> hashTable;
bitset<MAX_SIZE> isPrime;
/* Function to set sieve of Eratosthenes. */
void __setSieve(){
isPrime[0] = isPrime[1] = 1;
for(long long i = 2; i*i <= MAX_SIZE; i++)
if(isPrime[i] == 0)
for(long long j = i*i; j <= MAX_SIZE; j += i)
isPrime[j] = 1;
}
int inline hash1(int value){
return value%TABLE_SIZE;
}
int inline hash2(int value){
return PRIME - (value%PRIME);
}
bool inline isFull(){
return (TABLE_SIZE == keysPresent);
}
public:
doubleHash(int n){
__setSieve();
TABLE_SIZE = n;
/* Find the largest prime number smaller than hash table's size. */
PRIME = TABLE_SIZE - 1;
while(isPrime[PRIME] == 1)
PRIME--;
keysPresent = 0;
/* Fill the hash table with -1 (empty entries). */
for(int i = 0; i < TABLE_SIZE; i++)
hashTable.push_back(-1);
}
void __printPrime(long long n){
for(long long i = 0; i <= n; i++)
if(isPrime[i] == 0)
cout<<i<<", ";
cout<<endl;
}
/* Function to insert value in hash table */
void insert(int value){
if(value == -1 || value == -2){
cout<<("ERROR : -1 and -2 can't be inserted in the table\n");
}
if(isFull()){
cout<<("ERROR : Hash Table Full\n");
return;
}
int probe = hash1(value), offset = hash2(value); // in linear probing offset = 1;
while(hashTable[probe] != -1){
if(-2 == hashTable[probe])
break; // insert at deleted element's location
probe = (probe+offset) % TABLE_SIZE;
}
hashTable[probe] = value;
keysPresent += 1;
}
void erase(int value){
/* Return if element is not present */
if(!search(value))
return;
int probe = hash1(value), offset = hash2(value);
while(hashTable[probe] != -1)
if(hashTable[probe] == value){
hashTable[probe] = -2; // mark element as deleted (rather than unvisited(-1)).
keysPresent--;
return;
}
else
probe = (probe + offset) % TABLE_SIZE;
}
bool search(int value){
int probe = hash1(value), offset = hash2(value), initialPos = probe;
bool firstItr = true;
while(1){
if(hashTable[probe] == -1) // Stop search if -1 is encountered.
break;
else if(hashTable[probe] == value) // Stop search after finding the element.
return true;
else if(probe == initialPos && !firstItr) // Stop search if one complete traversal of hash table is completed.
return false;
else
probe = ((probe + offset) % TABLE_SIZE); // if none of the above cases occur then update the index and check at it.
firstItr = false;
}
return false;
}
/* Function to display the hash table. */
void print(){
for(int i = 0; i < TABLE_SIZE; i++)
cout<<hashTable[i]<<", ";
cout<<"\n";
}
};
int main(){
doubleHash myHash(13); // creates an empty hash table of size 13
/* Inserts random element in the hash table */
int insertions[] = {115, 12, 87, 66, 123},
n1 = sizeof(insertions)/sizeof(insertions[0]);
for(int i = 0; i < n1; i++)
myHash.insert(insertions[i]);
cout<< "Status of hash table after initial insertions : "; myHash.print();
/*
** Searches for random element in the hash table,
** and prints them if found.
*/
int queries[] = {1, 12, 2, 3, 69, 88, 115},
n2 = sizeof(queries)/sizeof(queries[0]);
cout<<"\n"<<"Search operation after insertion : \n";
for(int i = 0; i < n2; i++)
if(myHash.search(queries[i]))
cout<<queries[i]<<" present\n";
/* Deletes random element from the hash table. */
int deletions[] = {123, 87, 66},
n3 = sizeof(deletions)/sizeof(deletions[0]);
for(int i = 0; i < n3; i++)
myHash.erase(deletions[i]);
cout<< "Status of hash table after deleting elements : "; myHash.print();
return 0;
}
Java
import java.util.BitSet;
import java.util.Vector;
class DoubleHash {
private int TABLE_SIZE, keysPresent, PRIME;
private Vector<Integer> hashTable;
private BitSet isPrime;
private static final long MAX_SIZE = 10000001L;
/* Function to set sieve of Eratosthenes. */
private void setSieve() {
isPrime.set(0, true);
isPrime.set(1, true);
for (long i = 2; i * i <= MAX_SIZE; i++)
if (!isPrime.get((int) i))
for (long j = i * i; j <= MAX_SIZE; j += i)
isPrime.set((int) j);
}
private int hash1(int value) {
return value % TABLE_SIZE;
}
private int hash2(int value) {
return PRIME - (value % PRIME);
}
private boolean isFull() {
return (TABLE_SIZE == keysPresent);
}
public DoubleHash(int n) {
isPrime = new BitSet((int) MAX_SIZE);
setSieve();
TABLE_SIZE = n;
/* Find the largest prime number smaller than hash table's size. */
PRIME = TABLE_SIZE - 1;
while (isPrime.get(PRIME))
PRIME--;
keysPresent = 0;
/* Fill the hash table with -1 (empty entries). */
hashTable = new Vector<>();
for (int i = 0; i < TABLE_SIZE; i++)
hashTable.add(-1);
}
private void printPrime(long n) {
for (long i = 0; i <= n; i++)
if (!isPrime.get((int) i))
System.out.print(i + ", ");
System.out.println();
}
/* Function to insert value in hash table */
public void insert(int value) {
if (value == -1 || value == -2) {
System.out.println("ERROR : -1 and -2 can't be inserted in the table");
}
if (isFull()) {
System.out.println("ERROR : Hash Table Full");
return;
}
int probe = hash1(value), offset = hash2(value); // in linear probing offset = 1;
while (hashTable.get(probe) != -1) {
if (-2 == hashTable.get(probe))
break; // insert at deleted element's location
probe = (probe + offset) % TABLE_SIZE;
}
hashTable.set(probe, value);
keysPresent += 1;
}
public void erase(int value) {
/* Return if element is not present */
if (!search(value))
return;
int probe = hash1(value), offset = hash2(value);
while (hashTable.get(probe) != -1)
if (hashTable.get(probe) == value) {
hashTable.set(probe, -2); // mark element as deleted (rather than unvisited(-1)).
keysPresent--;
return;
} else
probe = (probe + offset) % TABLE_SIZE;
}
public boolean search(int value) {
int probe = hash1(value), offset = hash2(value), initialPos = probe;
boolean firstItr = true;
while (true) {
if (hashTable.get(probe) == -1) // Stop search if -1 is encountered.
break;
else if (hashTable.get(probe) == value) // Stop search after finding the element.
return true;
else if (probe == initialPos && !firstItr) // Stop search if one complete traversal of hash table is
// completed.
return false;
else
probe = ((probe + offset) % TABLE_SIZE); // if none of the above cases occur then update the index and
// check at it.
firstItr = false;
}
return false;
}
/* Function to display the hash table. */
public void print() {
for (int i = 0; i < TABLE_SIZE; i++)
System.out.print(hashTable.get(i) + ", ");
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
DoubleHash myHash = new DoubleHash(13); // creates an empty hash table of size 13
/* Inserts random element in the hash table */
int[] insertions = { 115, 12, 87, 66, 123 };
int n1 = insertions.length;
for (int i = 0; i < n1; i++)
myHash.insert(insertions[i]);
System.out.print("Status of hash table after initial insertions : ");
myHash.print();
/*
** Searches for random element in the hash table,
** and prints them if found.
*/
int[] queries = { 1, 12, 2, 3, 69, 88, 115 };
int n2 = queries.length;
System.out.println("\n" + "Search operation after insertion : ");
for (int i = 0; i < n2; i++)
if (myHash.search(queries[i]))
System.out.println(queries[i] + " present");
/* Deletes random element from the hash table. */
int[] deletions = { 123, 87, 66 };
int n3 = deletions.length;
for (int i = 0; i < n3; i++)
myHash.erase(deletions[i]);
System.out.print("Status of hash table after deleting elements : ");
myHash.print();
}
}
Python3
from typing import List
import math
MAX_SIZE = 10000001
class DoubleHash:
def __init__(self, n: int):
self.TABLE_SIZE = n
self.PRIME = self.__get_largest_prime(n - 1)
self.keysPresent = 0
self.hashTable = [-1] * n
def __get_largest_prime(self, limit: int) -> int:
is_prime = [True] * (limit + 1)
is_prime[0], is_prime[1] = False, False
for i in range(2, int(math.sqrt(limit)) + 1):
if is_prime[i]:
for j in range(i * i, limit + 1, i):
is_prime[j] = False
for i in range(limit, -1, -1):
if is_prime[i]:
return i
def __hash1(self, value: int) -> int:
return value % self.TABLE_SIZE
def __hash2(self, value: int) -> int:
return self.PRIME - (value % self.PRIME)
def is_full(self) -> bool:
return self.TABLE_SIZE == self.keysPresent
def insert(self, value: int) -> None:
if value == -1 or value == -2:
print("ERROR : -1 and -2 can't be inserted in the table")
return
if self.is_full():
print("ERROR : Hash Table Full")
return
probe, offset = self.__hash1(value), self.__hash2(value)
while self.hashTable[probe] != -1:
if -2 == self.hashTable[probe]:
break
probe = (probe + offset) % self.TABLE_SIZE
self.hashTable[probe] = value
self.keysPresent += 1
def erase(self, value: int) -> None:
if not self.search(value):
return
probe, offset = self.__hash1(value), self.__hash2(value)
while self.hashTable[probe] != -1:
if self.hashTable[probe] == value:
self.hashTable[probe] = -2
self.keysPresent -= 1
return
else:
probe = (probe + offset) % self.TABLE_SIZE
def search(self, value: int) -> bool:
probe, offset, initialPos, firstItr = self.__hash1(value), self.__hash2(value), self.__hash1(value), True
while True:
if self.hashTable[probe] == -1:
break
elif self.hashTable[probe] == value:
return True
elif probe == initialPos and not firstItr:
return False
else:
probe = (probe + offset) % self.TABLE_SIZE
firstItr = False
return False
def print(self) -> None:
print(*self.hashTable,sep=', ')
if __name__ == '__main__':
myHash = DoubleHash(13)
# Inserts random element in the hash table
insertions = [115, 12, 87, 66, 123]
for insertion in insertions:
myHash.insert(insertion)
print("Status of hash table after initial insertions : ", end="")
myHash.print()
# Searches for random element in the hash table, and prints them if found.
queries = [1, 12, 2, 3, 69, 88, 115]
n2 = len(queries)
print("\nSearch operation after insertion : ")
for i in range(n2):
if myHash.search(queries[i]):
print(queries[i], "present")
# Deletes random element from the hash table.
deletions = [123, 87, 66]
n3 = len(deletions)
for i in range(n3):
myHash.erase(deletions[i])
print("Status of hash table after deleting elements : ",end='')
myHash.print()
C#
using System;
using System.Collections.Generic;
using System.Linq;
class doubleHash {
int TABLE_SIZE, keysPresent, PRIME, MAX_SIZE = 10000001;
List<int> hashTable;
bool[] isPrime;
/* Function to set sieve of Eratosthenes. */
void __setSieve()
{
isPrime[0] = isPrime[1] = true;
for (long i = 2; i * i <= MAX_SIZE; i++) {
if (isPrime[i] == false) {
for (long j = i * i; j <= MAX_SIZE;
j += i) {
isPrime[j] = true;
}
}
}
}
int hash1(int value) { return value % TABLE_SIZE; }
int hash2(int value) { return PRIME - (value % PRIME); }
bool isFull() { return (TABLE_SIZE == keysPresent); }
public doubleHash(int n)
{
isPrime = new bool[MAX_SIZE + 1];
__setSieve();
TABLE_SIZE = n;
/* Find the largest prime number smaller than hash
* table's size. */
PRIME = TABLE_SIZE - 1;
while (isPrime[PRIME] == true)
PRIME--;
keysPresent = 0;
hashTable = new List<int>();
/* Fill the hash table with -1 (empty entries). */
for (int i = 0; i < TABLE_SIZE; i++)
hashTable.Add(-1);
}
public void __printPrime(long n)
{
for (long i = 0; i <= n; i++)
if (isPrime[i] == false)
Console.Write(i + ", ");
Console.WriteLine();
}
/* Function to insert value in hash table */
public void insert(int value)
{
if (value == -1 || value == -2) {
Console.Write(
"ERROR : -1 and -2 can't be inserted in the table\n");
}
if (isFull()) {
Console.Write("ERROR : Hash Table Full\n");
return;
}
int probe = hash1(value),
offset
= hash2(value); // in linear probing offset = 1;
while (hashTable[probe] != -1) {
if (-2 == hashTable[probe])
break; // insert at deleted element's
// location
probe = (probe + offset) % TABLE_SIZE;
}
hashTable[probe] = value;
keysPresent += 1;
}
public void erase(int value)
{
/* Return if element is not present */
if (!search(value))
return;
int probe = hash1(value), offset = hash2(value);
while (hashTable[probe] != -1)
if (hashTable[probe] == value) {
hashTable[probe]
= -2; // mark element as deleted (rather
// than unvisited(-1)).
keysPresent--;
return;
}
else
probe = (probe + offset) % TABLE_SIZE;
}
public bool search(int value)
{
int probe = hash1(value), offset = hash2(value),
initialPos = probe;
bool firstItr = true;
while (true) {
if (hashTable[probe]
== -1) // Stop search if -1 is encountered.
break;
else if (hashTable[probe]
== value) // Stop search after finding
// the element.
return true;
else if (probe == initialPos
&& !firstItr) // Stop search if one
// complete traversal of
// hash table is
// completed.
return false;
else
probe = ((probe + offset)
% TABLE_SIZE); // if none of the
// above cases occur
// then update the
// index and check
// at it.
firstItr = false;
}
return false;
}
/* Function to display the hash table. */
public void print()
{
for (int i = 0; i < TABLE_SIZE; i++)
Console.Write(hashTable[i] + ", ");
Console.Write("\n");
}
}
public class Program {
static void Main()
{
doubleHash myHash = new doubleHash(
13); // creates an empty hash table of size 13
/* Inserts random element in the hash table */
int[] insertions = { 115, 12, 87, 66, 123 };
int n1 = insertions.Length;
for (int i = 0; i < n1; i++)
myHash.insert(insertions[i]);
Console.Write(
"Status of hash table after initial insertions : ");
myHash.print();
/*
** Searches for random element in the hash table,
** and prints them if found.
*/
int[] queries = { 1, 12, 2, 3, 69, 88, 115 };
int n2 = queries.Length;
Console.Write(
"\n"
+ "Search operation after insertion : \n");
for (int i = 0; i < n2; i++)
if (myHash.search(queries[i]))
Console.Write(queries[i] + " present\n");
/* Deletes random element from the hash table. */
int[] deletions = { 123, 87, 66 };
int n3 = deletions.Length;
for (int i = 0; i < n3; i++)
myHash.erase(deletions[i]);
Console.Write(
"Status of hash table after deleting elements : ");
myHash.print();
}
}
JavaScript
// JS code
const MAX_SIZE = 10000001;
// Set sieve of Eratosthenes
let isPrime = new Array(MAX_SIZE).fill(0);
isPrime[0] = isPrime[1] = 1;
for (let i = 2; i * i <= MAX_SIZE; i++) {
if (isPrime[i] === 0) {
for (let j = i * i; j <= MAX_SIZE; j += i) {
isPrime[j] = 1;
}
}
}
// Create DoubleHash Class
class DoubleHash {
constructor(n) {
this.TABLE_SIZE = n;
this.PRIME = this.TABLE_SIZE - 1;
while (isPrime[this.PRIME] === 1) {
this.PRIME--;
}
this.keysPresent = 0;
this.hashTable = new Array(this.TABLE_SIZE).fill(-1);
}
isFull(){
return this.TABLE_SIZE==this.keysPresent;
}
hash1(value) {
return value % this.TABLE_SIZE;
}
hash2(value) {
return this.PRIME - (value % this.PRIME);
}
// Function to print prime numbers
__printPrime(n) {
for (let i = 0; i <= n; i++) {
if (isPrime[i] === 0) {
console.log(i + ", ");
}
}
console.log("\n");
}
// Function to insert value in hash table
insert(value) {
if (value === -1 || value === -2) {
console.log("ERROR : -1 and -2 can't be inserted in the table\n");
}
if (this.isFull()) {
console.log("ERROR : Hash Table Full\n");
return;
}
let probe = this.hash1(value),
offset = this.hash2(value); // in linear probing offset = 1;
while (this.hashTable[probe] !== -1) {
if (-2 === this.hashTable[probe]) break; // insert at deleted element's location
probe = (probe + offset) % this.TABLE_SIZE;
}
this.hashTable[probe] = value;
this.keysPresent += 1;
}
erase(value) {
// Return if element is not present
if (!this.search(value)) return;
let probe = this.hash1(value),
offset = this.hash2(value);
while (this.hashTable[probe] !== -1) {
if (this.hashTable[probe] === value) {
this.hashTable[probe] = -2; // mark element as deleted (rather than unvisited(-1)).
this.keysPresent--;
return;
} else {
probe = (probe + offset) % this.TABLE_SIZE;
}
}
}
search(value) {
let probe = this.hash1(value),
offset = this.hash2(value),
initialPos = probe;
let firstItr = true;
while (1) {
if (this.hashTable[probe] === -1) break; // Stop search if -1 is encountered.
else if (this.hashTable[probe] === value) return true; // Stop search after finding the element.
else if (probe === initialPos && !firstItr)
return false; // Stop search if one complete traversal of hash table is completed.
else probe = (probe + offset) % this.TABLE_SIZE; // if none of the above cases occur then update the index and check at it.
firstItr = false;
}
return false;
}
// Function to display the hash table.
print() {
for (let i = 0; i < this.TABLE_SIZE; i++) console.log(this.hashTable[i] + ", ");
console.log("\n");
}
}
// Main function
function main() {
let myHash = new DoubleHash(13); // creates an empty hash table of size 13
// Inserts random element in the hash table
let insertions = [115, 12, 87, 66, 123],
n1 = insertions.length;
for (let i = 0; i < n1; i++) myHash.insert(insertions[i]);
console.log("Status of hash table after initial insertions : ");
myHash.print();
// Searches for random element in the hash table, and prints them if found.
let queries = [1, 12, 2, 3, 69, 88, 115],
n2 = queries.length;
console.log("\n" + "Search operation after insertion : \n");
for (let i = 0; i < n2; i++)
if (myHash.search(queries[i])) console.log(queries[i] + " present\n");
// Deletes random element from the hash table.
let deletions = [123, 87, 66],
n3 = deletions.length;
for (let i = 0; i < n3; i++) myHash.erase(deletions[i]);
console.log("Status of hash table after deleting elements : ");
myHash.print();
return 0;
}
main();
// This code is contributed by ishankhandelwals.
OutputStatus of hash table after initial insertions : -1, 66, -1, -1, -1, -1, 123, -1, -1, 87, -1, 115, 12,
Search operation after insertion :
12 present
115 present
Status of hash table after deleting elements : -1, -2, -1, -1, -1, -1, -2, -1, -1, -2, -1, 115, 12,
Time Complexity:
- Insertion: O(n)
- Search: O(n)
- Deletion: O(n)
Auxiliary Space: O(size of the hash table).
Similar Reads
Basics & Prerequisites
Data Structures
Array Data StructureIn this article, we introduce array, implementation in different popular languages, its basic operations and commonly seen problems / interview questions. An array stores items (in case of C/C++ and Java Primitive Arrays) or their references (in case of Python, JS, Java Non-Primitive) at contiguous
3 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