programming-examples/java/Data_Structures/Java Program to Implement Patricia Trie.java
2019-11-15 12:59:38 +01:00

469 lines
9.2 KiB
Java

/*This is a Java Program to Implement Patricia Trie. A radix tree (also patricia trie or radix trie or compact prefix tree) is a space-optimized trie data structure where each node with only one child is merged with its child.*/
/**
** Java Program to Implement Patricia Trie
**/
import java.util.Scanner;
/** Class PatriciaNode **/
class PatriciaNode
{
int bitNumber;
int data;
PatriciaNode leftChild, rightChild;
}
/* Class PatriciaTrie */
class PatriciaTrie
{
private PatriciaNode root;
private static final int MaxBits = 10;
/** Constructor **/
public PatriciaTrie()
{
root = null;
}
/** function to check if empty **/
public boolean isEmpty()
{
return root == null;
}
/** function to clear **/
public void makeEmpty()
{
root = null;
}
/** function to get ith bit of key k from left **/
private boolean bit(int k, int i)
{
String binary = Integer.toString(k, 2);
while (binary.length() != MaxBits)
binary = "0" + binary;
if (binary.charAt(i - 1) == '1')
return true ;
return false;
}
/** function to search for an element **/
public boolean search(int k)
{
int numOfBits = (int) (Math.log(k)/Math.log(2)) + 1;
if (numOfBits > MaxBits)
{
System.out.println("Error : Number too large");
return false;
}
PatriciaNode searchNode = search(root, k);
if (searchNode.data == k)
return true;
else
return false;
}
/** function to search for an element **/
private PatriciaNode search(PatriciaNode t, int k)
{
PatriciaNode currentNode, nextNode;
if (t == null)
{
return null;
}
nextNode = t.leftChild;
currentNode = t;
while (nextNode.bitNumber > currentNode.bitNumber)
{
currentNode = nextNode;
nextNode = (bit(k, nextNode.bitNumber)) ? nextNode.rightChild : nextNode.leftChild;
}
return nextNode;
}
/** function to insert and element **/
public void insert(int ele)
{
int numOfBits = (int) (Math.log(ele)/Math.log(2)) + 1;
if (numOfBits > MaxBits)
{
System.out.println("Error : Number too large");
return;
}
root = insert(root, ele);
}
/** function to insert and element **/
private PatriciaNode insert(PatriciaNode t, int ele)
{
PatriciaNode current, parent, lastNode, newNode;
int i;
if (t == null)
{
t = new PatriciaNode();
t.bitNumber = 0;
t.data = ele;
t.leftChild = t;
t.rightChild = null;
return t;
}
lastNode = search(t, ele);
if (ele == lastNode.data)
{
System.out.println("Error : key is already present\n");
return t;
}
for (i = 1; bit(ele, i) == bit(lastNode.data, i); i++);
current = t.leftChild;
parent = t;
while (current.bitNumber > parent.bitNumber && current.bitNumber < i)
{
parent = current;
current = (bit(ele, current.bitNumber)) ? current.rightChild : current.leftChild;
}
newNode = new PatriciaNode();
newNode.bitNumber = i;
newNode.data = ele;
newNode.leftChild = bit(ele, i) ? current : newNode;
newNode.rightChild = bit(ele, i) ? newNode : current;
if (current == parent.leftChild)
parent.leftChild = newNode;
else
parent.rightChild = newNode;
return t;
}
}
/* Class PatriciaTrie Test */
public class PatriciaTrieTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
/* Creating object of PatriciaTrie */
PatriciaTrie pt = new PatriciaTrie();
System.out.println("Patricia Trie Test\n");
char ch;
/* Perform trie operations */
do
{
System.out.println("\nPatricia Trie Operations\n");
System.out.println("1. insert ");
System.out.println("2. search");
System.out.println("3. check emepty");
System.out.println("4. make emepty");
int choice = scan.nextInt();
switch (choice)
{
case 1 :
System.out.println("Enter key element to insert");
pt.insert( scan.nextInt() );
break;
case 2 :
System.out.println("Enter key element to search");
System.out.println("Search result : "+ pt.search( scan.nextInt() ));
break;
case 3 :
System.out.println("Empty Status : "+ pt.isEmpty() );
break;
case 4 :
System.out.println("Patricia Trie cleared");
pt.makeEmpty();
break;
default :
System.out.println("Wrong Entry \n ");
break;
}
System.out.println("\nDo you want to continue (Type y or n) \n");
ch = scan.next().charAt(0);
}
while (ch == 'Y'|| ch == 'y');
}
}
/*
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
3
Empty Status : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
24
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
6
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
28
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
5
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
63
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
19
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
94
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
1
Enter key element to insert
24
Error : key is already present
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
24
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
5
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
6
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
7
Search result : false
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
19
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
15
Search result : false
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
94
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
97
Search result : false
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
32
Search result : false
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
2
Enter key element to search
28
Search result : true
Do you want to continue (Type y or n)
y
Patricia Trie Operations
1. insert
2. search
3. check emepty
4. make emepty
4
Patricia Trie cleared
Do you want to continue (Type y or n)
n