算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-002如何改进算法

时间:2021-09-29 15:28:55

1.

 1 package algorithms.analysis14;
 2 
 3 import algorithms.util.In;
 4 import algorithms.util.StdOut;
 5 
 6 /******************************************************************************
 7  *  Compilation:  javac TwoSum.java
 8  *  Execution:    java TwoSum input.txt
 9  *  Dependencies: StdOut.java In.java Stopwatch.java
10  *  Data files:   http://algs4.cs.princeton.edu/14analysis/1Kints.txt
11  *                http://algs4.cs.princeton.edu/14analysis/2Kints.txt
12  *                http://algs4.cs.princeton.edu/14analysis/4Kints.txt
13  *                http://algs4.cs.princeton.edu/14analysis/8Kints.txt
14  *                http://algs4.cs.princeton.edu/14analysis/16Kints.txt
15  *                http://algs4.cs.princeton.edu/14analysis/32Kints.txt
16  *                http://algs4.cs.princeton.edu/14analysis/1Mints.txt
17  *
18  *  A program with N^2 running time. Read in N integers
19  *  and counts the number of pairs that sum to exactly 0.
20  *
21  *
22  *  Limitations
23  *  -----------
24  *     - we ignore integer overflow
25  *
26  *
27  *  % java TwoSum 2Kints.txt
28  *  2
29  *
30  *  % java TwoSum 1Kints.txt
31  *  1
32  *
33  *  % java TwoSum 2Kints.txt
34  *  2
35  *
36  *  % java TwoSum 4Kints.txt
37  *  3
38  *
39  *  % java TwoSum 8Kints.txt
40  *  19
41  *
42  *  % java TwoSum 16Kints.txt
43  *  66
44  *
45  *  % java TwoSum 32Kints.txt
46  *  273
47  *
48  ******************************************************************************/
49 
50 public class TwoSum {
51 
52     // print distinct pairs (i, j) such that a[i] + a[j]  = 0
53     public static void printAll(int[] a) {
54         int N = a.length;
55         for (int i = 0; i < N; i++) {
56             for (int j = i+1; j < N; j++) {
57                 if (a[i] + a[j] == 0) {
58                     StdOut.println(a[i] + " " + a[j]);
59                 }
60             }
61         }
62     } 
63 
64     // return number of distinct triples (i, j) such that a[i] + a[j] = 0
65     public static int count(int[] a) {
66         int N = a.length;
67         int cnt = 0;
68         for (int i = 0; i < N; i++) {
69             for (int j = i+1; j < N; j++) {
70                 if (a[i] + a[j] == 0) {
71                     cnt++;
72                 }
73             }
74         }
75         return cnt;
76     } 
77 
78     public static void main(String[] args)  { 
79         In in = new In(args[0]);
80         int[] a = in.readAllInts();
81         Stopwatch timer = new Stopwatch();
82         int cnt = count(a);
83         StdOut.println("elapsed time = " + timer.elapsedTime());
84         StdOut.println(cnt);
85     } 
86 } 

The answer to this question is that we have discussed and used two classic algorithms,
mergesort and binary search, have introduced the facts that the mergesort is linearith-
mic and binary search is logarithmic.

2.

 1 package algorithms.analysis14;
 2 
 3 /******************************************************************************
 4  *  Compilation:  javac TwoSumFast.java
 5  *  Execution:    java TwoSumFast input.txt
 6  *  Dependencies: In.java Stopwatch.java
 7  *  Data files:   http://algs4.cs.princeton.edu/14analysis/1Kints.txt
 8  *                http://algs4.cs.princeton.edu/14analysis/2Kints.txt
 9  *                http://algs4.cs.princeton.edu/14analysis/4Kints.txt
10  *                http://algs4.cs.princeton.edu/14analysis/8Kints.txt
11  *                http://algs4.cs.princeton.edu/14analysis/16Kints.txt
12  *                http://algs4.cs.princeton.edu/14analysis/32Kints.txt
13  *                http://algs4.cs.princeton.edu/14analysis/1Mints.txt
14  *
15  *  A program with N log N running time. Read in N integers
16  *  and counts the number of pairs that sum to exactly 0.
17  *
18  *  Limitations
19  *  -----------
20  *     - we ignore integer overflow
21  *
22  *
23  *  % java TwoSumFast 2Kints.txt
24  *  2
25  *
26  *  % java TwoSumFast 1Kints.txt
27  *  1
28  *
29  *  % java TwoSumFast 2Kints.txt
30  *  2
31  *
32  *  % java TwoSumFast 4Kints.txt
33  *  3
34  *
35  *  % java TwoSumFast 8Kints.txt
36  *  19
37  *
38  *  % java TwoSumFast 16Kints.txt
39  *  66
40  *
41  *  % java TwoSumFast 32Kints.txt
42  *  273
43  *
44  ******************************************************************************/
45 
46 import java.util.Arrays;
47 
48 import algorithms.util.In;
49 import algorithms.util.StdOut;
50 
51 public class TwoSumFast {
52 
53     // print distinct pairs (i, j) such that a[i] + a[j] = 0
54     public static void printAll(int[] a) {
55         int N = a.length;
56         Arrays.sort(a);
57         for (int i = 0; i < N; i++) {
58             int j = Arrays.binarySearch(a, -a[i]);
59             if (j > i) StdOut.println(a[i] + " " + a[j]);
60         }
61     } 
62 
63     // return number of distinct pairs (i, j) such that a[i] + a[j] = 0
64     public static int count(int[] a) {
65         int N = a.length;
66         Arrays.sort(a);
67         int cnt = 0;
68         for (int i = 0; i < N; i++) {
69             int j = Arrays.binarySearch(a, -a[i]);
70             if (j > i) cnt++;
71         }
72         return cnt;
73     } 
74 
75     public static void main(String[] args)  { 
76         In in = new In(args[0]);
77         int[] a = in.readAllInts();
78         int cnt = count(a);
79         StdOut.println(cnt);
80     } 
81 } 

  

3.

  1 package algorithms.analysis14;
  2 
  3 import algorithms.util.In;
  4 import algorithms.util.StdOut;
  5 
  6 /******************************************************************************
  7  *  Compilation:  javac ThreeSum.java
  8  *  Execution:    java ThreeSum input.txt
  9  *  Dependencies: In.java StdOut.java Stopwatch.java
 10  *  Data files:   http://algs4.cs.princeton.edu/14analysis/1Kints.txt
 11  *                http://algs4.cs.princeton.edu/14analysis/2Kints.txt
 12  *                http://algs4.cs.princeton.edu/14analysis/4Kints.txt
 13  *                http://algs4.cs.princeton.edu/14analysis/8Kints.txt
 14  *                http://algs4.cs.princeton.edu/14analysis/16Kints.txt
 15  *                http://algs4.cs.princeton.edu/14analysis/32Kints.txt
 16  *                http://algs4.cs.princeton.edu/14analysis/1Mints.txt
 17  *
 18  *  A program with cubic running time. Read in N integers
 19  *  and counts the number of triples that sum to exactly 0
 20  *  (ignoring integer overflow).
 21  *
 22  *  % java ThreeSum 1Kints.txt 
 23  *  70
 24  *
 25  *  % java ThreeSum 2Kints.txt 
 26  *  528
 27  *
 28  *  % java ThreeSum 4Kints.txt 
 29  *  4039
 30  *
 31  ******************************************************************************/
 32 
 33 /**
 34  *  The <tt>ThreeSum</tt> class provides static methods for counting
 35  *  and printing the number of triples in an array of integers that sum to 0
 36  *  (ignoring integer overflow).
 37  *  <p>
 38  *  This implementation uses a triply nested loop and takes proportional to N^3,
 39  *  where N is the number of integers.
 40  *  <p>
 41  *  For additional documentation, see <a href="http://algs4.cs.princeton.edu/14analysis">Section 1.4</a> of
 42  *  <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.
 43  *
 44  *  @author Robert Sedgewick
 45  *  @author Kevin Wayne
 46  */
 47 public class ThreeSum {
 48 
 49     // Do not instantiate.
 50     private ThreeSum() { }
 51 
 52     /**
 53      * Prints to standard output the (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0.
 54      * @param a the array of integers
 55      */
 56     public static void printAll(int[] a) {
 57         int N = a.length;
 58         for (int i = 0; i < N; i++) {
 59             for (int j = i+1; j < N; j++) {
 60                 for (int k = j+1; k < N; k++) {
 61                     if (a[i] + a[j] + a[k] == 0) {
 62                         StdOut.println(a[i] + " " + a[j] + " " + a[k]);
 63                     }
 64                 }
 65             }
 66         }
 67     } 
 68 
 69     /**
 70      * Returns the number of triples (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0.
 71      * @param a the array of integers
 72      * @return the number of triples (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0
 73      */
 74     public static int count(int[] a) {
 75         int N = a.length;
 76         int cnt = 0;
 77         for (int i = 0; i < N; i++) {
 78             for (int j = i+1; j < N; j++) {
 79                 for (int k = j+1; k < N; k++) {
 80                     if (a[i] + a[j] + a[k] == 0) {
 81                         cnt++;
 82                     }
 83                 }
 84             }
 85         }
 86         return cnt;
 87     } 
 88 
 89     /**
 90      * Reads in a sequence of integers from a file, specified as a command-line argument;
 91      * counts the number of triples sum to exactly zero; prints out the time to perform
 92      * the computation.
 93      */
 94     public static void main(String[] args)  { 
 95         In in = new In(args[0]);
 96         int[] a = in.readAllInts();
 97 
 98         Stopwatch timer = new Stopwatch();
 99         int cnt = count(a);
100         StdOut.println("elapsed time = " + timer.elapsedTime());
101         StdOut.println(cnt);
102     } 
103 } 

 

