Sunday, 27 September 2015

Java program to find two numbers in an integer array such that their sum is greater than some integer in O(n) linear time....

problem -find two number 'a' and 'b' such that a+b>sum where sum can be any given integer value...

here is the code ......

logic =you have to execute two passes of bubble sort and then pick the last two elements ...


       
public class findElements {

 public static void main(String[] args) {
  int[] arr = {
   45,
   4,
   23,
   56,
   87,
   27,
   34,
   89
  };
  int temp;
  int sum = 100;
  for (int y = 0; y < 2; y++) {
   for (int i = 0; i < arr.length - y - 1; i++) {

    if (arr[i] > arr[i + 1]) {
     temp = arr[i];
     arr[i] = arr[i + 1];
     arr[i + 1] = temp;
    }
   }
  }
  if (arr[arr.length - 1] + arr[arr.length - 2] > sum)
   System.out.println("required elements are" + arr[arr.length - 1] + " and " + arr[arr.length - 2]);
  else System.out.println("elements not found");
  //for(int s:arr) { System.out.print(s); System.out.print(" ");}
 }

}

time complexity = 2(first loop) + n(second loop) = O(n)

       
 

Friday, 18 September 2015

Dining philosopher's synchronization problem implemented using Java........

here is the code .....


       

public class DiningPhilosopherProblem {
 // Makes the code more readable.
 public static class ChopStick {
  // Make sure only one philosopher can have me at any time.
  Lock up = new ReentrantLock();
  // Who I am.
  private final int id;

  public ChopStick(int id) {
   this.id = id;
  }

  public boolean pickUp(Philosopher who, String where) throws InterruptedException {
   if (up.tryLock(10, TimeUnit.MILLISECONDS)) {
    System.out.println(who + " picked up " + where + " " + this);
    return true;
   }
   return false;
  }

  public void putDown(Philosopher who, String name) {
   up.unlock();
   System.out.println(who + " put down " + name + " " + this);
  }

  @Override
  public String toString() {
   return "Chopstick-" + id;
  }
 }

 // One philosoper.
 public static class Philosopher implements Runnable {
  // Which one I am.
  private final int id;
  // The chopsticks on either side of me.
  private final ChopStick leftChopStick;
  private final ChopStick rightChopStick;
  // Am I full?
  volatile boolean isTummyFull = false;
  // To randomize eat/Think time
  private Random randomGenerator = new Random();
  // Number of times I was able to eat.
  private int noOfTurnsToEat = 0;

  /**
   * **
   *
   * @param id Philosopher number
   *
   * @param leftChopStick
   * @param rightChopStick
   */
  public Philosopher(int id, ChopStick leftChopStick, ChopStick rightChopStick) {
   this.id = id;
   this.leftChopStick = leftChopStick;
   this.rightChopStick = rightChopStick;
  }

  @Override
  public void run() {

   try {
    while (!isTummyFull) {
     // Think for a bit.
     think();
     // Make the mechanism obvious.
     if (leftChopStick.pickUp(this, "left")) {
      if (rightChopStick.pickUp(this, "right")) {
       // Eat some.
       eat();
       // Finished.
       rightChopStick.putDown(this, "right");
      }
      // Finished.
      leftChopStick.putDown(this, "left");
     }
    }
   } catch (Exception e) {
    // Catch the exception outside the loop.
    e.printStackTrace();
   }
  }

  private void think() throws InterruptedException {
   System.out.println(this + " is thinking");
   Thread.sleep(randomGenerator.nextInt(1000));
  }

  private void eat() throws InterruptedException {
   System.out.println(this + " is eating");
   noOfTurnsToEat++;
   Thread.sleep(randomGenerator.nextInt(1000));
  }

  // Accessors at the end.
  public int getNoOfTurnsToEat() {
   return noOfTurnsToEat;
  }

  @Override
  public String toString() {
   return "Philosopher-" + id;
  }
 }
 // How many to test with.
 private static final int NO_OF_PHILOSOPHER = 50;
 //private static final int SIMULATION_MILLIS = 1000 * 60 * 8;
 private static final int SIMULATION_MILLIS = 1000 * 10;

