Advertisement
Vermiculus

Untitled

Oct 3rd, 2011
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.96 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. /**
  4.  * @author Sean Allred
  5.  * @author Molly Domino
  6.  *
  7.  *         Tests the Maximum Contiguous Subsequence Sum Algorithms N^3 and N^2
  8.  */
  9. public class driver {
  10.  
  11.     public static final long MAX_LONG = 9223372036854775807L;
  12.    
  13.     /**
  14.      * O(n^3) algorithm. Takes every possible subset, sums, and returns the maximum
  15.      * sum to the user
  16.      *
  17.      * @param arr
  18.      *            the array to operate on
  19.      * @return the maximum contiguous subset sum
  20.      */
  21.     private static int subSum_N3(int arr[]) {
  22.         int maxSum = 0;
  23.  
  24.         for (int startElement = 0; startElement < arr.length - 1; startElement++) {
  25.             for (int endElement = startElement; endElement < arr.length; endElement++) {
  26.                 int thisSum = 0;
  27.                 for (int thisElementIndex = startElement; thisElementIndex <= endElement; thisElementIndex++) {
  28.                     thisSum += arr[thisElementIndex];
  29.                 }
  30.                 // update max
  31.                 if (thisSum > maxSum)
  32.                     maxSum = thisSum;
  33.             }
  34.         }
  35.         return maxSum;
  36.     }
  37.  
  38.     /**
  39.      * O(n^2) algorithm. Also takes every possible subset, but sums common subsets
  40.      * only once
  41.      *
  42.      * @param arr
  43.      *            the array to operate on
  44.      * @return the maximum contiguous subset sum
  45.      */
  46.     private static int subSum_N2(int arr[]) {
  47.  
  48.         int maxSum = 0, thisSum = 0;
  49.  
  50.         for (int startElement = 0; startElement < arr.length; startElement++) {
  51.             thisSum = 0;
  52.             for (int endElement = startElement; endElement < arr.length; endElement++) {
  53.                 thisSum += arr[endElement];
  54.                 // update max
  55.                 if (thisSum > maxSum)
  56.                     maxSum = thisSum;
  57.             }
  58.         }
  59.         return maxSum;
  60.  
  61.     }
  62.  
  63.     /**
  64.      * O(n) algorithm. Baws.
  65.      *
  66.      * @param arr the array to operate on
  67.      * @return the maximum contiguous subsequence sum
  68.      */
  69.     private static int subSum_N1(int arr[]) {
  70.         int maxSum = 0, thisSum = 0, endElement = 0;
  71.         // Cycle through all possible end indexes.
  72.         for (endElement = 0; endElement < arr.length; endElement++) {
  73.             thisSum += arr[endElement]; // No need to re-add all values.
  74.             if (thisSum > maxSum) {
  75.                 maxSum = thisSum;
  76.             } else if (thisSum < 0) {
  77.                 thisSum = 0; // Reset running sum.
  78.             }
  79.         }
  80.         return maxSum;
  81.     }
  82.    
  83.     private static int rand(java.util.Random r, int min, int max) {
  84.         return r.nextInt(max - min + 1) + min;
  85.     }
  86.  
  87.     public static void main(String[] args) {
  88.  
  89.         // used with {"5"}, the output is nicely formatted
  90.        
  91.         // get the param argument
  92.         int size = Integer.parseInt(args[0]);
  93.        
  94.         // populate a random array
  95.         int[] randArray = getRandArray((long)size);
  96.  
  97.         // print every random number you got
  98.         for (int i : randArray)
  99.             System.out.printf("%3d", i);
  100.                
  101.         System.out.printf("%nMax Sum N^3:%3d", subSum_N1(getRandArray(65536L)));
  102.                
  103.         System.out.printf("%nMax Sum N^3:%3d", subSum_N3(randArray));
  104.  
  105.         System.out.printf("%nMax Sum N^2:%3d", subSum_N2(randArray));
  106.        
  107.         // Efficiency Testing
  108.  
  109.         int[] testArray = getRandArray(4096L);
  110.         System.out.printf("%n%nTesting N^2 against N^3 for efficiency on a %d-element array...%nGO!%n%n", testArray.length);
  111.         Stopwatch s = new Stopwatch();
  112.        
  113.         s.start(); System.out.printf("Max Sum N^1: %d", subSum_N1(testArray));
  114.         s.stop();  System.out.printf("%nTime: %d ms%n", s.getElapsedTime());
  115.        
  116.         s.start(); System.out.printf("Max Sum N^2: %d", subSum_N2(testArray));
  117.         s.stop();  System.out.printf("%nTime: %d ms%n", s.getElapsedTime());
  118.        
  119.         s.start(); System.out.printf("Max Sum N^3: %d", subSum_N3(testArray));
  120.         s.stop();  System.out.printf("%nTime: %d ms%n", s.getElapsedTime());
  121.     }
  122.    
  123.     public static int[] getRandArray(long size) {
  124.        
  125.         // populate a random array
  126.         ArrayList<Integer> arr = new ArrayList<Integer>();
  127.         java.util.Random randSeed = new java.util.Random();
  128.         for (int i = 0; i < size; i++) {
  129.             arr.add(rand(randSeed, -9, 10));
  130.         }
  131.         return arrayListToArray(arr);
  132.     }
  133.    
  134.     public static int[] arrayListToArray(ArrayList<Integer> ints)
  135.     {
  136.         int[] r = new int[ints.size()];
  137.        
  138.         for (int i=0; i < r.length; i++)
  139.             r[i] = ints.get(i);
  140.        
  141.         return r;
  142.     }
  143.  
  144. }
  145.  
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement