0% found this document useful (0 votes)
1K views

CP7111-Advanced Data Structures Laboratory Manual

The document describes Dijkstra's algorithm for finding the shortest path between nodes in a graph. It provides pseudocode for the algorithm that initializes distances from the source node to infinity for all other nodes, sets the distance for the source node to 0, and then iteratively selects the unsettled node with the lowest distance and explores paths to neighboring unsettled nodes, updating their distances if a shorter path is found. The algorithm terminates when all nodes are settled. It also provides Java source code that implements Dijkstra's algorithm to find the shortest path between all nodes in a graph.

Uploaded by

Hussain Bibi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
1K views

CP7111-Advanced Data Structures Laboratory Manual

The document describes Dijkstra's algorithm for finding the shortest path between nodes in a graph. It provides pseudocode for the algorithm that initializes distances from the source node to infinity for all other nodes, sets the distance for the source node to 0, and then iteratively selects the unsettled node with the lowest distance and explores paths to neighboring unsettled nodes, updating their distances if a shorter path is found. The algorithm terminates when all nodes are settled. It also provides Java source code that implements Dijkstra's algorithm to find the shortest path between all nodes in a graph.

Uploaded by

Hussain Bibi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 76

DIJKSTRAS ALGORITHM

AIM:
Given a graph with appropriate weights for each node, find the single source shortest
path using Dijkstras algorithm.

ALGORITHM:
algorithm DijkstraShortestWeightedPath(G, s)
_ pre-cond_: G is a weighted (directed or undirected) graph, and s is one of itsnodes.
_ post-cond_: specifies a shortest weighted path from s to each node of G, andd specifies
their lengths.
begin
d(s) = 0, (s) = _
for other v, d(v)=and (v) = nil
handled =
notHandled = priority queue containing all nodes. Priorities given by d(v).
loop
_loop-invariant_: See above.
exit when notHandled =
let u be a node fromnotHandled with smallest d(u)
for each v connected to u
foundPathLength = d(u) +w_u,v_
if d(v) > foundPathLength then
d(v) = foundPathLength
(v) = u
(update the notHandled priority queue)
end if
end for
move u from notHandled to handled
end loop
return _d, _
end algorithm


SOURCE CODE:
package dijkstrashortestpath;
import java.util.InputMismatchException;
import java.util.Scanner;

public class DijkstraShortestPath
{
private boolean settled[];
private boolean unsettled[];
private int distances[];
private int adjacencymatrix[][];
private int numberofvertices;

public DijkstraShortestPath(int numberofvertices)
{
this.numberofvertices = numberofvertices;
this.settled = new boolean[numberofvertices + 1];
this.unsettled = new boolean[numberofvertices + 1];
this.distances = new int[numberofvertices + 1];
this.adjacencymatrix = new int[numberofvertices + 1][numberofvertices + 1];
}

public void dijkstraShortestPath(int source, int adjacencymatrix[][])
{
int evaluationnode;
for (int vertex = 1; vertex <= numberofvertices; vertex++)
{
distances[vertex] = Integer.MAX_VALUE;
}

for (int sourcevertex = 1; sourcevertex <= numberofvertices; sourcevertex++)
{
for (int destinationvertex = 1; destinationvertex <= numberofvertices;
destinationvertex++)
{
this.adjacencymatrix[sourcevertex][destinationvertex]
= adjacencymatrix[sourcevertex][destinationvertex];
}
}

unsettled[source] = true;
distances[source] = 0;
while (getUnsettledCount(unsettled) != 0)
{
evaluationnode = getNodeWithMinimumDistanceFromUnsettled(unsettled);
unsettled[evaluationnode] = false;
settled[evaluationnode] = true;
evaluateNeighbours(evaluationnode);

}
}

public int getUnsettledCount(boolean unsettled[])
{
int count = 0;
for (int vertex = 1; vertex <= numberofvertices; vertex++)
{
if (unsettled[vertex] == true)
{
count++;
}
}
return count;
}

public int getNodeWithMinimumDistanceFromUnsettled(boolean unsettled[])
{
int min = Integer.MAX_VALUE;
int node = 0;
for (int vertex = 1; vertex <= numberofvertices; vertex++)
{
if (unsettled[vertex] == true && distances[vertex] < min)
{
node = vertex;
min = distances[vertex];
}
}
return node;
}

public void evaluateNeighbours(int evaluationNode)
{
int edgeDistance = -1;
int newDistance = -1;

for (int destinationNode = 1; destinationNode <= numberofvertices; destinationNode++)
{
if (settled[destinationNode] == false)
{
if (adjacencymatrix[evaluationNode][destinationNode] != Integer.MAX_VALUE)
{
edgeDistance = adjacencymatrix[evaluationNode][destinationNode];
newDistance = distances[evaluationNode] + edgeDistance;
if (newDistance < distances[destinationNode])
{
distances[destinationNode] = newDistance;
}
unsettled[destinationNode] = true;
}

}
}
}

public static void main(String... arg)
{
int adjacency_matrix[][];
int number_of_vertices;
int source = 0;
Scanner scan = new Scanner(System.in);
try
{
System.out.println("Enter the number of vertices");
number_of_vertices = scan.nextInt();
adjacency_matrix = new int[number_of_vertices + 1][number_of_vertices + 1];

System.out.println("Enter the Weighted Matrix for the graph");
for (int i = 1; i <= number_of_vertices; i++)
{
for (int j = 1; j <= number_of_vertices; j++)
{
adjacency_matrix[i][j] = scan.nextInt();
if (i == j)
{
adjacency_matrix[i][j] = 0;
continue;
}
if (adjacency_matrix[i][j] == 0)
{
adjacency_matrix[i][j] = Integer.MAX_VALUE;
}
}
}

System.out.println("Enter the source ");
source = scan.nextInt();

DijkstraShortestPath dijkstrasAlgorithm = new
DijkstraShortestPath(number_of_vertices);
dijkstrasAlgorithm.dijkstraShortestPath(source, adjacency_matrix);

System.out.println("The Shorted Path to all nodes are ");
for (int i = 1; i <= dijkstrasAlgorithm.distances.length - 1; i++)
{
System.out.println(source + " to " + i + " is "+ dijkstrasAlgorithm.distances[i]);
}
} catch (InputMismatchException inputMismatch)
{
System.out.println("Wrong Input Format");
}

scan.close();
}
}


OUTPUT:


















RESULT:

For the given nodes and the weights, the program successfully computed the shortest
path from the source node to all other nodes in the given graph.


MAZE PROBLEM


AIM:

Given a maze, to find the path from source to destination.


ALGORITHM:


