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

389 lines
7.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*This is a Java Program to implement Count Min Sketch. The Countmin sketch (or CM sketch) is a probabilistic sub-linear space streaming algorithm which can be used to summarize a data stream in many different ways. Countmin sketches are somewhat similar to Bloom filters; the main distinction is that Bloom filters represent sets, while CM sketches represent multi-sets and frequency tables.*/
/**
* Java Program to Implement CountMinSketch
**/
import java.util.Scanner;
class CountMinSketch
{
private int[] h1;
private int[] h2;
private int[] h3;
private int size;
private static int DEFAULT_SIZE = 11;
/** Constructor **/
public CountMinSketch()
{
size = DEFAULT_SIZE;
h1 = new int[ size ];
h2 = new int[ size ];
h3 = new int[ size ];
}
/** Function to clear al counters **/
public void clear()
{
size = DEFAULT_SIZE;
h1 = new int[ size ];
h2 = new int[ size ];
h3 = new int[ size ];
}
/** Function to insert value **/
public void insert(int val)
{
int hash1 = hashFunc1(val);
int hash2 = hashFunc2(val);
int hash3 = hashFunc3(val);
/** increment counters **/
h1[ hash1 ]++;
h2[ hash2 ]++;
h3[ hash3 ]++;
}
/** Function to get sketch count **/
public int sketchCount(int val)
{
int hash1 = hashFunc1(val);
int hash2 = hashFunc2(val);
int hash3 = hashFunc3(val);
return min( h1[ hash1 ], h2[ hash2 ], h3[ hash3 ] );
}
private int min(int a, int b, int c)
{
int min = a;
if (b < min)
min = b;
if (c < min)
min = c;
return min;
}
/** Hash function 1 **/
private int hashFunc1(int val)
{
return val % size;
}
/** Hash function 2 **/
private int hashFunc2(int val)
{
return ((val * (val + 3)) % size);
}
/** Hash function 3 **/
private int hashFunc3(int val)
{
return (size - 1) - val % size;
}
/** Funtion to print all tables **/
public void print()
{
System.out.println("\nCounter Tables : \n");
System.out.print("h1 : ");
for (int i = 0; i < size; i++)
System.out.print(h1[i] +" ");
System.out.print("\nh2 : ");
for (int i = 0; i < size; i++)
System.out.print(h2[i] +" ");
System.out.print("\nh3 : ");
for (int i = 0; i < size; i++)
System.out.print(h3[i] +" ");
System.out.println();
}
}
public class CountMinSketchTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Count Min Sketch Test\n\n");
/** Make object of CountMinSketch **/
CountMinSketch cms = new CountMinSketch();
char ch;
/** Perform CountMinSketch operations **/
do
{
System.out.println("\nCount Min Sketch Operations\n");
System.out.println("1. insert ");
System.out.println("2. get sketch count");
System.out.println("3. clear");
int choice = scan.nextInt();
switch (choice)
{
case 1 :
System.out.println("Enter int value");
cms.insert(scan.nextInt() );
break;
case 2 :
System.out.println("Enter int value");
int val = scan.nextInt();
System.out.println("\nSketch count for "+ val +" = "+ cms.sketchCount( val ));
break;
case 3 :
cms.clear();
System.out.println("Counters Cleared\n");
break;
default :
System.out.println("Wrong Entry \n ");
break;
}
/** Display counter table **/
cms.print();
System.out.println("\nDo you want to continue (Type y or n) \n");
ch = scan.next().charAt(0);
}
while (ch == 'Y'|| ch == 'y');
}
}
/*
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
45
Counter Tables :
h1 : 0 1 0 0 0 0 0 0 0 0 0
h2 : 0 0 0 0 1 0 0 0 0 0 0
h3 : 0 0 0 0 0 0 0 0 0 1 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
67
Counter Tables :
h1 : 0 2 0 0 0 0 0 0 0 0 0
h2 : 0 0 0 0 2 0 0 0 0 0 0
h3 : 0 0 0 0 0 0 0 0 0 2 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
23
Counter Tables :
h1 : 0 3 0 0 0 0 0 0 0 0 0
h2 : 0 0 0 0 3 0 0 0 0 0 0
h3 : 0 0 0 0 0 0 0 0 0 3 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
47
Counter Tables :
h1 : 0 3 0 1 0 0 0 0 0 0 0
h2 : 0 0 0 0 3 0 0 1 0 0 0
h3 : 0 0 0 0 0 0 0 1 0 3 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
23
Counter Tables :
h1 : 0 4 0 1 0 0 0 0 0 0 0
h2 : 0 0 0 0 4 0 0 1 0 0 0
h3 : 0 0 0 0 0 0 0 1 0 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
31
Counter Tables :
h1 : 0 4 0 1 0 0 0 0 0 1 0
h2 : 0 0 0 0 4 0 0 1 0 1 0
h3 : 0 1 0 0 0 0 0 1 0 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
59
Counter Tables :
h1 : 0 4 0 1 1 0 0 0 0 1 0
h2 : 0 0 0 0 4 0 1 1 0 1 0
h3 : 0 1 0 0 0 0 1 1 0 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
13
Counter Tables :
h1 : 0 4 1 1 1 0 0 0 0 1 0
h2 : 0 0 0 0 4 0 1 1 0 1 1
h3 : 0 1 0 0 0 0 1 1 1 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
17
Counter Tables :
h1 : 0 4 1 1 1 0 1 0 0 1 0
h2 : 0 0 0 0 4 0 1 1 0 1 2
h3 : 0 1 0 0 1 0 1 1 1 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
2
Enter int value
17
Sketch count for 17 = 1
Counter Tables :
h1 : 0 4 1 1 1 0 1 0 0 1 0
h2 : 0 0 0 0 4 0 1 1 0 1 2
h3 : 0 1 0 0 1 0 1 1 1 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
1
Enter int value
97
Counter Tables :
h1 : 0 4 1 1 1 0 1 0 0 2 0
h2 : 0 0 0 0 4 0 1 1 0 2 2
h3 : 0 2 0 0 1 0 1 1 1 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
2
Enter int value
97
Sketch count for 97 = 2
Counter Tables :
h1 : 0 4 1 1 1 0 1 0 0 2 0
h2 : 0 0 0 0 4 0 1 1 0 2 2
h3 : 0 2 0 0 1 0 1 1 1 4 0
Do you want to continue (Type y or n)
y
Count Min Sketch Operations
1. insert
2. get sketch count
3. clear
3
Counters Cleared
Counter Tables :
h1 : 0 0 0 0 0 0 0 0 0 0 0
h2 : 0 0 0 0 0 0 0 0 0 0 0
h3 : 0 0 0 0 0 0 0 0 0 0 0
Do you want to continue (Type y or n)
n