Implementing own Hash Table with Open Addressing Linear Probing Last Updated : 21 Feb, 2025 Comments Improve Suggest changes Like Article Like Report In Open Addressing, all elements are stored in the hash table itself. So at any point, size of table must be greater than or equal to total number of keys (Note that we can increase table size by copying old data if needed).Insert(k) - Keep probing until an empty slot is found. Once an empty slot is found, insert k.Search(k) - Keep probing until slot’s key doesn’t become equal to k or an empty slot is reached.Delete(k) - Delete operation is interesting. If we simply delete a key, then search may fail. So slots of deleted keys are marked specially as “deleted”.Here, to mark a node deleted we have used dummy node with key and value -1. Insert can insert an item in a deleted slot, but search doesn’t stop at a deleted slot.The entire process ensures that for any key, we get an integer position within the size of the Hash Table to insert the corresponding value. So the process is simple, user gives a (key, value) pair set as input and based on the value generated by hash function an index is generated to where the value corresponding to the particular key is stored. So whenever we need to fetch a value corresponding to a key that is just O(1). Implementation: CPP #include <bits/stdc++.h> using namespace std; // template for generic type template <typename K, typename V> // Hashnode class class HashNode { public: V value; K key; // Constructor of hashnode HashNode(K key, V value) { this->value = value; this->key = key; } }; // template for generic type template <typename K, typename V> // Our own Hashmap class class HashMap { // hash element array HashNode<K, V>** arr; int capacity; // current size int size; // dummy node HashNode<K, V>* dummy; public: HashMap() { // Initial capacity of hash array capacity = 20; size = 0; arr = new HashNode<K, V>*[capacity]; // Initialise all elements of array as NULL for (int i = 0; i < capacity; i++) arr[i] = NULL; // dummy node with value and key -1 dummy = new HashNode<K, V>(-1, -1); } // This implements hash function to find index // for a key int hashCode(K key) { return key % capacity; } // Function to add key value pair void insertNode(K key, V value) { HashNode<K, V>* temp = new HashNode<K, V>(key, value); // Apply hash function to find index for given key int hashIndex = hashCode(key); // find next free space while (arr[hashIndex] != NULL && arr[hashIndex]->key != key && arr[hashIndex]->key != -1) { hashIndex++; hashIndex %= capacity; } // if new node to be inserted // increase the current size if (arr[hashIndex] == NULL || arr[hashIndex]->key == -1) size++; arr[hashIndex] = temp; } // Function to delete a key value pair V deleteNode(int key) { // Apply hash function // to find index for given key int hashIndex = hashCode(key); // finding the node with given key while (arr[hashIndex] != NULL) { // if node found if (arr[hashIndex]->key == key) { HashNode<K, V>* temp = arr[hashIndex]; // Insert dummy node here for further use arr[hashIndex] = dummy; // Reduce size size--; return temp->value; } hashIndex++; hashIndex %= capacity; } // If not found return null return NULL; } // Function to search the value for a given key V get(int key) { // Apply hash function to find index for given key int hashIndex = hashCode(key); int counter = 0; // finding the node with given key while (arr[hashIndex] != NULL) { // int counter =0; // BUG! if (counter++ > capacity) // to avoid infinite loop return NULL; // if node found return its value if (arr[hashIndex]->key == key) return arr[hashIndex]->value; hashIndex++; hashIndex %= capacity; } // If not found return null return NULL; } // Return current size int sizeofMap() { return size; } // Return true if size is 0 bool isEmpty() { return size == 0; } // Function to display the stored key value pairs void display() { for (int i = 0; i < capacity; i++) { if (arr[i] != NULL && arr[i]->key != -1) cout << "key = " << arr[i]->key << " value = " << arr[i]->value << endl; } } }; // Driver method to test map class int main() { HashMap<int, int>* h = new HashMap<int, int>; h->insertNode(1, 1); h->insertNode(2, 2); h->insertNode(2, 3); h->display(); cout << h->sizeofMap() << endl; cout << h->deleteNode(2) << endl; cout << h->sizeofMap() << endl; cout << h->isEmpty() << endl; cout << h->get(2); return 0; } Java // Our own HashNode class class HashNode { int key; int value; public HashNode(int key, int value) { this.key = key; this.value = value; } } // Our own Hashmap class class HashMap { // hash element array int capacity; int size; HashNode[] arr; // dummy node HashNode dummy; public HashMap() { this.capacity = 20; this.size = 0; this.arr = new HashNode[this.capacity]; // initialize with dummy node this.dummy = new HashNode(-1, -1); } // This implements hash function to find index for a key public int hashCode(int key) { return key % this.capacity; } // Function to add key value pair public void insertNode(int key, int value) { HashNode temp = new HashNode(key, value); // Apply hash function to find index for given key int hashIndex = hashCode(key); // find next free space while (this.arr[hashIndex] != null && this.arr[hashIndex].key != key && this.arr[hashIndex].key != -1) { hashIndex++; hashIndex %= this.capacity; } // if new node to be inserted, increase the current // size if (this.arr[hashIndex] == null || this.arr[hashIndex].key == -1) { this.size++; } this.arr[hashIndex] = temp; } // Function to delete a key value pair public int deleteNode(int key) { // Apply hash function to find index for given key int hashIndex = hashCode(key); // finding the node with given key while (this.arr[hashIndex] != null) { // if node found if (this.arr[hashIndex].key == key) { HashNode temp = this.arr[hashIndex]; // Insert dummy node here for further use this.arr[hashIndex] = this.dummy; // Reduce size this.size--; return temp.value; } hashIndex++; hashIndex %= this.capacity; } // If not found return -1 return -1; } // Function to search the value for a given key public int get(int key) { // Apply hash function to find index for given key int hashIndex = hashCode(key); int counter = 0; // finding the node with given key while (this.arr[hashIndex] != null) { // If counter is greater than capacity to avoid // infinite loop if (counter > this.capacity) { return -1; } // if node found return its value if (this.arr[hashIndex].key == key) { return this.arr[hashIndex].value; } hashIndex++; hashIndex %= this.capacity; counter++; } // If not found return 0 return 0; } // Return current size public int sizeofMap() { return this.size; } // Return true if size is 0 public boolean isEmpty() { return this.size == 0; } // Function to display the stored key value pairs public void display() { for (int i = 0; i < this.capacity; i++) { if (this.arr[i] != null && this.arr[i].key != -1) { System.out.println( "key = " + this.arr[i].key + " value = " + this.arr[i].value); } } } } public class Main { public static void main(String[] args) { HashMap h = new HashMap(); h.insertNode(1, 1); h.insertNode(2, 2); h.insertNode(2, 3); h.display(); System.out.println(h.sizeofMap()); System.out.println(h.deleteNode(2)); System.out.println(h.sizeofMap()); System.out.println(h.isEmpty()); System.out.println(h.get(2)); } } Python # Our own Hashnode class class HashNode: def __init__(self, key, value): self.key = key self.value = value # Our own Hashmap class class HashMap: # hash element array def __init__(self): self.capacity = 20 self.size = 0 self.arr = [None] * self.capacity # dummy node self.dummy = HashNode(-1, -1) # This implements hash function to find index for a key def hashCode(self, key): return key % self.capacity # Function to add key value pair def insertNode(self, key, value): temp = HashNode(key, value) # Apply hash function to find index for given key hashIndex = self.hashCode(key) # find next free space while self.arr[hashIndex] is not None and self.arr[hashIndex].key != key and self.arr[hashIndex].key != -1: hashIndex += 1 hashIndex %= self.capacity # if new node to be inserted, increase the current size if self.arr[hashIndex] is None or self.arr[hashIndex].key == -1: self.size += 1 self.arr[hashIndex] = temp # Function to delete a key value pair def deleteNode(self, key): # Apply hash function to find index for given key hashIndex = self.hashCode(key) # finding the node with given key while self.arr[hashIndex] is not None: # if node found if self.arr[hashIndex].key == key: temp = self.arr[hashIndex] # Insert dummy node here for further use self.arr[hashIndex] = self.dummy # Reduce size self.size -= 1 return temp.value hashIndex += 1 hashIndex %= self.capacity # If not found return None return None # Function to search the value for a given key def get(self, key): # Apply hash function to find index for given key hashIndex = self.hashCode(key) counter = 0 # finding the node with given key while self.arr[hashIndex] is not None: # If counter is greater than capacity to avoid infinite loop if counter > self.capacity: return None # if node found return its value if self.arr[hashIndex].key == key: return self.arr[hashIndex].value hashIndex += 1 hashIndex %= self.capacity counter += 1 # If not found return None return 0 # Return current size def sizeofMap(self): return self.size # Return true if size is 0 def isEmpty(self): return self.size == 0 # Function to display the stored key value pairs def display(self): for i in range(self.capacity): if self.arr[i] is not None and self.arr[i].key != -1: print("key = ", self.arr[i].key, " value = ", self.arr[i].value) # Driver method to test map class if __name__ == "__main__": h = HashMap() h.insertNode(1, 1) h.insertNode(2, 2) h.insertNode(2, 3) h.display() print(h.sizeofMap()) print(h.deleteNode(2)) print(h.sizeofMap()) print(h.isEmpty()) print(h.get(2)) C# using System; class HashNode { public int key; public int value; public HashNode next; public HashNode(int key, int value) { this.key = key; this.value = value; next = null; } } class HashMap { private HashNode[] table; private int capacity; private int size; public HashMap(int capacity) { this.capacity = capacity; table = new HashNode[capacity]; size = 0; } // hash function to find index for a given key private int HashCode(int key) { return key % capacity; } // function to add key value pair public void InsertNode(int key, int value) { int hashIndex = HashCode(key); HashNode newNode = new HashNode(key, value); // if the key already exists, update the value if (table[hashIndex] != null) { HashNode current = table[hashIndex]; while (current != null) { if (current.key == key) { current.value = value; return; } current = current.next; } } // if the key is new, add a new node to the table newNode.next = table[hashIndex]; table[hashIndex] = newNode; size++; } // function to delete a key value pair public int ? DeleteNode(int key) { int hashIndex = HashCode(key); if (table[hashIndex] != null) { HashNode current = table[hashIndex]; HashNode previous = null; while (current != null) { if (current.key == key) { if (previous == null) { table[hashIndex] = current.next; } else { previous.next = current.next; } size--; return current.value; } previous = current; current = current.next; } } return null; } // function to get the value for a given key public int ? Get(int key) { int hashIndex = HashCode(key); if (table[hashIndex] != null) { HashNode current = table[hashIndex]; while (current != null) { if (current.key == key) { return current.value; } current = current.next; } } return 0; } // function to get the number of key value pairs in the // hashmap public int Size() { return size; } // function to check if the hashmap is empty public bool IsEmpty() { return size == 0; } // function to display the key value pairs in the // hashmap public void Display() { for (int i = 0; i < capacity; i++) { if (table[i] != null) { HashNode current = table[i]; while (current != null) { Console.WriteLine("key = " + current.key + " value = " + current.value); current = current.next; } } } } } class Program { static void Main(string[] args) { HashMap h = new HashMap(20); h.InsertNode(1, 1); h.InsertNode(2, 2); h.InsertNode(2, 3); h.Display(); Console.WriteLine(h.Size()); Console.WriteLine(h.DeleteNode(2)); Console.WriteLine(h.Size()); Console.WriteLine(h.IsEmpty()); Console.WriteLine(h.Get(2)); } } JavaScript // template for generic type class HashNode { constructor(key, value) { this.key = key; this.value = value; } } // template for generic type class HashMap { constructor() { this.capacity = 20; this.size = 0; this.arr = new Array(this.capacity); // Initialise all elements of array as NULL for (let i = 0; i < this.capacity; i++) { this.arr[i] = null; } // dummy node with value and key -1 this.dummy = new HashNode(-1, -1); } // This implements hash function to find index for a key hashCode(key) { return key % this.capacity; } // Function to add key value pair insertNode(key, value) { const temp = new HashNode(key, value); // Apply hash function to find index for given key let hashIndex = this.hashCode(key); // find next free space while ( this.arr[hashIndex] !== null && this.arr[hashIndex].key !== key && this.arr[hashIndex].key !== -1 ) { hashIndex++; hashIndex %= this.capacity; } // if new node to be inserted // increase the current size if ( this.arr[hashIndex] === null || this.arr[hashIndex].key === -1 ) { this.size++; } this.arr[hashIndex] = temp; } // Function to delete a key value pair deleteNode(key) { // Apply hash function to find index for given key let hashIndex = this.hashCode(key); // finding the node with given key while (this.arr[hashIndex] !== null) { // if node found if (this.arr[hashIndex].key === key) { const temp = this.arr[hashIndex]; // Insert dummy node here for further use this.arr[hashIndex] = this.dummy; // Reduce size this.size--; return temp.value; } hashIndex++; hashIndex %= this.capacity; } // If not found return null return null; } // Function to search the value for a given key get(key) { // Apply hash function to find index for given key let hashIndex = this.hashCode(key); let counter = 0; // finding the node with given key while (this.arr[hashIndex] !== null) { if (counter++ > this.capacity) { // to avoid infinite loop return 0; } // if node found return its value if (this.arr[hashIndex].key === key) { return this.arr[hashIndex].value; } hashIndex++; hashIndex %= this.capacity; } // If not found return null return 0; } // Return current size sizeofMap() { return this.size; } // Return true if size is 0 isEmpty() { return this.size === 0; } // Function to display the stored key value pairs display() { for (let i = 0; i < this.capacity; i++) { if (this.arr[i] !== null && this.arr[i].key !== -1) { console.log(`key = ${this.arr[i].key} value = ${this.arr[i].value}`); } } } } // Driver method to test map class const h = new HashMap(); h.insertNode(1,1); h.insertNode(2,2); h.insertNode(2,3); h.display(); console.log(h.sizeofMap()); console.log(h.deleteNode(2)); console.log(h.sizeofMap()); console.log(h.isEmpty()); console.log(h.get(2)); Outputkey = 1 value = 1 key = 2 value = 3 2 3 1 0 0Complexity analysis for Insertion:Time Complexity:Best Case: O(1)Worst Case: O(N). This happens when all elements have collided and we need to insert the last element by checking free space one by one.Average Case: O(1) for good hash function, O(N) for bad hash functionAuxiliary Space: O(1)Complexity analysis for Deletion:Time Complexity:Best Case: O(1)Worst Case: O(N)Average Case: O(1) for good hash function; O(N) for bad hash functionAuxiliary Space: O(1) Complexity analysis for Searching:Time Complexity:Best Case: O(1)Worst Case: O(N)Average Case: O(1) for good hash function; O(N) for bad hash functionAuxiliary Space: O(1) for search operation Comment More infoAdvertise with us Next Article Maximum possible difference of two subsets of an array C Chhavi Improve Article Tags : Misc Hash C++ DSA Practice Tags : CPPHashMisc Similar Reads Hashing in Data Structure Hashing 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 3 min read Introduction to Hashing Hashing refers to the process of generating a small sized output (that can be used as index in a table) from an input of typically large and variable size. Hashing uses mathematical formulas known as hash functions to do the transformation. This technique determines an index or location for the stor 7 min read What is Hashing? Hashing refers to the process of generating a fixed-size output from an input of variable size using the mathematical formulas known as hash functions. This technique determines an index or location for the storage of an item in a data structure. Need for Hash data structureThe amount of data on the 3 min read Index Mapping (or Trivial Hashing) with negatives allowed Index Mapping (also known as Trivial Hashing) is a simple form of hashing where the data is directly mapped to an index in a hash table. The hash function used in this method is typically the identity function, which maps the input data to itself. In this case, the key of the data is used as the ind 7 min read Separate Chaining Collision Handling Technique in Hashing Separate Chaining is a collision handling technique. Separate chaining is one of the most popular and commonly used techniques in order to handle collisions. In this article, we will discuss about what is Separate Chain collision handling technique, its advantages, disadvantages, etc.There are mainl 3 min read Open Addressing Collision Handling technique in Hashing Open Addressing is a method for handling collisions. In Open Addressing, all elements are stored in the hash table itself. So at any point, the size of the table must be greater than or equal to the total number of keys (Note that we can increase table size by copying old data if needed). This appro 7 min read Double Hashing 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 15+ min read Load Factor and Rehashing Prerequisites: Hashing Introduction and Collision handling by separate chaining How hashing works: For insertion of a key(K) - value(V) pair into a hash map, 2 steps are required: K is converted into a small integer (called its hash code) using a hash function.The hash code is used to find an index 15+ min read Easy problems on HashingCheck if an array is subset of another arrayGiven two arrays a[] and b[] of size m and n respectively, the task is to determine whether b[] is a subset of a[]. Both arrays are not sorted, and elements are distinct.Examples: Input: a[] = [11, 1, 13, 21, 3, 7], b[] = [11, 3, 7, 1] Output: trueInput: a[]= [1, 2, 3, 4, 5, 6], b = [1, 2, 4] Output 13 min read Union and Intersection of two Linked List using HashingGiven two singly Linked Lists, create union and intersection lists that contain the union and intersection of the elements present in the given lists. Each of the two linked lists contains distinct node values.Note: The order of elements in output lists doesnât matter. Examples:Input:head1 : 10 - 10 min read Two Sum - Pair with given SumGiven an array arr[] of n integers and a target value, the task is to find whether there is a pair of elements in the array whose sum is equal to target. This problem is a variation of 2Sum problem.Examples: Input: arr[] = [0, -1, 2, -3, 1], target = -2Output: trueExplanation: There is a pair (1, -3 15+ min read Max Distance Between Two OccurrencesGiven an array arr[], the task is to find the maximum distance between two occurrences of any element. If no element occurs twice, return 0.Examples: Input: arr = [1, 1, 2, 2, 2, 1]Output: 5Explanation: distance for 1 is: 5-0 = 5, distance for 2 is: 4-2 = 2, So max distance is 5.Input : arr[] = [3, 8 min read Most frequent element in an arrayGiven an array, the task is to find the most frequent element in it. If there are multiple elements that appear a maximum number of times, return the maximum element.Examples: Input : arr[] = [1, 3, 2, 1, 4, 1]Output : 1Explanation: 1 appears three times in array which is maximum frequency.Input : a 10 min read Only Repeating From 1 To n-1Given an array arr[] of size n filled with numbers from 1 to n-1 in random order. The array has only one repetitive element. The task is to find the repetitive element.Examples:Input: arr[] = [1, 3, 2, 3, 4]Output: 3Explanation: The number 3 is the only repeating element.Input: arr[] = [1, 5, 1, 2, 15+ min read Check for Disjoint Arrays or SetsGiven two arrays a and b, check if they are disjoint, i.e., there is no element common between both the arrays.Examples: Input: a[] = {12, 34, 11, 9, 3}, b[] = {2, 1, 3, 5} Output: FalseExplanation: 3 is common in both the arrays.Input: a[] = {12, 34, 11, 9, 3}, b[] = {7, 2, 1, 5} Output: True Expla 11 min read Non-overlapping sum of two setsGiven two arrays A[] and B[] of size n. It is given that both array individually contains distinct elements. We need to find the sum of all elements that are not common.Examples: Input : A[] = {1, 5, 3, 8} B[] = {5, 4, 6, 7}Output : 291 + 3 + 4 + 6 + 7 + 8 = 29Input : A[] = {1, 5, 3, 8} B[] = {5, 1, 9 min read Check if two arrays are equal or notGiven two arrays, a and b of equal length. The task is to determine if the given arrays are equal or not. Two arrays are considered equal if:Both arrays contain the same set of elements.The arrangements (or permutations) of elements may be different.If there are repeated elements, the counts of each 6 min read Find missing elements of a rangeGiven an array, arr[0..n-1] of distinct elements and a range [low, high], find all numbers that are in a range, but not the array. The missing elements should be printed in sorted order.Examples: Input: arr[] = {10, 12, 11, 15}, low = 10, high = 15Output: 13, 14Input: arr[] = {1, 14, 11, 51, 15}, lo 15+ min read Minimum Subsets with Distinct ElementsYou are given an array of n-element. You have to make subsets from the array such that no subset contain duplicate elements. Find out minimum number of subset possible.Examples : Input : arr[] = {1, 2, 3, 4}Output :1Explanation : A single subset can contains all values and all values are distinct.In 9 min read Remove minimum elements such that no common elements exist in two arraysGiven two arrays arr1[] and arr2[] consisting of n and m elements respectively. The task is to find the minimum number of elements to remove from each array such that intersection of both arrays becomes empty and both arrays become mutually exclusive.Examples: Input: arr[] = { 1, 2, 3, 4}, arr2[] = 8 min read 2 Sum - Count pairs with given sumGiven an array arr[] of n integers and a target value, the task is to find the number of pairs of integers in the array whose sum is equal to target.Examples: Input: arr[] = {1, 5, 7, -1, 5}, target = 6Output: 3Explanation: Pairs with sum 6 are (1, 5), (7, -1) & (1, 5). Input: arr[] = {1, 1, 1, 9 min read Count quadruples from four sorted arrays whose sum is equal to a given value xGiven four sorted arrays each of size n of distinct elements. Given a value x. The problem is to count all quadruples(group of four numbers) from all the four arrays whose sum is equal to x.Note: The quadruple has an element from each of the four arrays. Examples: Input : arr1 = {1, 4, 5, 6}, arr2 = 15+ min read Sort elements by frequency | Set 4 (Efficient approach using hash)Print the elements of an array in the decreasing frequency if 2 numbers have the same frequency then print the one which came first. Examples: Input : arr[] = {2, 5, 2, 8, 5, 6, 8, 8} Output : arr[] = {8, 8, 8, 2, 2, 5, 5, 6} Input : arr[] = {2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8} Output : arr[] = {8, 12 min read Find all pairs (a, b) in an array such that a % b = kGiven an array with distinct elements, the task is to find the pairs in the array such that a % b = k, where k is a given integer. You may assume that a and b are in small range Examples : Input : arr[] = {2, 3, 5, 4, 7} k = 3Output : (7, 4), (3, 4), (3, 5), (3, 7)7 % 4 = 33 % 4 = 33 % 5 = 33 % 7 = 15 min read Group words with same set of charactersGiven a list of words with lower cases. Implement a function to find all Words that have the same unique character set. Example: Input: words[] = { "may", "student", "students", "dog", "studentssess", "god", "cat", "act", "tab", "bat", "flow", "wolf", "lambs", "amy", "yam", "balms", "looped", "poodl 8 min read k-th distinct (or non-repeating) element among unique elements in an array.Given an integer array arr[], print kth distinct element in this array. The given array may contain duplicates and the output should print the k-th element among all unique elements. If k is more than the number of distinct elements, print -1.Examples:Input: arr[] = {1, 2, 1, 3, 4, 2}, k = 2Output: 7 min read Intermediate problems on HashingFind Itinerary from a given list of ticketsGiven a list of tickets, find the itinerary in order using the given list.Note: It may be assumed that the input list of tickets is not cyclic and there is one ticket from every city except the final destination.Examples:Input: "Chennai" -> "Bangalore" "Bombay" -> "Delhi" "Goa" -> "Chennai" 11 min read Find number of Employees Under every ManagerGiven a 2d matrix of strings arr[][] of order n * 2, where each array arr[i] contains two strings, where the first string arr[i][0] is the employee and arr[i][1] is his manager. The task is to find the count of the number of employees under each manager in the hierarchy and not just their direct rep 9 min read Longest Subarray With Sum Divisible By KGiven an arr[] containing n integers and a positive integer k, he problem is to find the longest subarray's length with the sum of the elements divisible by k.Examples:Input: arr[] = [2, 7, 6, 1, 4, 5], k = 3Output: 4Explanation: The subarray [7, 6, 1, 4] has sum = 18, which is divisible by 3.Input: 10 min read Longest Subarray with 0 Sum Given an array arr[] of size n, the task is to find the length of the longest subarray with sum equal to 0.Examples:Input: arr[] = {15, -2, 2, -8, 1, 7, 10, 23}Output: 5Explanation: The longest subarray with sum equals to 0 is {-2, 2, -8, 1, 7}Input: arr[] = {1, 2, 3}Output: 0Explanation: There is n 10 min read Longest Increasing consecutive subsequenceGiven N elements, write a program that prints the length of the longest increasing consecutive subsequence. Examples: Input : a[] = {3, 10, 3, 11, 4, 5, 6, 7, 8, 12} Output : 6 Explanation: 3, 4, 5, 6, 7, 8 is the longest increasing subsequence whose adjacent element differs by one. Input : a[] = {6 10 min read Count Distinct Elements In Every Window of Size KGiven an array arr[] of size n and an integer k, return the count of distinct numbers in all windows of size k. Examples: Input: arr[] = [1, 2, 1, 3, 4, 2, 3], k = 4Output: [3, 4, 4, 3]Explanation: First window is [1, 2, 1, 3], count of distinct numbers is 3. Second window is [2, 1, 3, 4] count of d 10 min read Design a data structure that supports insert, delete, search and getRandom in constant timeDesign a data structure that supports the following operations in O(1) time.insert(x): Inserts an item x to the data structure if not already present.remove(x): Removes item x from the data structure if present. search(x): Searches an item x in the data structure.getRandom(): Returns a random elemen 5 min read Subarray with Given Sum - Handles Negative NumbersGiven an unsorted array of integers, find a subarray that adds to a given number. If there is more than one subarray with the sum of the given number, print any of them.Examples: Input: arr[] = {1, 4, 20, 3, 10, 5}, sum = 33Output: Sum found between indexes 2 and 4Explanation: Sum of elements betwee 13 min read Implementing our Own Hash Table with Separate Chaining in JavaAll data structure has their own special characteristics, for example, a BST is used when quick searching of an element (in log(n)) is required. A heap or a priority queue is used when the minimum or maximum element needs to be fetched in constant time. Similarly, a hash table is used to fetch, add 10 min read Implementing own Hash Table with Open Addressing Linear ProbingIn Open Addressing, all elements are stored in the hash table itself. So at any point, size of table must be greater than or equal to total number of keys (Note that we can increase table size by copying old data if needed).Insert(k) - Keep probing until an empty slot is found. Once an empty slot is 13 min read Maximum possible difference of two subsets of an arrayGiven an array of n-integers. The array may contain repetitive elements but the highest frequency of any element must not exceed two. You have to make two subsets such that the difference of the sum of their elements is maximum and both of them jointly contain all elements of the given array along w 15+ min read Sorting using trivial hash functionWe have read about various sorting algorithms such as heap sort, bubble sort, merge sort and others. Here we will see how can we sort N elements using a hash array. But this algorithm has a limitation. We can sort only those N elements, where the value of elements is not large (typically not above 1 15+ min read Smallest subarray with k distinct numbersWe are given an array consisting of n integers and an integer k. We need to find the smallest subarray [l, r] (both l and r are inclusive) such that there are exactly k different numbers. If no such subarray exists, print -1 and If multiple subarrays meet the criteria, return the one with the smalle 14 min read Like