procedure PATH (MAZE, MARK, m, n, MOVE, STACK)
MARK (1,1) 1
(STACK(1,1),STACK(1,2),STACK(1,3)) (1,1,2);top 1
while top 0 do
(i,j,mov) (STACK(top,1),STACK(top,2), STACK(top,3) + 1)
top top - 1
while mov 8 do
g i + MOVE (mov,1); h j + MOVE(mov,2)
if g = m and h = n
then [for p 1 to top do //goal//
print (STACK(p,1),STACK(p,2)
end
print(i,j); print(m,n);return]
if MAZE(g,h) = 0 and MARK(g,h) = 0
then[MARK(g,h) 1
top top + 1
(STACK(top,1),STACK(top,2),STACK(top,3))
(i,j,mov) //save (i,j) as part of current path//
mov 0; i g; j h]
mov mov + 1 //point to next direction//
end
end
print ('no path has been found)
end path




SOURCE CODE:

import java.awt.Point;
public class MazeSolver {
public static final char WALL_CHAR = '#';
public static final char FREE_CHAR = ' ';
public static final char PATH_CHAR = '-';
public static final char START_CHAR = 'S';
public static final char FINISH_CHAR = 'F';
public MazeSolver ( char[][] newMaze ) {
maze = newMaze;
totalSteps = 0;
startLocation = getStartLocation();
finishLocation = getFinishLocation();
}
public void solve() {
totalSteps = 0;
if ( findPath(startLocation) ) {
System.out.println("Solved the maze in " + totalSteps +
" steps.");
}
else {
System.out.println("Could not solve the maze!");
}
}

private boolean findPath( Point location ) {

// If we're at the finish square, print the path
if ( mazeFinished(location) ) {
printMaze();
return true;
}

Point[] adjacentSquares = getAdjacentSquares(location);

for ( Point potentialMove : adjacentSquares ) {

if ( squareIsFree(potentialMove) ) {
enterSquare(potentialMove);

if ( findPath(potentialMove) ) {
return true;
}

exitSquare(potentialMove);
}
}




return false;
}

private Point[] getAdjacentSquares ( Point location ) {
Point[] adjacentSquares = new Point[4];

adjacentSquares[0] = new Point(location.x + 1, location.y);
adjacentSquares[1] = new Point(location.x, location.y + 1);
adjacentSquares[2] = new Point(location.x - 1, location.y);
adjacentSquares[3] = new Point(location.x, location.y - 1);

return adjacentSquares;
}

private boolean squareIsFree ( Point square ) {
if ( square.x < 0 || square.x >= maze.length ||
square.y < 0 || square.y >= maze[square.x].length ) {

return false;
}

return ( maze[square.x][square.y] == FREE_CHAR ||
maze[square.x][square.y] == FINISH_CHAR );
}

private void enterSquare ( Point square ) {
maze[square.x][square.y] = PATH_CHAR;
totalSteps++;
}

private void exitSquare ( Point square ) {
maze[square.x][square.y] = FREE_CHAR;
totalSteps--;
}

private boolean mazeFinished ( Point location ) {
return location.equals(finishLocation);
}

public void printMaze() {
for ( int i = 0; i < maze.length; i++ ) {
for ( int j = 0; j < maze[i].length; j++ ) {
System.out.print(maze[i][j]);
}
System.out.println();
}
System.out.println();
}



private Point getStartLocation() {
Point startLocation = findChar(START_CHAR);
if ( startLocation == null ) {
throw new IllegalStateException("Maze has no start square!");
}

return startLocation;
}

private Point getFinishLocation() {
Point finishLocation = findChar(FINISH_CHAR);
if ( finishLocation == null ) {
throw new IllegalStateException("Maze has no finish square!");
}

return finishLocation;
}


private Point findChar( char c ) {
for ( int i = 0; i < maze.length; i++ ) {
for ( int j = 0; j < maze[i].length; j++ ) {
if ( maze[i][j] == c ) {
return new Point(i, j);
}
}
}

return null;
}

public static void main ( String[] args ) {
char[][] easyMaze = {
{ WALL_CHAR, START_CHAR, WALL_CHAR, WALL_CHAR, FREE_CHAR,
WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR,
WALL_CHAR, WALL_CHAR },
{ WALL_CHAR, FREE_CHAR, WALL_CHAR, WALL_CHAR, FREE_CHAR,
FREE_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR,
FREE_CHAR, WALL_CHAR },
{ WALL_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR,
WALL_CHAR, WALL_CHAR, WALL_CHAR, FREE_CHAR, WALL_CHAR,
FREE_CHAR, WALL_CHAR },
{ WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR, FREE_CHAR,
WALL_CHAR, FREE_CHAR, WALL_CHAR, FREE_CHAR, WALL_CHAR,
FREE_CHAR, WALL_CHAR },
{ WALL_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR,
WALL_CHAR, FREE_CHAR, WALL_CHAR, FREE_CHAR, WALL_CHAR,
FREE_CHAR, WALL_CHAR },

{ WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR,
WALL_CHAR,
WALL_CHAR, FREE_CHAR, WALL_CHAR, FREE_CHAR, WALL_CHAR,
FREE_CHAR, WALL_CHAR },
{ WALL_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR,
WALL_CHAR, FREE_CHAR, FREE_CHAR, FREE_CHAR, WALL_CHAR,
FREE_CHAR, FINISH_CHAR },
{ WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR,
WALL_CHAR,
WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR, WALL_CHAR,
WALL_CHAR, WALL_CHAR }
};

MazeSolver s = new MazeSolver(easyMaze);
System.out.println("The maze looks like:");
s.printMaze();

s.solve();
}
}

OUTPUT:








RESULT:

For a given maze of size 12*12, the program successfully computed the path from
source the destination



GRAPH COLORING USING BACKTRACKING
AIM:
Given a graph, to color using backtracking in java

ALGORITHM:
Given G=(V,E):
Compute Degree(v) for all v in V.
Set uncolored = V sorted in decreasing order of Degree(v).
set currentColor = 0.
while there are uncolored nodes:
set A=first element of uncolored
remove A from uncolored
set Color(A) = currentColor
set coloredWithCurrent = {A}
for each v in uncolored:
if v is not adjacent to anything in coloredWithCurrent:
set Color(v)=currentColor.
add v to currentColor.
remove v from uncolored.
end if
end for
currentColor = currentColor + 1.
end while

SOURCE CODE:
import java.io.*;
public class GraphColoring
{
static int [][] G;
static int [] x;
static int n, m;
static boolean found = false;
public static BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException

{
System.out.println("\t\t\t\tGRAPH COLORING");
System.out.print("\nEnter the number of the vertices: ");
n = Integer.parseInt(br.readLine());
G = new int[n+1][n+1];
x = new int[n+1];
System.out.print("\nIf edge between the following vertices enter 1 else 0:\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if((i!=j)&&(i<j))
{
System.out.print(i+" and "+j+": ");
G[j][i]=G[i][j] = Integer.parseInt(br.readLine());
}
if(i==j)
G[i][j]=0;
}
System.out.print("\nEnter the number of colors available: ");
m = Integer.parseInt(br.readLine());
System.out.println("\nSolution:");
mColoring(1);
if (found == false)
System.out.println("No Solution possible!");
}
static void mColoring(int k)
{
while(true)
{
NextValue(k);
if(x[k] == 0)
return;
if(k == n)
{

for(int i=1; i<=k;i++)
System.out.print(x[i]+" ");
System.out.println();
found = true;
return;
}
else
mColoring(k+1);
}
}
static void NextValue(int k)
{
int j;
while(true)
{
x[k] = (x[k]+1)%(m+1);
if(x[k]==0)
return;
for(j=1; j<=n; j++)
if( (G[k][j] != 0) && (x[k] == x[j]) )
break;
if(j == n+1)
return;
}
}
}










OUTPUT:










RESULT:
For given four vertices, the program successfully executed the graph coloring


0/1 KNAPSACK USING DYNAMIC PROGRAMMING
AIM:
Given a program to implement 0/1 knapsack using dynamic programming using java.

ALGORITHM:
Input:
Values (stored in array v)
Weights (stored in array w)
Number of distinct items (n)
Knapsack capacity (W)
for w from 0 to W do
m[0, w] := 0
end for
for i from 1 to n do
for j from 0 to W do
if j >= w[i] then
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
else
m[i, j] := m[i-1, j]
end if
end for
end for

SOURCE CODE
import java.util.*;
import java.io.*;
import java.lang.*;
public class Knapsack
{
static int n = 5, W;
static obj st[];
public static BufferedReader br=new BufferedReader(new InputStreamReader( System.in ) );
public static void main ( String args[] ) throws IOException
{
int i = 0;
System.out.println ( "Knap Sack Problem\n------------------\n" );
System.out.print ( "Enter total number of objects: " );
n = Integer.parseInt ( br.readLine() );
System.out.print ( "Enter the maximum weight sack can take: " );
W = Integer.parseInt ( br.readLine() );
st = new obj[n];
for ( i = 0; i < n; i++ )

{
st[i] = new obj();
System.out.print ( "For Object " + ( i + 1 ) + " :-\n\tWeight: " );
st[i].weight = Float.parseFloat ( br.readLine() );
System.out.print ( "\tProfit: " );
st[i].profit = Float.parseFloat ( br.readLine() );
st[i].p_perKg = Round ( st[i].profit / st[i].weight, 2 );
System.out.print ( "\tProfit per Kg: " + st[i].p_perKg + "\n" );
st[i].index = i + 1;
}
bubbleSort();
System.out.print ( "\nOptimal Solution is : " );
fill_sack();
}
public static float Round ( float Rval, int Rpl )
{
float p = ( float ) Math.pow ( 10, Rpl );
Rval = Rval * p;
float tmp = Math.round ( Rval );
return ( float ) tmp / p;
}
static void fill_sack()
{
float x[] = new float[n];
float u, tot_profit = 0;
int i;
for ( i = 0; i < n; i++ )
x[i] = 0;
u = W;
for ( i = 0; i < n; i++ )
{
if ( st[i].weight > u )
break;
x[i] = 1;
u -= st[i].weight;
System.out.print ( "\nAdded object " + st[i].index + " (" + st[i].profit + "Rs., " + st[i].weight +
"Kg) completly in the bag.\n" );
System.out.print ( "Bag can still hold : " + u + "Kg" );
tot_profit += st[i].profit;
}
if ( i < n )
{
x[i] = Round ( u / st[i].weight, 2 );
u -= Round ( st[i].weight * x[i], 2 );
System.out.print ( "\nAdded " + x[i] + " of object " + st[i].index + " (" + Round ( st[i].profit *
x[i], 2 ) + "Rs., " + Round ( st[i].weight * x[i], 2 ) + "Kg) in the bag.\n" );
System.out.print ( "Bag can still hold : " + u + "Kg" );
tot_profit += Round ( st[i].profit * x[i], 2 );
}
System.out.print ( "\n\nTotal Profit earned = Rs." + tot_profit + "/-" );

}
static void bubbleSort()
{
for ( int pass = 1; pass < n; pass++ )
for ( int i = 0; i < n - pass; i++ )
if ( st[i].p_perKg < st[i+1].p_perKg )
{
obj temp = new obj();
temp = st[i];
st[i] = st[i+1];
st[i+1] = temp;
}
}
static class obj
{
float weight;
float profit;
float p_perKg;
int index;
}
}















OUTPUT:








RESULT:
For given 3 objects, the program successfully computed total profit earned.

MINHEAP
AIM:
Given a heap, to find MINHEAP using java.

ALGORITHM:

Step 1: Start the program.

Step 2 : Create a class NODE, containing an element and two self referential

pointer LEFT_CHILD and RIGHT_CHILD.

Step 3 : Create a class PQUEUE, containing an ROOT of class NODE and also

define the ADT operations to be performed on Priority Queue.

Step 4 : To INSERT an element into the tree, place the element and maintain the

interior node should be minimum swap the nodes.

Step 5 : To DELETE an element, swap the root node and maximum element in

the tree, then delete the element. After deletion, the tree should be

Minimum heap tree.

Step 6 : To DISPLAY, contents of Priority Queue, use INORDER traversal by

using recursion function then display the elements.

Step 7 : Stop the program.





SOURCE CODE:
import java.io.*;
public class minheap
{
private int[ ] heap;
private int maxsize;
private int size;
public minheap(int max)
{
maxsize=max;
heap=new int[maxsize];
size=0;
heap[0]=Integer.MIN_VALUE;
}

private boolean isleaf(int pos)
{
return((pos>size/2)&&(pos<=size));
}
private int leftchild(int pos)
{
if(!isleaf(pos))
return 2*pos;
else
return 0;
}
private int rightchild(int pos)
{
return 2*pos+1;
}
private int parent(int pos)
{
return pos/2;
}
private void swap(int pos1,int pos2)
{
int temp;
temp=heap[pos1];
heap[pos1]=heap[pos2];
heap[pos2]=temp;
}
public void insert(int elm)
{
size++;
heap[size]=elm;
int current=size;
while(heap[current]<heap[parent(current)])
{
swap(current,parent(current));

current=parent(current);
}
}
public void print()
{
int i;
for(i=1;i<=size;i++)
System.out.print(heap[i]+" ");
System.out.println();
}

public int removemin()
{
swap(1,size);
size--;
if(size!=0)
pushdown(1);
return heap[size+1];
}
private void pushdown(int pos)
{
int smallchild;
while(!isleaf(pos))
{
smallchild=leftchild(pos);
if((smallchild<size)&&(heap[smallchild]>heap[smallchild+1]))
smallchild=smallchild+1;
if(heap[pos]<=heap[smallchild])return;
swap(pos,smallchild);
pos=smallchild;
}
}
public static void main(String args[])
{
minheap o=new minheap(10);
o.insert(50);
o.insert(150);
o.insert(5);
o.insert(55);
o.insert(25);
o.insert(15);
System.out.print("Heap is\n");
o.print();
int i=o.leftchild(1);
System.out.print("\nLeft child is"+i+"\n");
i=o.leftchild(2);
System.out.print("Left child is"+i+"\n");
i=o.leftchild(4);
System.out.print("Left child is"+i+"\n");
o.removemin();

System.out.print("\nHeap is\n");
o.print();
}
}




OUTPUT:








RESULT:
For given heap values, the program successfully executed the MINHEAP.

LEFTIST HEAP
AIM:
Given a heap, to implement Leftist Heap using java.
ALGORITHM:
Step1 : The standard heap functions

make_heap(x)

Creates and returns a leftist heap with a single element x

insert(h,x)

Inserts element x into heap h

min(h)

Returns the smallest element currently in the heap h

remove_min(h)

Similarly to the above returns the smallest element in the heap h,but

also removes it from the heap

make_heap(s)

Creates and returns a leftist heap containing all elements in set s

Step2 : Additional heap function

merge(h1,h2)

Merges leftist heaps h1 and h2 in to a single leftist heap.

merge(Q)

Merges leftist heaps in a non-empty queue Q.

Step3 : lazy leftist heap functions

lazy_merge(hi,h2)

Merges leftist heaps h1 and h2 in to a single leftist heap.

lazy_delete(h,p)


Marks element which is pointed at by pointer p as deleted.

lazy_remove_min(h)

Just like the remove_min above,but works even if there a dummy node

lazy_min(h)

Just like min above,but works even if there are dummy nodes in heap


SOURCE CODE:
import java.nio.BufferUnderflowException;
public class LeftistHeap<AnyType extends Comparable<? super AnyType>>
{
public LeftistHeap( )
{
root = null;
}

public void merge( LeftistHeap<AnyType> rhs )
{
if( this == rhs ) // Avoid aliasing problems
return;
root = merge( root, rhs.root );
rhs.root = null;
}

private LeftistNode<AnyType> merge( LeftistNode<AnyType> h1, LeftistNode<AnyType>
h2 )
{
if( h1 == null )
return h2;
if( h2 == null )
return h1;
if( h1.element.compareTo( h2.element ) < 0 )
return merge1( h1, h2 );
else
return merge1( h2, h1 );
}

private LeftistNode<AnyType> merge1( LeftistNode<AnyType> h1,
LeftistNode<AnyType> h2 )
{
if( h1.left == null ) // Single node

h1.left = h2; // Other fields in h1 already accurate
else
{
h1.right = merge( h1.right, h2 );
if( h1.left.npl < h1.right.npl )
swapChildren( h1 );
h1.npl = h1.right.npl + 1;
}
return h1;
}
private static <AnyType> void swapChildren( LeftistNode<AnyType> t )
{
LeftistNode<AnyType> tmp = t.left;
t.left = t.right;
t.right = tmp;
}
public void insert( AnyType x )
{
root = merge( new LeftistNode<AnyType>( x ), root );
}
public AnyType findMin( )
{
if( isEmpty( ) )
throw new BufferUnderflowException( );
return root.element;
}
public AnyType deleteMin( )
{
if( isEmpty( ) )
throw new BufferUnderflowException( );
AnyType minItem = root.element;
root = merge( root.left, root.right );
return minItem;
}
public boolean isEmpty( )
{
return root == null;
}
public void makeEmpty( )
{
root = null;
}
private static class LeftistNode<AnyType>
{
// Constructors
LeftistNode( AnyType theElement )
{
this( theElement, null, null );
}
LeftistNode( AnyType theElement, LeftistNode<AnyType> lt, LeftistNode<AnyType> rt )

{
element = theElement;
left = lt;
right = rt;
npl = 0;
}
AnyType element;
LeftistNode<AnyType> left;
LeftistNode<AnyType> right;
int npl;
}
private LeftistNode<AnyType> root;
public static void main( String [ ] args )
{
int numItems = 10;
LeftistHeap<Integer> h = new LeftistHeap<Integer>( );
LeftistHeap<Integer> h1 = new LeftistHeap<Integer>( );
int i = 37;
for( i = 37; i != 0; i = ( i + 37 ) % numItems )
if( i % 2 == 0 )
{
h1.insert( i );
System.out.println("Inserting " +i+ " into h1.. ");
}
else
{
h.insert( i );
System.out.println("Inserting " +i+ " into h.. ");
}
h.merge( h1 );
for( i = 1; i < numItems; i++ )
if( h.deleteMin( ) != i )
System.out.println( "Oops! " + i );
}
}
















OUTPUT:












RESULT:
For a given input, the program successfully executed Leftist heap.

TRIES
AIM:
Given nodes and its values, to implement tries in java.

ALGORITHM:
algorithm insert(root : node, s : string, value : any):
node = root
i = 0
n = length(s)

while i < n:
if node.child(s[i]) != nil:
node = node.child(s[i])
i = i + 1
else:
break

(* append new nodes, if necessary *)
while i < n:
node.child(s[i]) = new node
node = node.child(s[i])
i = i + 1

node.value = value

SOURCE CODE
class Node
{
char content;
boolean marker;
Node[] child;
public Node()
{
marker=false;
child = new Node[26];
}
public Node(int i)
{
content = (char)(int)('a'+i);
marker=false;

child=new Node[26];
}
}
class Trie
{
private Node root;
public Trie()
{
root=new Node();
root.content=' ';
}
public void insert(String s)
{
Node current=root;
if(s.length()==0)
current.marker=true;
for(int i=0;i<s.length();i++)
{
if(current.child[(int)(s.charAt(i)-'a')]!=null)
{
current=current.child[(int)(s.charAt(i)-'a')];
System.out.println("Inserted Character:" + current.content);
}
else
{
current.child[(int)(s.charAt(i)-'a')]= new Node((int)(s.charAt(i)-'a'));
current=current.child[(int)(s.charAt(i)-'a')];
System.out.println("Inserted Character:" + current.content);
}
if(i==s.length()-1)
current.marker=true;
}
System.out.println("Finished Inserting the Word :" + s +"\n");
}
public boolean search(String s)
{
Node current=root;
System.out.println("Searching for string:" + s);
while(current!=null)
{
for(int i=0;i<s.length();i++)
{
if(current.child[(int)(s.charAt(i)-'a')]==null)
{
System.out.println("Cannot find string :"+s);
return false;
}
else
{
current=current.child[(int)(s.charAt(i)-'a')];

System.out.println("Found Character:" + current.content);
}
}
if(current.marker==true)
{
System.out.println("Found String:"+s);
return true;
}
else
{
System.out.println("Cannot find string :"+s+"(onle present as a substring)");
return false;
}
}
return false;
}
}
public class TestTrie
{
public static void main(String args[])
{
Trie T=new Trie();
T.insert("google");
T.insert("goblet");
T.insert("yahoo");
T.insert("");
T.search("google");
T.search("goblets");
T.search("go");
T.search("blah");
T.search("");
}
}


















OUTPUT:



RESULT:

For a given set of values, the program successfully executedtries.




RANDOM SORT
AIM:


Given set of values, to implement random sort in java.


ALGORITHM:


set counter=0;
increase counter to 1 while(!isSorted(i)
calculate the index value usingint index1 =(int)(Math.random()* i.length), index2
=(int)(Math.random()* i.length);
Swap the index value
When the value is lesser swap the next element to before element


SOURCE CODE:

publicclassRandomSort{

publicRandomSort(int[] i){
int counter = 0;
while(!isSorted(i)){
shuffle(i);
counter++;
}
System.out.println("Solution found! (shuffled " + counter + " times)");
print(i);
}

privatevoidprint(int[] i){
for(int x : i){
System.out.print(x + ", ");
}
System.out.println();
}

privatevoidshuffle(int[] i){
for(int x = 0; x < i.length;++x){
int index1 =(int)(Math.random()* i.length), index2
=(int)(Math.random()* i.length);
int a = i[index1];
i[index1]= i[index2];

i[index2]= a;
}
}

privatebooleanisSorted(int[] i){
for(int x = 0; x < i.length - 1;++x){
if(i[x]> i[x + 1]){
returnfalse;
}
}
returntrue;
}

publicstaticvoidmain(String[] args){
int[] i ={ 1, 5, 2, 8, 5, 2, 4, 2, 6, 7, 66 };
newRandomSort(i);
}

}


OUTPUT:





RESULT:
For a given eleven values, the program successfully sorted the values in ascending
order using random sort.

8- QUEEN PROBLEM

AIM:

Given the eight queens puzzle problem of placing eight chess queens on an 88
chessboard so that no two queens attack each other.


ALGORITHM:


Algorithm NQueens ( k, n) //Prints all Solution to the n-queens problem
{
for i := 1 to n do
{
if Place (k, i) then
{
x[k] := i;
if ( k = n) then write ( x [1 : n]
else NQueens ( k+1, n);
}
}
}

Eight Queens Problem
Algorithm Place (k, i)
{
for j := 1 to k-1 do
if (( x[ j ] = // in the same column
or (Abs( x [ j ] - i) =Abs ( j k ))) // or in the same diagonal
then return false;
return true;
}



SOURCE CODE:

public class EightQueens {
public static void main(String args[]) {
int N = 8;
int[][] board = new int[N][N];
solve(0, board, N);
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(board[i][j]==1) System.out.print("Q ");
else System.out.print("* ");
}
System.out.println();

}
}

static boolean solve(int row, int[][] board, int N) {
if(row>=N) return true;
for(int position = 0; position < N; position++) {
if(isValid(board, row, position, N)) {
board[row][position] = 1;
if(!solve(row+1, board, N)) {
board[row][position] = 0;
} else
return true;
}
}
return false;
}

static boolean isValid(int[][] board, int x, int y, int N) {
int i, j;
for(i = 0; i < x; i++)
if(board[i][y]==1)
return false;
i = x - 1;
j = y - 1;
while((i>=0)&&(j>=0))
if(board[i--][j--]==1) return false;
i = x - 1;
j = y + 1;
while((i>=0)&&(j<N))
if(board[i--][j++]==1) return false;
return true;
}
}










OUTPUT:





























RESULT:

For a given 8*8 chess board, the program successfully placed 8 queens using
backtracking.


CONCURRENT STACK
AIM:

Given a program to implement concurrent stack


ALGORITHM:


<Pre-condition>: First to check whether stack is empty or not.
<Post-condition>: found the counter value after increment.
When stack is empty , values are added .
Condition -> for (int i = 0; i < 300; i++)
To increment the counter value by using getAndIncrement()
Exit the program, while condition is exist.


SOURCE CODE:

import java.util.concurrent.*;

public class Exercise {
static int counter = 0;

static synchronized int getAndIncrement() {
return counter++;
}

static class Improper implements Runnable {

@Override
public void run() {
for (int i = 0; i < 300; i++) {
getAndIncrement();
}
}
}


public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 300; i++) {
executorService.submit(new Improper());
}
executorService.shutdown();

System.out.println(counter);
}
}



OUTPUT:


























RESULT:

For a given input, the program successfully executed concurrent stack


CONCURRENT QUEUE

AIM:

Given a program, to implement Concurrent Queue in java.


ALGORITHM:


<Pre-condition>: Elements A, B, C, D .
<Post-condition>: To arrange the elements into the concurrent linked queue.
E - the type of elements held in this collection
Serializable, Iterable<E>, Collection<E>, Queue<E>
Creates a ConcurrentLinkedQueue that is initially empty
Creates a ConcurrentLinkedQueue initially containing the elements of the given
collection, added in traversal order of the collection's iterator. in interface
public E poll()

Description copied from interface: queue
Retrieves and removes the head of this queue, or returns null if this queue is empty.

Specified by:
poll in interface Queue<E>
Returns:
the head of this queue, or null if this queue is empty

public E peek()

Description copied from interface: Queue
Retrieves, but does not remove, the head of this queue, or returns null if this queue is
empty.

Specified by:
peek in interface Queue<E>
Returns:
the head of this queue, or null if this queue is empt

public boolean isEmpty()

Returns true if this queue contains no elements.
Specified by:
isEmpty in interface Collection<E>

Overrides:
isEmpty in class AbstractCollection<E>
Returns:
true if this queue contains no elements




SOURCE CODE:


package concurrentlinkedqueue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueDemo {
public static void main(String args[]){
ConcurrentLinkedQueue clq = new ConcurrentLinkedQueue();
clq.add("A");
clq.add("B");
clq.add("C");
clq.add("D");
System.out.println("Element of queue = "+clq);

Object obj = clq.peek();
System.out.println("Head element of queue = "+obj);

boolean bol =clq.isEmpty();
System.out.println("Queue is empty : "+bol);

boolean bol1 =clq.contains("D");
System.out.println("Is element 'D' existed into queue ? "+bol1);

Object obj1 = clq.poll();
System.out.println("Removed head element = "+obj1);

int i = clq.size();
System.out.println("Size of queue = "+i);
}
}












OUTPUT:






























RESULT:

Given a queue of four elements, the program successfully executed concurrent linked
queue.




CONCURRENT LINKED LIST

AIM:

Given a program, to implement Concurrent Linked list in java.



ALGORITHM:


<Pre-condition>: Threads(A, B, C),Interruptions.

<Post-condition>:Added the item into the Linked list.

enqueue(Q:pointer to queue t, value: data type)

node = new node() # Allocate a new node from the free list

node>value = value # Copy enqueued value into node

node>next.ptr = NULL # Set next pointer of node to NULL

loop #Keep trying until Enqueue is done

tail = Q>Tail # Read Tail.ptr and Tail.count together

next = tail.ptr>next # Read next ptr and count fields together

if tail == Q>Tail # Are tail and next consistent?

if next.ptr == NULL # Was Tail pointing to the last node?

if CAS(&tail.ptr>next, next, <node, next.count+1>) # Try to link node at the end of the
linked list

break #

Enqueue is done. Exit loop

endif

else

#Tail was not pointing to the last node

CAS(&Q>Tail, tail, <next.ptr, tail.count+1>) # Try to swing Tail to the next node


endif


SOURCE CODE:

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class EarlyNotify extends Object {
private List list;

public EarlyNotify() {
list = Collections.synchronizedList(new LinkedList());
}

public String removeItem() throws InterruptedException {
synchronized (list) {
while (list.isEmpty()) {
print("wait()");
list.wait();
print("done with wait()");
}
String item = (String) list.remove(0);

return item;
}
}

public void addItem(String item) {
print("entering");
synchronized (list) {
list.add(item);
print("added: '" + item + "'");

list.notifyAll();
print("notified");
}
print("leaving");
}

private static void print(String msg) {
String name = Thread.currentThread().getName();
System.out.println(name + ": " + msg);
}

public static void main(String[] args) {
final EarlyNotify enf = new EarlyNotify();

Runnable runA = new Runnable() {

public void run() {
try {
String item = enf.removeItem();
print("returned: '" + item + "'");
} catch (InterruptedException ix) {
print("interrupted!");
} catch (Exception x) {
print("threw an Exception!!!\n" + x);
}
}
};

Runnable runB = new Runnable() {
public void run() {
enf.addItem("Hello!");
}
};

try {
Thread threadA1 = new Thread(runA, "A");
threadA1.start();

Thread.sleep(500);

Thread threadA2 = new Thread(runA, "B");
threadA2.start();

Thread.sleep(500);

Thread threadB = new Thread(runB, "C");
threadB.start();

Thread.sleep(1000);

threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}











OUTPUT:




























RESULT:

For a given input values, the program successfully executed concurrent linked list.



MAX FLOW AND MIN CUT SPECIFICATION



AIM:

To find out the Maximum flow and Minimum cut in a graph for any given number of
nodes.


ALGORITHM:

<pre_condition>:

Max-Flow-Min-Cut ( graph G = ( V, E ), source S, terminal T, capacity C )

<post_condition>:

Moved to sink of the graph.

f := 0 (flow 0 on all edges)

opt := false

WHILE not opt DO

construct the residual graph Gf

find a directed path P from S to T in Gf

IF such an augmenting path P exists

THEN update flow f along P

ELSE set opt := true; and X := the set of vertices in Gf

END-WHILE

return f as the max flow, and ( X , V-X ) as the min-cut

END








SOURCE CODE:

package networkflowprob;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class NetworkFlowProb
{
private int[] parent;
private Queue<Integer> queue;
private int numberOfVertices;
private boolean[] visited;
private Set<Pair> cutSet;
private ArrayList<Integer> reachable;
private ArrayList<Integer> unreachable;
public NetworkFlowProb (int numberOfVertices)
{
this.numberOfVertices = numberOfVertices;
this.queue = new LinkedList<Integer>();
parent = new int[numberOfVertices + 1];
visited = new boolean[numberOfVertices + 1];
cutSet = new HashSet<Pair>();
reachable = new ArrayList<Integer>();
unreachable = new ArrayList<Integer>();

}
public boolean bfs (int source, int goal, int graph[][])
{
boolean pathFound = false;
int destination, element;
for (int vertex = 1; vertex <= numberOfVertices; vertex++)
{
parent[vertex] = -1;
visited[vertex] = false;
}
queue.add(source);
parent[source] = -1;
visited[source] = true;
while (!queue.isEmpty())
{
element = queue.remove();
destination = 1;
while (destination <= numberOfVertices)
{
if (graph[element][destination] > 0 && !visited[destination])
{
parent[destination] = element;
queue.add(destination);
visited[destination] = true;
}
destination++;
}

}
if (visited[goal])
{
pathFound = true;
}
return pathFound;
}
public int networkFlow (int graph[][], int source, int destination)
{
int u, v;
int maxFlow = 0;
int pathFlow;
int[][] residualGraph = new int[numberOfVertices + 1][numberOfVertices + 1];
for (int sourceVertex = 1; sourceVertex <= numberOfVertices; sourceVertex++)
{
for (int destinationVertex = 1; destinationVertex <= numberOfVertices;
destinationVertex++)
{
residualGraph[sourceVertex][destinationVertex] =
graph[sourceVertex][destinationVertex];
}
}
while (bfs(source, destination, residualGraph))
{
pathFlow = Integer.MAX_VALUE;
for (v = destination; v != source; v = parent[v])
{
u = parent[v];

pathFlow = Math.min(pathFlow, residualGraph[u][v]);
}
for (v = destination; v != source; v = parent[v])
{
u = parent[v];
residualGraph[u][v] -= pathFlow;
residualGraph[v][u] += pathFlow;
}
maxFlow += pathFlow;
}
for (int vertex = 1; vertex <= numberOfVertices; vertex++)
{
if (bfs(source, vertex, residualGraph))
{
reachable.add(vertex);
}
else
{
unreachable.add(vertex);
}
}
for (int i = 0; i < reachable.size(); i++)
{
for (int j = 0; j < unreachable.size(); j++)
{
if (graph[reachable.get(i)][unreachable.get(j)] > 0)
{

cutSet.add (new Pair(reachable.get(i), unreachable.get(j)));
}
}
}
return maxFlow;
}
public void printCutSet ()
{
Iterator<Pair> iterator = cutSet.iterator();
while (iterator.hasNext())
{
Pair pair = iterator.next();
System.out.println(pair.source + "-" + pair.destination);
}
}
public static void main (String...arg)
{
int[][] graph;
int numberOfNodes;
int source;
int sink;
int maxFlow;
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the number of nodes");
numberOfNodes = scanner.nextInt();
graph = new int[numberOfNodes + 1][numberOfNodes + 1];
System.out.println("Enter the graph matrix");

for (int sourceVertex = 1; sourceVertex <= numberOfNodes; sourceVertex++)
{
for (int destinationVertex = 1; destinationVertex <= numberOfNodes;
destinationVertex++)
{
graph[sourceVertex][destinationVertex] = scanner.nextInt();
}
}
System.out.println("Enter the source of the graph");
source= scanner.nextInt();

System.out.println("Enter the sink of the graph");
sink = scanner.nextInt();

NetworkFlowProb networkFlowProb = new NetworkFlowProb(numberOfNodes);
maxFlow = networkFlowProb.networkFlow(graph, source, sink);

System.out.println("The Max flow in the graph is " + maxFlow);
System.out.println("The Minimum Cut Set in the Graph is ");
networkFlowProb.printCutSet();
scanner.close();
}
}
class Pair
{
public int source;
public int destination;

public Pair(int source, int destination)
{
this.source = source;
this.destination = destination;
}
public Pair()
{
}
}

OUTPUT:










RESULT:

For a given four nodes and graph matrix, the program successfully executed
maximum flow and minimum cut.



RANDOMIZED TREAPS
AIM:
Given a program, to implement Randomized Treaps using java.

ALGORITHM:

Inserting a new element x:

Choose prio(x).

Search for the position of x in the tree.

Insert x as a leaf.

Restore the heap property.

while prio(parent(x)) > prio(x) do

if x is left child then RotateRight(parent(x))

else RotateLeft(parent(x));

endif

endwhile;


Deleting an element x:

Find x in the tree.

while x is not a leaf do

U: = child with smaller priority;

if u is left child then RotateRight(x))

else RotateLeft(x);

endif;

endwhile;


Delete x;


Search for element with key k

v := root;

while v nil do

case key(v) = k : stop; element found (successful search)

key(v) < k : v:= RightChild(v);

key(v) > k : v:= LeftChild(v);

endcase;

endwhile;

element not found (unsuccessful search)

Running time: O(# elements on the search path)


SOURCE CODE:
import java.util.Scanner;
import java.util.Random;
class TreapNode
{
TreapNode left, right;
int priority, element;
private static Random randomObj = new Random( );

public TreapNode(int theElement)
{
this(theElement, null, null);
}
public TreapNode(int theElement, TreapNode lt, TreapNode rt)
{
element = theElement;
left = lt;
right = rt;
priority = randomObj.nextInt( );
}
}
class TreapTree

{
private TreapNode root;
private static TreapNode nullNode;
static
{
nullNode = new TreapNode(0);
nullNode.left = nullNode.right = nullNode;
nullNode.priority = Integer.MAX_VALUE;
}
public TreapTree()
{
root = nullNode;
}
public boolean isEmpty()
{
return root == nullNode;
}
public void makeEmpty()
{
root = nullNode;
}
public void insert(int x)
{
root = insert(x, root);
}
private TreapNode insert(int x, TreapNode t)
{
if (t == nullNode)
t = new TreapNode(x, nullNode, nullNode);
else if (x < t.element)
{
t.left = insert( x, t.left );
if (t.left.priority < t.priority)
t = rotateWithLeftChild( t );
}
else if (x > t.element)
{
t.right = insert( x, t.right );
if (t.right.priority < t.priority)
t = rotateWithRightChild( t );
}
return t;
}
public void remove(int x)
{
if (isEmpty())
System.out.println("Tree Empty");
else if (search(x) == false)
System.out.println("Sorry "+ x +" is not present");
else

{
root = remove( x, root );
System.out.println(x+ " deleted from the tree");
}
}
private TreapNode remove(int x, TreapNode t)
{
if( t != nullNode )
{
if (x < t.element)
t.left = remove( x, t.left );
else if (x > t.element)
t.right = remove( x, t.right );
else
{
if (t.left.priority < t.right.priority)
t = rotateWithLeftChild( t );
else
t = rotateWithRightChild( t );
if (t != nullNode)
t = remove( x, t );
else
t.left = nullNode;
}
}
return t;
}
private TreapNode rotateWithLeftChild( TreapNode k2 )
{
TreapNode k1 = k2.left;
k2.left = k1.right;
k1.right = k2;
return k1;
}
private TreapNode rotateWithRightChild( TreapNode k1 )
{
TreapNode k2 = k1.right;
k1.right = k2.left;
k2.left = k1;
return k2;
}
public int countNodes()
{
return countNodes(root);
}
private int countNodes(TreapNode r)
{
if (r == nullNode)
return 0;
else

{
int l = 1;
l += countNodes(r.left);
l += countNodes(r.right);
return l;
}
}
public boolean search(int val)
{
return search(root, val);
}
private boolean search(TreapNode r, int val)
{
boolean found = false;
while ((r != nullNode) && !found)
{
int rval = r.element;
if (val < rval)
r = r.left;
else if (val > rval)
r = r.right;
else
{
found = true;
break;
}
found = search(r, val);
}
return found;
}
public void inorder()
{
inorder(root);
}
private void inorder(TreapNode r)
{
if (r != nullNode)
{
inorder(r.left);
System.out.print(r.element +" ");
inorder(r.right);
}
}
public void preorder()
{
preorder(root);
}
private void preorder(TreapNode r)
{
if (r != nullNode)

{
System.out.print(r.element +" ");
preorder(r.left);
preorder(r.right);
}
}
public void postorder()
{
postorder(root);
}
private void postorder(TreapNode r)
{
if (r != nullNode)
{
postorder(r.left);
postorder(r.right);
System.out.print(r.element +" ");
}
}
}
public class TreapTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
TreapTree trpt = new TreapTree();
System.out.println("TreapTree Tree Test\n");
char ch;
do
{
System.out.println("\nTreapTree Operations\n");
System.out.println("1. insert ");
System.out.println("2. delete");
System.out.println("3. search");
System.out.println("4. count nodes");
System.out.println("5. check empty");
System.out.println("6. clear");
int choice = scan.nextInt();
switch (choice)
{
case 1 :
System.out.println("Enter integer element to insert");
trpt.insert( scan.nextInt() );
break;
case 2 :
System.out.println("Enter integer element to delete");
try
{
trpt.remove( scan.nextInt() );
}

catch (Exception e)
{
System.out.println(e.getMessage()+" not found ");
}
break;
case 3 :
System.out.println("Enter integer element to search");
System.out.println("Search result : "+ trpt.search( scan.nextInt() ));
break;
case 4 :
System.out.println("Nodes = "+ trpt.countNodes());
break;
case 5 :
System.out.println("Empty status = "+ trpt.isEmpty());
break;
case 6 :
System.out.println("\nTree Cleared");
trpt.makeEmpty();
break;
default :
System.out.println("Wrong Entry \n ");
break;
}
System.out.print("\nPost order : ");
trpt.postorder();
System.out.print("\nPre order : ");
trpt.preorder();
System.out.print("\nIn order : ");
trpt.inorder();
System.out.println("\nDo you want to continue (Type y or n) \n");
ch = scan.next().charAt(0);
} while (ch == 'Y'|| ch == 'y');
}
}

















OUTPUT:













RESULT:
For a given three input values, the program successfully executed Treap operations like
insert, delete, search, count nodes, check empty.


HASHING WITH O (1) SEARCH TIME

AIM:
Given a program, to implement Hashing with O (1) searchtime.

ALGORITHM:
typedef unsigned char HashIndexType;
static const HashIndexType M = 158;

typedef unsigned short int HashIndexType;
static const HashIndexType M = 40503;

typedef unsigned long int HashIndexType;
static const HashIndexType M = 2654435769;

w=bitwidth(HashIndexType)
size of table=2**n
static const int S = w - n;
HashIndexType hashValue = (HashIndexType)(M * key) >> S;
typedef unsigned short int HashIndexType;

HashIndexType hash(int key) {
static const HashIndexType M = 40503;
static const int S = 6;
return (HashIndexType)(M * key) >> S;
}
unsigned char hash(char *str) {
unsigned char h = 0;
while (*str) h += *str++;
return h;
}
unsigned char rand8[256];

unsigned char hash(char *str) {
unsigned char h = 0;
while (*str) h = rand8[h ^ *str++];
return h;
}
unsigned char rand8[256];

unsigned short int hash(char *str) {
unsigned short int h;
unsigned char h1
h2;


if (*str == 0) return 0;
h1 = *str; h2 = *str + 1;
str++;
while (*str) {
h1 = rand8[h1 ^ *str];
h2 = rand8[h2 ^ *str];
str++;
}
h = ((unsigned short int)h1 << 8)|(unsigned short int)h2;
return h % HASH_TABLE_SIZE


SOURCE CODE:
import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Set;
public class HashtableDemo {
public static void main(String args[])
{
Hashtable companies = new Hashtable();
companies.put("Google", "United States");
companies.put("Nokia", "Finland");
companies.put("Sony", "Japan");
companies.get("Google");
System.out.println("Does hashtable contains Google as key:
"+companies.containsKey("Google"));
System.out.println("Does hashtable contains Japan as value: "
+ companies.containsValue("Japan"));
Enumeration enumeration = companies.elements();
while (enumeration.hasMoreElements()) {
System.out.println("hashtable values: " + enumeration.nextElement());
}
System.out.println("Is companies hashtable empty: "+ companies.isEmpty());
System.out.println("Size of hashtable in Java: " + companies.size());
Set hashtableKeys = companies.keySet();
Enumeration hashtableKeysEnum = companies.keys();
Enumeration hashtableValuesEnum = companies.elements();
Collection hashtableValues = companies.values();
companies.clear();
}
}





OUTPUT:













RESULT:
For a given hash table with its value and key, the program successfully executed its
operations.


VOLATILE FIELD
AIM:

Given a program to implement volatile field using java.



ALGORITHM:

Creating of threads

new ExampleThread("Thread 1 ").start();

new ExampleThread("Thread 2 ").start();

Reads and writes operations of volatile variables can not be reordered with each other respect

to each other or with respect to nonvolatile variable accesses.

getName().compareTo("Thread 1 ") == 0

getName().compareTo("Thread 12") == 0

returns the thread value.


SOURCE CODE:
public class VolatileExample {
public static void main(String args[]) {
new ExampleThread("Thread 1 ").start();
new ExampleThread("Thread 2 ").start();
}

}
class ExampleThread extends Thread {
private volatile int testValue = 1;
public ExampleThread(String str){
super(str);
}
public void run() {
for (int i = 0; i < 3; i++) {
try {
System.out.println(getName() + " : "+i);

if (getName().compareTo("Thread 1 ") == 0)
{
testValue++;
System.out.println( "Test Value T1: " + testValue);
}
if (getName().compareTo("Thread 2 ") == 0)
{
System.out.println( "Test Value T2: " + testValue);
}
Thread.sleep(1000);
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
}
}






OUTPUT:



RESULT:
For a given input values, the program successfully executed volatile fields.



LAMPORT BAKERY

AIM:

Given a program to implement Lamport Bakery algorithm.



ALGORITHM:


shared variable

Choosing: array[1::N] of 0::1 initially 0;

Number: array[1::N] of 0::1 initially 0

process p: =_ 1 _ p _ N _=

private variable

q: 1::N

while true do

0: Noncritical Section;

" 1: Choosing[p] := 1;

Doorway 2: Number [p] := 1+maxfNumber [1]; : : : ; Number [N]g;

# 3: Choosing[p] := 0;

" 4: for q := 1 to N skip p do

5: await Choosing[q] = 0; =_ busy wait _=

Bakery 6: await Number [q] = 0 _ (Number [p]; p) < (Number [q]; q) =_ busy wait _=

od;

# 7: Critical Section;

8: Number [p] := 0

Od

shared variable


B: array[1::N] of boolean initially false;

X: 1::N;

Y : 0::N initially 0

process p: =_ 1 _ p _ N _=

private variable

j: 1::N

while true do

0: Noncritical Section;

B[p] := true;

X := p;

if Y 6= 0 then

B[p] := false;

await Y = 0; =_ busy wait _=

goto 1_;

Y := p;

if X 6= p then

B[p] := false;

10: for j := 1 to N do

await :B[j] =_ busy wait _=od;

if Y 6= p then

await Y = 0; =_ busy wait _=

goto 1__;

Critical Section;

Y := 0;

B[p] := false


Od

Processor A:

a := 1;

if b = 0 then critical section; a := 0 _

Processor B:

b := 1;

if a = 0 then critical section; b := 0 _



SOURCE CODE:

import java.util.*;
import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class lamport{
int e[][]=new int[10][10];
int en[][]=new int[10][10];
int ev[]=new int[10];
int i,p,j,k;
HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();
int xpoints[] =new int[5];
int ypoints[] =new int[5];
class draw extends JFrame{
private final int ARR_SIZE = 4;

void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) {
Graphics2D g = (Graphics2D) g1.create();

double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = (int) Math.sqrt(dx*dx + dy*dy);
AffineTransform at = AffineTransform.getTranslateInstance(x1, y1);
at.concatenate(AffineTransform.getRotateInstance(angle));
g.transform(at);

// Draw horizontal arrow starting in (0, 0)
g.drawLine(0, 0, len, 0);
g.fillPolygon(new int[] {len, len-ARR_SIZE, len-ARR_SIZE, len},
new int[] {0, -ARR_SIZE, ARR_SIZE, 0}, 4);
}


public void paintComponent(Graphics g) {
for (int x = 15; x < 200; x += 16)
drawArrow(g, x, x, x, 150);
drawArrow(g, 30, 300, 300, 190);
}




public void paint(Graphics g){
int h1,h11,h12;
Graphics2D go=(Graphics2D)g;
go.setPaint(Color.black);
for(i=1;i<=p;i++)
{
go.drawLine(50,100*i,450,100*i);
}
for(i=1;i<=p;i++)
{
for(j=1;j<=ev[i];j++)
{
k=i*10+j;
go.setPaint(Color.blue);
go.fillOval(50*j,100*i-3,5,5);
go.drawString("e"+i+j+"("+en[i][j]+")",50*j,100*i-5);
h1=hm.get(k);
if(h1!=0)
{
h11=h1/10;
h12=h1%10;
go.setPaint(Color.red);
drawArrow(go,50*h12+2,100*h11,50*j+2,100*i);
}
}
}

}
}
public void calc(){
Scanner sc=new Scanner(System.in);
System.out.println("Enter the number of process:");
p=sc.nextInt();
System.out.println("Enter the no of events per process:");
for(i=1;i<=p;i++)
{
ev[i]=sc.nextInt();
}
System.out.println("Enter the relationship:");
for(i=1;i<=p;i++)

{
System.out.println("For process:"+i);
for(j=1;j<=ev[i];j++)
{
System.out.println("For event:"+(j));
int input=sc.nextInt();
k=i*10+j;
hm.put(k,input);
if(j==1)
en[i][j]=1;
}
}

for(i=1;i<=p;i++)
{
for(j=2;j<=ev[i];j++)
{
k=i*10+j;
if(hm.get(k)==0)
{
en[i][j]=en[i][j-1]+1;
}
else
{
int a=hm.get(k);
int p1=a/10;
int e1=a%10;
if(en[p1][e1]>en[i][j-1])
en[i][j]=en[p1][e1]+1;
else
en[i][j]=en[i][j-1]+1;
}
}
}
for(i=1;i<=p;i++)
{
for(j=1;j<=ev[i];j++)
{
System.out.println(en[i][j]);

}
}
JFrame jf=new draw();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(500,500);
jf.setVisible(true);
}
public static void main(String[] args){

lamport lam=new lamport();

lam.calc();

}
}


OUTPUT:












RESULT:

For a given input values, the program successfully executed Lamport Bakery
algorithm.

You might also like