Wednesday 23 September 2015

Increasing array subsequence

Problem


You are given an integer array. Find all the subsequences of the array which has the elements in increasing order. B is a subsequence of array A if B can be formed by removing some elements from the array A without disturbing the order of elements. For example {2,5,6,1,3} is the input array, Then {2,5}, {2,6}, {2,6,1}, {2,1,3} are some of its subsequences. In these {2,5}, {2,6} are increasing subsequences. 

Solution


We will use memoization to solve this problem. At any index i of the given array we will have a subproblem of finding all the increasing subsequences till the index i. Then we will check with i+1th element. Some of these subsequences maintain the increasing property after adding this element. we will add this i+1th element to those subsequences and add the number itself as a single element subsequence to the previously memoized solution. As this i+1th element can itself be starting of another sequence. The complexity of the algorithm is output sensitive as we have to find all possible outputs. Let there be k number of increasing subsequences possible. Then the complexity is O(n*k). The term k is the total possible subsequeces. Which is of the order of 2^n. So in upper bound term it is O(n*2^n). But this complexity will only arises when all the subsequences are increasing subsequences. That occurs when the given array is sorted increasingly. In a random array the value of k is supposed to be much less than 2^n. 


Code

import java.util.ArrayList;

public class IncreasingArraySubsequence
{

 /**
  * create subsequence of a given array where every 
  * element in the subsequence is greater than its 
  * previous element
  *
  * @param args
  */
 public static void main(String[] args)
 {
  int[] input =
  { 2, 5, 6, 1, 3 };
  int length = input.length;
  ArrayList < ArrayList < Integer > > table = 
   new ArrayList < ArrayList < Integer > >();

  for (int i = 0; i < length; ++i)
  {
   ArrayList < ArrayList < Integer > > tempTable = 
    new ArrayList < ArrayList < Integer > >();
   for (ArrayList < Integer > j : table)
   {
    if (j.get(j.size() - 1) <= input[i])
    {
     ArrayList < integer > temp = new ArrayList < integer >();
     temp.addAll(j);
     temp.add(input[i]);
     tempTable.add(temp);
    }
   }
   table.addAll(tempTable);
   ArrayList < Integer > temp = 
     new ArrayList < Integer >();
   temp.add(input[i]);
   table.add(temp);
  }

  // output
  for (ArrayList < Integer > i : table)
  {
   for (Integer j : i)
   {
    System.out.print(j + ", ");
   }
   System.out.println();
  }
 }

}

No comments:

Post a Comment