programming-examples/java/Data_Structures/Java Program to Implement Hash Tables with Double Hashing.java
2019-11-15 12:59:38 +01:00

435 lines
8.7 KiB
Java

/*This is a Java Program to implement hash tables with Double Hashing. A hash table (also hash map) is a data structure used to implement an associative array, a structure that can map keys to values. A hash table uses a hash function to compute an index into an array of buckets or slots, from which the correct value can be found. Double Hashing is a probe sequence in which the interval between probes is computed by another hash function.*/
/*
* Java program to implement hash table with double hashing
*/
import java.util.Scanner;
import java.math.*;
/* Class LinkedHashEntry */
class HashEntry
{
String key;
int value;
/* Constructor */
HashEntry(String key, int value)
{
this.key = key;
this.value = value;
}
}
/* Class HashTable */
class HashTable
{
private int TABLE_SIZE;
private int size;
private HashEntry[] table;
private int primeSize;
/* Constructor */
public HashTable(int ts)
{
size = 0;
TABLE_SIZE = ts;
table = new HashEntry[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = null;
primeSize = getPrime();
}
/* Function to get prime number less than table size for myhash2 function */
public int getPrime()
{
for (int i = TABLE_SIZE - 1; i >= 1; i--)
{
int fact = 0;
for (int j = 2; j <= (int) Math.sqrt(i); j++)
if (i % j == 0)
fact++;
if (fact == 0)
return i;
}
/* Return a prime number */
return 3;
}
/* Function to get number of key-value pairs */
public int getSize()
{
return size;
}
public boolean isEmpty()
{
return size == 0;
}
/* Function to clear hash table */
public void makeEmpty()
{
size = 0;
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = null;
}
/* Function to get value of a key */
public int get(String key)
{
int hash1 = myhash1( key );
int hash2 = myhash2( key );
while (table[hash1] != null && !table[hash1].key.equals(key))
{
hash1 += hash2;
hash1 %= TABLE_SIZE;
}
return table[hash1].value;
}
/* Function to insert a key value pair */
public void insert(String key, int value)
{
if (size == TABLE_SIZE)
{
System.out.println("Table full");
return;
}
int hash1 = myhash1( key );
int hash2 = myhash2( key );
while (table[hash1] != null)
{
hash1 += hash2;
hash1 %= TABLE_SIZE;
}
table[hash1] = new HashEntry(key, value);
size++;
}
/* Function to remove a key */
public void remove(String key)
{
int hash1 = myhash1( key );
int hash2 = myhash2( key );
while (table[hash1] != null && !table[hash1].key.equals(key))
{
hash1 += hash2;
hash1 %= TABLE_SIZE;
}
table[hash1] = null;
size--;
}
/* Function myhash which gives a hash value for a given string */
private int myhash1(String x )
{
int hashVal = x.hashCode( );
hashVal %= TABLE_SIZE;
if (hashVal < 0)
hashVal += TABLE_SIZE;
return hashVal;
}
/* Function myhash function for double hashing */
private int myhash2(String x )
{
int hashVal = x.hashCode( );
hashVal %= TABLE_SIZE;
if (hashVal < 0)
hashVal += TABLE_SIZE;
return primeSize - hashVal % primeSize;
}
/* Function to print hash table */
public void printHashTable()
{
System.out.println("\nHash Table");
for (int i = 0; i < TABLE_SIZE; i++)
if (table[i] != null)
System.out.println(table[i].key +" "+table[i].value);
}
}
/* Class DoubleHashingHashTableTest */
public class DoubleHashingHashTableTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Hash Table Test\n\n");
System.out.println("Enter size");
/* Make object of HashTable */
HashTable ht = new HashTable(scan.nextInt() );
char ch;
/* Perform HashTable operations */
do
{
System.out.println("\nHash Table Operations\n");
System.out.println("1. insert ");
System.out.println("2. remove");
System.out.println("3. get");
System.out.println("4. check empty");
System.out.println("5. clear");
System.out.println("6. size");
int choice = scan.nextInt();
switch (choice)
{
case 1 :
System.out.println("Enter key and value");
ht.insert(scan.next(), scan.nextInt() );
break;
case 2 :
System.out.println("Enter key");
ht.remove( scan.next() );
break;
case 3 :
System.out.println("Enter key");
System.out.println("Value = "+ ht.get( scan.next() ));
break;
case 4 :
System.out.println("Empty Status " +ht.isEmpty());
break;
case 5 :
ht.makeEmpty();
System.out.println("Hash Table Cleared\n");
break;
case 6 :
System.out.println("Size = "+ ht.getSize() );
break;
default :
System.out.println("Wrong Entry \n ");
break;
}
/* Display hash table */
ht.printHashTable();
System.out.println("\nDo you want to continue (Type y or n) \n");
ch = scan.next().charAt(0);
}
while (ch == 'Y'|| ch == 'y');
}
}
/*
Enter size
100
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
1
Enter key and value
prime 97
Hash Table
prime 97
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
1
Enter key and value
even 24
Hash Table
prime 97
even 24
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
1
Enter key and value
odd 63
Hash Table
prime 97
even 24
odd 63
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
1
Enter key and value
composite 6
Hash Table
prime 97
even 24
odd 63
composite 6
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
1
Enter key and value
armstrong 153
Hash Table
prime 97
even 24
odd 63
armstrong 153
composite 6
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
3
Enter key
prime
Value = 97
Hash Table
prime 97
even 24
odd 63
armstrong 153
composite 6
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
3
Enter key
even
Value = 24
Hash Table
prime 97
even 24
odd 63
armstrong 153
composite 6
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
2
Enter key
composite
Hash Table
prime 97
even 24
odd 63
armstrong 153
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
6
Size = 4
Hash Table
prime 97
even 24
odd 63
armstrong 153
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
5
Hash Table Cleared
Hash Table
Do you want to continue (Type y or n)
y
Hash Table Operations
1. insert
2. remove
3. get
4. check empty
5. clear
6. size
4
Empty Status true
Hash Table
Do you want to continue (Type y or n)
n