 public static void main(String args[]) throws InterruptedException {
  ExecutorService executorService = null;

  Philosopher[] philosophers = null;
  try {

   philosophers = new Philosopher[NO_OF_PHILOSOPHER];

   //As many forks as Philosophers
   ChopStick[] chopSticks = new ChopStick[NO_OF_PHILOSOPHER];
   // Cannot do this as it will fill the whole array with the SAME chopstick.
   //Arrays.fill(chopSticks, new ReentrantLock());
   for (int i = 0; i < NO_OF_PHILOSOPHER; i++) {
    chopSticks[i] = new ChopStick(i);
   }

   executorService = Executors.newFixedThreadPool(NO_OF_PHILOSOPHER);

   for (int i = 0; i < NO_OF_PHILOSOPHER; i++) {
    philosophers[i] = new Philosopher(i, chopSticks[i], chopSticks[(i + 1) % NO_OF_PHILOSOPHER]);
    executorService.execute(philosophers[i]);
   }
   // Main thread sleeps till time of simulation
   Thread.sleep(SIMULATION_MILLIS);
   // Stop all philosophers.
   for (Philosopher philosopher: philosophers) {
    philosopher.isTummyFull = true;
   }

  } finally {
   // Close everything down.
   executorService.shutdown();

   // Wait for all thread to finish
   while (!executorService.isTerminated()) {
    Thread.sleep(1000);
   }

   // Time for check
   for (Philosopher philosopher: philosophers) {
    System.out.println(philosopher + " => No of Turns to Eat =" + philosopher.getNoOfTurnsToEat());
   }
  }
 }
}
       
 

Wednesday, 16 September 2015

Java program to print reverse number triangle pattern......

Output Pattern-

              123456787654321
                1234567654321
                  12345654321
                    123454321  
                      1234321  
                        12321    
                          121    
                            1      

here is the code .....





       
class printPattern {
 public static void main(String[] args) {
  int ad = 8;
  for (int i = 0; i < 8; i++, ad--) {

   for (int r = 0; r < i; r++) {
    System.out.print(" ");
   }
   for (int k = 1,
    var = ad; k <=
    var; k++) {
    System.out.print(k);

   }
   for (int j = (ad - 1); j >= 1; j--) {
    System.out.print(j);
   }
   for (int r = 0; r < i; r++) {
    System.out.print(" ");
   }

   System.out.println(" ");
  }

 }
}

       
 

Tuesday, 15 September 2015

Trigonometric Sine function calculation using Java......


//Using the below series here is the code to calculate the Sine value

ExerciseBasics_TrigonometricSeries.png

NOTE-  value of x (the argument of sine function) is given in degree or you can                       modify the code to accept the input in radian 




       
public class sineFunction {
 public static void main(String[] args) {
   int numTerms = 4;
   double degree = 20;
   double argsinRadian;
   argsinRadian = (degree * 3.14) / 180;
   System.out.println("value of sin(" + argsinRadian + ") is -" + evaluateSine(argsinRadian, numTerms));
  } //main

 public static double evaluateSine(double argsinRadian, int numTerms) {
  double functionValue = argsinRadian;
  double value = argsinRadian;
  double squareValue = argsinRadian;
  squareValue = argsinRadian * argsinRadian;
  double temp = 0;
  int p = 3;
  for (int t = 2; t <= numTerms; t++) {
   temp = value * squareValue;
   value = temp;
   temp = temp / fact(p);
   p = p + 2;
   if (t % 2 == 0) {
    temp = temp * -1;
   }
   functionValue = functionValue + temp;
  }
  return functionValue;
 }
 public static int fact(int num) {
  int factorial = 1;
  for (int k = 1; k <= num; k++) {
   factorial = factorial * k;
  }
  return factorial;
 }
}

       
 

Monday, 10 August 2015

Find Transitive relations in a graph represented via adjacency matrix using Java....

Problem:-Using the Java language, have the function TransitivityRelations(strArr) read the strArr parameter being passed which will make up an NxN matrix where the rows are separated by each pair of parentheses (the matrix will range from 2x2 to 5x5). The matrix represents connections between nodes in a graph where each node corresponds to the Nth element in the matrix (with 0 being the first node). If a connection exists from one node to another, it will be represented by a 1, if not it will be represented by a 0. For example: suppose strArr were a 3x3 matrix with input 