4.

  1 package algorithms.analysis14;
  2 
  3 /******************************************************************************
  4  *  Compilation:  javac ThreeSumFast.java
  5  *  Execution:    java ThreeSumFast input.txt
  6  *  Dependencies: StdOut.java In.java Stopwatch.java
  7  *  Data files:   http://algs4.cs.princeton.edu/14analysis/1Kints.txt
  8  *                http://algs4.cs.princeton.edu/14analysis/2Kints.txt
  9  *                http://algs4.cs.princeton.edu/14analysis/4Kints.txt
 10  *                http://algs4.cs.princeton.edu/14analysis/8Kints.txt
 11  *                http://algs4.cs.princeton.edu/14analysis/16Kints.txt
 12  *                http://algs4.cs.princeton.edu/14analysis/32Kints.txt
 13  *                http://algs4.cs.princeton.edu/14analysis/1Mints.txt
 14  *
 15  *  A program with N^2 log N running time. Read in N integers
 16  *  and counts the number of triples that sum to exactly 0.
 17  *
 18  *  Limitations
 19  *  -----------
 20  *     - we ignore integer overflow
 21  *     - doesn't handle case when input has duplicates
 22  *
 23  *
 24  *  % java ThreeSumFast 1Kints.txt
 25  *  70
 26  *  
 27  *  % java ThreeSumFast 2Kints.txt
 28  *  528
 29  *                
 30  *  % java ThreeSumFast 4Kints.txt
 31  *  4039
 32  * 
 33  *  % java ThreeSumFast 8Kints.txt
 34  *  32074
 35  *
 36  *  % java ThreeSumFast 16Kints.txt
 37  *  255181
 38  *
 39  *  % java ThreeSumFast 32Kints.txt
 40  *  2052358
 41  *
 42  ******************************************************************************/
 43 
 44 import java.util.Arrays;
 45 
 46 import algorithms.util.In;
 47 import algorithms.util.StdOut;
 48 
 49 /**
 50  *  The <tt>ThreeSumFast</tt> class provides static methods for counting
 51  *  and printing the number of triples in an array of distinct integers that
 52  *  sum to 0 (ignoring integer overflow).
 53  *  <p>
 54  *  This implementation uses sorting and binary search and takes time 
 55  *  proportional to N^2 log N, where N is the number of integers.
 56  *  <p>
 57  *  For additional documentation, see <a href="http://algs4.cs.princeton.edu/14analysis">Section 1.4</a> of
 58  *  <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.
 59  *
 60  *  @author Robert Sedgewick
 61  *  @author Kevin Wayne
 62  */
 63 public class ThreeSumFast {
 64 
 65     // Do not instantiate.
 66     private ThreeSumFast() { }
 67 
 68     // returns true if the sorted array a[] contains any duplicated integers
 69     private static boolean containsDuplicates(int[] a) {
 70         for (int i = 1; i < a.length; i++)
 71             if (a[i] == a[i-1]) return true;
 72         return false;
 73     }
 74 
 75     /**
 76      * Prints to standard output the (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0.
 77      * @param a the array of integers
 78      * @throws IllegalArgumentException if the array contains duplicate integers
 79      */
 80     public static void printAll(int[] a) {
 81         int N = a.length;
 82         Arrays.sort(a);
 83         if (containsDuplicates(a)) throw new IllegalArgumentException("array contains duplicate integers");
 84         for (int i = 0; i < N; i++) {
 85             for (int j = i+1; j < N; j++) {
 86                 int k = Arrays.binarySearch(a, -(a[i] + a[j]));
 87                 if (k > j) StdOut.println(a[i] + " " + a[j] + " " + a[k]);
 88             }
 89         }
 90     } 
 91 
 92     /**
 93      * Returns the number of triples (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0.
 94      * @param a the array of integers
 95      * @return the number of triples (i, j, k) with i < j < k such that a[i] + a[j] + a[k] == 0
 96      */
 97     public static int count(int[] a) {
 98         int N = a.length;
 99         Arrays.sort(a);
100         if (containsDuplicates(a)) throw new IllegalArgumentException("array contains duplicate integers");
101         int cnt = 0;
102         for (int i = 0; i < N; i++) {
103             for (int j = i+1; j < N; j++) {
104                 int k = Arrays.binarySearch(a, -(a[i] + a[j]));
105                 if (k > j) cnt++;
106             }
107         }
108         return cnt;
109     } 
110 
111     /**
112      * Reads in a sequence of distinct integers from a file, specified as a command-line argument;
113      * counts the number of triples sum to exactly zero; prints out the time to perform
114      * the computation.
115      */
116     public static void main(String[] args)  { 
117         In in = new In(args[0]);
118         int[] a = in.readAllInts();
119         int cnt = count(a);
120         StdOut.println(cnt);
121     } 
122 } 

算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-002如何改进算法