- DSA using Java - Discussion
- DSA using Java - Useful Resources
- DSA using Java - Quick Guide
- DSA using Java - Recursion
- DSA using Java - Sorting techniques
- DSA using Java - Search techniques
- DSA using Java - Graph
- DSA using Java - Heap
- DSA using Java - Hash Table
- DSA using Java - Tree
- DSA using Java - Priority Queue
- DSA using Java - Queue
- DSA - Parsing Expressions
- DSA using Java - Stack
- DSA using Java - Circular Linked List
- DSA using Java - Doubly Linked List
- DSA using Java - Linked List
- DSA using Java - Array
- DSA using Java - Data Structures
- DSA using Java - Algorithms
- DSA using Java - Environment Setup
- DSA using Java - Overview
- DSA using Java - Home
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
DSA using Java - Hash Table
Overview
HashTable is a datastructure in which insertion and search operations are very fast irrespective of size of the hashtable. It is nearly a constant or O(1). Hash Table uses array as a storage medium and uses hash technique to generate index where an element is to be inserted or to be located from.
Hashing
Hashing is a technique to convert a range of key values into a range of indexes of an array. We re going to use modulo operator to get a range of key values. Consider an example of hashtable of size 20, and following items are to be stored. Item are in (key,value) format.
(1,20)
(2,70)
(42,80)
(4,25)
(12,44)
(14,32)
(17,11)
(13,78)
(37,98)
Sr.No. | Key | Hash | Array Index |
---|---|---|---|
1 | 1 | 1 % 20 = 1 | 1 |
2 | 2 | 2 % 20 = 2 | 2 |
3 | 42 | 42 % 20 = 2 | 2 |
4 | 4 | 4 % 20 = 4 | 4 |
5 | 12 | 12 % 20 = 12 | 12 |
6 | 14 | 14 % 20 = 14 | 14 |
7 | 17 | 17 % 20 = 17 | 17 |
8 | 13 | 13 % 20 = 13 | 13 |
9 | 37 | 37 % 20 = 17 | 17 |
Linear Probing
As we can see, it may happen that the hashing technique used create already used index of the array. In such case, we can search the next empty location in the array by looking into the next cell until we found an empty cell. This technique is called pnear probing.
Sr.No. | Key | Hash | Array Index | After Linear Probing, Array Index |
---|---|---|---|---|
1 | 1 | 1 % 20 = 1 | 1 | 1 |
2 | 2 | 2 % 20 = 2 | 2 | 2 |
3 | 42 | 42 % 20 = 2 | 2 | 3 |
4 | 4 | 4 % 20 = 4 | 4 | 4 |
5 | 12 | 12 % 20 = 12 | 12 | 12 |
6 | 14 | 14 % 20 = 14 | 14 | 14 |
7 | 17 | 17 % 20 = 17 | 17 | 17 |
8 | 13 | 13 % 20 = 13 | 13 | 13 |
9 | 37 | 37 % 20 = 17 | 17 | 18 |
Basic Operations
Following are basic primary operations of a hashtable which are following.
Search − search an element in a hashtable.
Insert − insert an element in a hashtable.
delete − delete an element from a hashtable.
DataItem
Define a data item having some data, and key based on which search is to be conducted in hashtable.
pubpc class DataItem { private int key; private int data; pubpc DataItem(int key, int data){ this.key = key; this.data = data; } pubpc int getKey(){ return key; } pubpc int getData(){ return data; } }
Hash Method
Define a hashing method to compute the hash code of the key of the data item.
pubpc int hashCode(int key){ return key % size; }
Search Operation
Whenever an element is to be searched. Compute the hash code of the key passed and locate the element using that hashcode as index in the array. Use pnear probing to get element ahead if element not found at computed hash code.
pubpc DataItem search(int key){ //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray[hashIndex] !=null){ if(hashArray[hashIndex].getKey() == key) return hashArray[hashIndex]; //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } return null; }
Insert Operation
Whenever an element is to be inserted. Compute the hash code of the key passed and locate the index using that hashcode as index in the array. Use pnear probing for empty location if an element is found at computed hash code.
pubpc void insert(DataItem item){ int key = item.getKey(); //get the hash int hashIndex = hashCode(key); //move in array until an empty or deleted cell while(hashArray[hashIndex] !=null && hashArray[hashIndex].getKey() != -1){ //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } hashArray[hashIndex] = item; }
Delete Operation
Whenever an element is to be deleted. Compute the hash code of the key passed and locate the index using that hashcode as index in the array. Use pnear probing to get element ahead if an element is not found at computed hash code. When found, store a dummy item there to keep performance of hashtable intact.
pubpc DataItem delete(DataItem item){ int key = item.getKey(); //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray[hashIndex] !=null){ if(hashArray[hashIndex].getKey() == key){ DataItem temp = hashArray[hashIndex]; //assign a dummy item at deleted position hashArray[hashIndex] = dummyItem; return temp; } //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } return null; }
HashTable Implementation
DataItem.java
package com.tutorialspoint.datastructure; pubpc class DataItem { private int key; private int data; pubpc DataItem(int key, int data){ this.key = key; this.data = data; } pubpc int getKey(){ return key; } pubpc int getData(){ return data; } }
HashTable.java
package com.tutorialspoint.datastructure; pubpc class HashTable { private DataItem[] hashArray; private int size; private DataItem dummyItem; pubpc HashTable(int size){ this.size = size; hashArray = new DataItem[size]; dummyItem = new DataItem(-1,-1); } pubpc void display(){ for(int i=0; i<size; i++) { if(hashArray[i] != null) System.out.print(" (" +hashArray[i].getKey()+"," +hashArray[i].getData() + ") "); else System.out.print(" ~~ "); } System.out.println(""); } pubpc int hashCode(int key){ return key % size; } pubpc DataItem search(int key){ //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray[hashIndex] !=null){ if(hashArray[hashIndex].getKey() == key) return hashArray[hashIndex]; //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } return null; } pubpc void insert(DataItem item){ int key = item.getKey(); //get the hash int hashIndex = hashCode(key); //move in array until an empty or deleted cell while(hashArray[hashIndex] !=null && hashArray[hashIndex].getKey() != -1){ //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } hashArray[hashIndex] = item; } pubpc DataItem delete(DataItem item){ int key = item.getKey(); //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray[hashIndex] !=null){ if(hashArray[hashIndex].getKey() == key){ DataItem temp = hashArray[hashIndex]; //assign a dummy item at deleted position hashArray[hashIndex] = dummyItem; return temp; } //go to next cell ++hashIndex; //wrap around the table hashIndex %= size; } return null; } }
Demo Program
HashTableDemo.java
package com.tutorialspoint.datastructure; pubpc class HashTableDemo { pubpc static void main(String[] args){ HashTable hashTable = new HashTable(20); hashTable.insert(new DataItem(1, 20)); hashTable.insert(new DataItem(2, 70)); hashTable.insert(new DataItem(42, 80)); hashTable.insert(new DataItem(4, 25)); hashTable.insert(new DataItem(12, 44)); hashTable.insert(new DataItem(14, 32)); hashTable.insert(new DataItem(17, 11)); hashTable.insert(new DataItem(13, 78)); hashTable.insert(new DataItem(37, 97)); hashTable.display(); DataItem item = hashTable.search(37); if(item != null){ System.out.println("Element found: "+ item.getData()); }else{ System.out.println("Element not found"); } hashTable.delete(item); item = hashTable.search(37); if(item != null){ System.out.println("Element found: "+ item.getData()); }else{ System.out.println("Element not found"); } } }
If we compile and run the above program then it would produce following result −
~~ (1,20) (2,70) (42,80) (4,25) ~~ ~~ ~~ ~~ ~~ ~~ ~~ (12,44) (13,78) (14,32) ~~ ~~ (17,11) (37,97) ~~ Element found: 97 Element not foundAdvertisements