["(1,1,1)","(1,0,0)","(0,1,0)"], this means that there is a connection from node 0->0, 0->1, and 0->2. For node 1 the connections are 1->0, and for node 2 the connections are 2->1. This can be interpreted as a connection existing from node X to node Y if there is a 1 in the Xth row and Yth column. Note: a connection from X->Y does not imply a connection from Y->X. 

What your program should determine is whether or not the matrix, which represents connections among the nodes, is transitive. A transitive relationmeans that if the connections 0->1 and 1->2 exist for example, then there must exist the connection 0->2. More generally, if there is a relation xRy and yRz, then xRz should exist within the matrix. If a matrix is completely transitive, return the string transitive. If it isn't, your program should return the connections needed, in the following format, in order for the matrix to be transitive: (N1,N2)-(N3,N4)-(...). So for the example above, your program should return (1,2)-(2,0). You can ignore the reflexive property of nodes in your answers. Return the connections needed in lexicographical order [e.g. (0,1)-(0,4)-(1,4)-(2,3)-(4,1)]. 


Note:-This program is only for 3x3 matrix ,but you can extend to a program generic for any size matrix .

here is the code for it .....




       

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Transitive {

 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String matrix = br.readLine();
  //String mat="[\"(1,1,1)\",\"(1,1,1)\",\"(1,1,0)\"]";
  System.out.println("the desired result is " + TransitiveRelations(matrix));

 }

 public static ArrayList < String > TransitiveRelations(String strArr) {

  int[][] mat = new int[3][3];

  ArrayList < String > aka = new ArrayList < String > ();
  String[] arr = strArr.split("\\)");

  String[] a1 = arr[0].split("\\(");
  String[] a2 = arr[1].split("\\(");
  String[] a3 = arr[2].split("\\(");

  String[] r1 = a1[1].split(",");
  String[] r2 = a2[1].split(",");
  String[] r3 = a3[1].split(",");

  for (int k = 0; k < 3; k++)
   mat[0][k] = Integer.parseInt(r1[k]);


  for (int s = 0; s < 3; s++)
   mat[1][s] = Integer.parseInt(r2[s]);


  for (int p = 0; p < 3; p++)
   mat[2][p] = Integer.parseInt(r3[p]);


  for (int h = 0; h < 3; h++) {
   for (int q = 0; q < 3; q++) {
    for (int e = 0; e < 3; e++) {
     if (h != q) {
      if (mat[h][e] == 1) {
       if (mat[e][q] == 1) {
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       } else {
        aka.add(e + "-" + q);
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       }
      } else {
       aka.add(h + "-" + e);
       if (mat[e][q] == 1) {
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       } else {
        aka.add(e + "-" + q);
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);

       }
      }
     }

    }
   }
  }
  ArrayList < String > a = new ArrayList < String > ();
  for (int t = 0; t < aka.size(); t++)
   if (!a.contains(aka.get(t)) == true)
    a.add(aka.get(t));

  return a;
 }

}
       
 

Find out minimum cost between two nodes in a weighted graph using greedy approach using java.....

Input :- 1.cost matrix for the graph is given via text file ,just write the matrix in the text file simply like we write normally and save it ,change the path of the file in the program too.

2.For those nodes which don't have direct paths between them corresponding entries in the input adjacency matrix via file should be "-1".
here is the code  ........





       
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ShortestPath {
 public static int count = 0;
 public static int[][] matrix;

 public static void main(String[] args) throws NumberFormatException, IOException {
  // TODO Auto-generated method stub
  File file = new File("C:/Users/gauravy/Desktop/matrix.txt");
  BufferedReader be = new BufferedReader(new FileReader(file));
  while ((be.readLine()) != null)
   count++;
  matrix = new int[count][count];
  String fileName = "C:/Users/gauravy/Desktop/matrix.txt";

  FileInputStream inputStream = new FileInputStream(fileName);
  BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));

  int lineCount = 0;
  String[] numbers;
  String line = null;
  while ((line = bf.readLine()) != null) {
   numbers = line.split(" ");
   for (int i = 0; i < count; i++) {
    matrix[lineCount][i] = Integer.parseInt(numbers[i]);
   }

   lineCount++;
  }
  bf.close();
  for (int l = 0; l < count; l++)
   for (int s = 0; s < count; s++)
    if (matrix[l][s] == -1) matrix[l][s] = Integer.MAX_VALUE;

  System.out.println("Minimum cost which we evaluated is " + minPath(matrix, 3, count - 1));
 }
 public static int minPath(int[][] mat, int i, int j) {
  int cost;
  if (i == j) return 0;
  else {
   int y = getNodeWithMinDistance(i);
   cost = matrix[i][y] + minPath(mat, y, j);
   if (cost < mat[i][j]) return cost;
   else return mat[i][j];
  }
 }

 public static int getNodeWithMinDistance(int source) {
  int min = matrix[source][source + 1];
  int minNeighbourNode = source + 1;
  for (int k = source + 1; k < count; k++) {
   if (matrix[source][k] < min) {
    min = matrix[source][k];
    minNeighbourNode = k;
   }
  }
  return minNeighbourNode;
 }
}

       
 

