import java.util.Random; /** * A class to measure the running time of all three solutions to * the Stock Market problem. * * The BruteForce solution quickly slows down so you may need to * comment out code pertaining to this solution to compare both * divide-and-conquer solutions * * Ignore the bad programming style in this file. In general, you * should never use magic numbers! * * @author americachambers * */ public class StockTester { private static Random rnd = new Random(); public static void printAnswer(StockInfo answer, int[] prices) { System.out.println("Buy stock on day " + answer.buy_index + " for " + prices[answer.buy_index]); System.out.println("Sell stock on day " + answer.sell_index + " for " + prices[answer.sell_index]); System.out.println("Total profit: " + answer.profit); } /** * Populates prices array with randomly chosen prices * @param array */ public static void populatePrices(int[] array) { for(int i = 0; i < array.length; i++) { array[i] = rnd.nextInt(10000)+1; } } public static void main(String[] args) { // Consider different number of days int[] num_days = new int[20]; num_days[0] = 2; for(int i = 1; i < num_days.length; i++){ num_days[i] = num_days[i-1]*2; } // Instantiate the 3 algorithms we are comparing BruteForce bf = new BruteForce(); Recursive rf = new Recursive(); Transformation tf = new Transformation(); // This will hold the prices for each day int[] prices; // Repeatedly call, but do not time, to force Java // to compile to native code (i.e. forced optimization) int burnIn = 50; prices = new int[100]; for(int j = 0; j < burnIn; j++) { populatePrices(prices); bf.solve(prices); rf.solve(prices); tf.solve(prices); } System.out.println("Finished burn in "); // Start the actual timed trials // For each number of days // For 10 iterations // Randomly sample new prices // Run each of the 3 algorithms long start, end; long recursiveTime = 0; long bruteForceTime = 0; long transformationTime = 0; int timedIterations = 10; for(int i = 0; i < num_days.length; i++) { prices = new int[num_days[i]]; for(int j = 0; j < timedIterations; j++){ populatePrices(prices); start = System.nanoTime(); bf.solve(prices); end = System.nanoTime(); bruteForceTime += (end - start); start = System.nanoTime(); rf.solve(prices); end = System.nanoTime(); recursiveTime += (end - start); start = System.nanoTime(); tf.solve(prices); end = System.nanoTime(); transformationTime += (end - start); // Asserting that all methods return the same answer StockInfo s1 = bf.solve(prices); StockInfo s2 = rf.solve(prices); StockInfo s3 = tf.solve(prices); assert(s1.profit == s2.profit); assert(s2.profit == s3.profit); } System.out.println("Array size: " + num_days[i]); System.out.println("Brute force: " + ((bruteForceTime/1000)/timedIterations) + " microseconds"); System.out.println("Recursive: " + ((recursiveTime/1000)/timedIterations) + " microseconds"); System.out.println("Transformed: " + ((transformationTime/1000)/timedIterations) + " microseconds"); System.out.println(); } } } // Results with all 3 //Finished burn in //Array size: 2 //Brute force: 0 microseconds //Recursive: 4 microseconds //Transformed: 1 microseconds // //Array size: 4 //Brute force: 0 microseconds //Recursive: 8 microseconds //Transformed: 3 microseconds // //Array size: 8 //Brute force: 0 microseconds //Recursive: 15 microseconds //Transformed: 8 microseconds // //Array size: 16 //Brute force: 1 microseconds //Recursive: 27 microseconds //Transformed: 16 microseconds // //Array size: 32 //Brute force: 2 microseconds //Recursive: 51 microseconds //Transformed: 30 microseconds // //Array size: 64 //Brute force: 3 microseconds //Recursive: 102 microseconds //Transformed: 61 microseconds // //Array size: 128 //Brute force: 12 microseconds //Recursive: 234 microseconds //Transformed: 149 microseconds // //Array size: 256 //Brute force: 29 microseconds //Recursive: 393 microseconds //Transformed: 264 microseconds // //Array size: 512 //Brute force: 120 microseconds //Recursive: 435 microseconds //Transformed: 601 microseconds // //Array size: 1024 //Brute force: 409 microseconds //Recursive: 525 microseconds //Transformed: 783 microseconds // //Array size: 2048 //Brute force: 1436 microseconds //Recursive: 656 microseconds //Transformed: 918 microseconds // //Array size: 4096 //Brute force: 5370 microseconds //Recursive: 845 microseconds //Transformed: 1316 microseconds // //Array size: 8192 //Brute force: 21513 microseconds //Recursive: 1214 microseconds //Transformed: 1660 microseconds // //Array size: 16384 //Brute force: 80536 microseconds //Recursive: 1650 microseconds //Transformed: 2491 microseconds // //Array size: 32768 //Brute force: 311015 microseconds //Recursive: 2691 microseconds //Transformed: 3989 microseconds // //Array size: 65536 //Brute force: 1207766 microseconds //Recursive: 4460 microseconds //Transformed: 7265 microseconds // //Comparing the sub quadratic algorithms //Finished burn in //Array size: 2 //Recursive: 3 microseconds //Transformed: 0 microseconds // //Array size: 4 //Recursive: 11 microseconds //Transformed: 3 microseconds // //Array size: 8 //Recursive: 21 microseconds //Transformed: 10 microseconds // //Array size: 16 //Recursive: 33 microseconds //Transformed: 17 microseconds // //Array size: 32 //Recursive: 58 microseconds //Transformed: 31 microseconds // //Array size: 64 //Recursive: 105 microseconds //Transformed: 60 microseconds // //Array size: 128 //Recursive: 201 microseconds //Transformed: 115 microseconds // //Array size: 256 //Recursive: 422 microseconds //Transformed: 268 microseconds // //Array size: 512 //Recursive: 471 microseconds //Transformed: 625 microseconds // //Array size: 1024 //Recursive: 569 microseconds //Transformed: 876 microseconds // //Array size: 2048 //Recursive: 759 microseconds //Transformed: 1127 microseconds // //Array size: 4096 //Recursive: 998 microseconds //Transformed: 1634 microseconds // //Array size: 8192 //Recursive: 1367 microseconds //Transformed: 2008 microseconds // //Array size: 16384 //Recursive: 1856 microseconds //Transformed: 2812 microseconds // //Array size: 32768 //Recursive: 3723 microseconds //Transformed: 4515 microseconds // //Array size: 65536 //Recursive: 7824 microseconds //Transformed: 8735 microseconds // //Array size: 131072 //Recursive: 12939 microseconds //Transformed: 15381 microseconds // //Array size: 262144 //Recursive: 24380 microseconds //Transformed: 31773 microseconds // //Array size: 524288 //Recursive: 38318 microseconds //Transformed: 56609 microseconds // //Array size: 1048576 //Recursive: 65792 microseconds //Transformed: 110365 microseconds //