Friday, 24 July 2015

Java Programming solution to solve a problem on optimal assignments ,detailed problem statement is given below .....

/*Using the Java language, have the function OptimalAssignments(strArr) read strArr which will represent an NxN matrix and it will be in the following format: ["(n,n,n...)","(...)",...] where the n's represent integers. This matrix represents a machine at row i performing task at column j. The cost for this is matrix[i][j]. Your program should determine what machine should perform what task so as to minimize the whole cost and it should return the pairings of machines to tasks in the following format: (i-j)(...)... Only one machine can perform one task. For example: if strArr is ["(5,4,2)","(12,4,3)","(3,4,13)"] then your program should return (1-3)(2-2)(3-1) because assigning the machines to these tasks gives the least cost. The matrix will range from 2x2 to 6x6, there will be no negative costs in the matrix, and there will always be a unique answer*/


import java.util.*; 
import java.io.*;

class Function {  
  String OptimalAssignments(String strArr) { 
  
    // code goes here   
    /* Note: In Java the return type of a function and the 
       parameter types being passed are defined, so this return 
       call must match the return type of the function.
       You are free to modify the return type. */
       int[][] mat=new int[3][3];
       
       
       String[] arr=strArr.split("\\)");
        
        
        
        String[] a1=arr[0].split("\\(");
        String[] a2=arr[1].split("\\(");
        String[] a3=arr[2].split("\\(");
        
          String[] r1=a1[1].split(",");
          String[] r2=a2[1].split(","); 
          String[] r3=a3[1].split(",");  
          
          for(int k=0;k<3;k++)
            mat[0][k]=Integer.parseInt(r1[k]);


          for(int s=0;s<3;s++)
            mat[1][s]=Integer.parseInt(r2[s]);


          for(int p=0;p<3;p++)
            mat[2][p]=Integer.parseInt(r3[p]);
           
         /* for (int y=0;y<3;y++)
           for (int r=0;r<3;r++)
          System.out.println(mat[y][r]);
          */
          Function d=new Function();
         int[] sum=d.mincost_map(mat,0);
          strArr="\"(1-"+sum[0]+")(2-"+sum[1]+")(3-"+sum[2]+")\"";
    return strArr;
    
  } 
  
  
  public int[] mincost_map(int[][] a,int b){
 int[] c=new int[3];
 Function f=new Function();
 //int[][] arr=new int[b][b]; 
        c[0]=f.find_min(a,0,3);
        c[1]=f.find_min(a,1,c[0]);
        c[2]=f.find_min(a,2,c[1]);
 
 return  c;
  }
  
  public int find_min(int[][] a,int r,int num){
 int sum=a[r][0];
 int q=0;
for(int y=0;y<3;y++){
if(a[r][y]<sum)

if(y==num) 
continue;
else { sum=a[r][y]; q=y;}
}
}
return q;
  }
  
  public static void main (String[] args) throws Exception{  
    // keep this function call here     
    BufferedReader s=new BufferedReader(new InputStreamReader(System.in));
    String str=s.readLine();
    Function c = new Function();
    //String str="[\"(5,4,2)\",\"(12,4,4)\",\"(3,4,13)\"]";
    System.out.print(c.OptimalAssignments(str));
  //Function c=new Function();

   
  
  //System.out.println(c.OptimalAssignments(str));
    
  }   
  
}