减少使用实例变量来减少内存的使用

时间:2015-07-30 21:28:49

标签: java algorithm

我试图对普林斯顿进行算法编程,我遇到了关于内存测试的问题。分配要求我们运行渗透程序N次并找到结果的介质,并且我写了一个percolationtest.java,并且每次都创建一个实例变量,它工作,但是使用了太多的内存,教师建议我使用局部变量,但我不知道如何。有人可以帮助我并给我一些建议,我真的很感激。

public class PercolationStats {
private int N, T, totalSum;
private double []fraction;
private int []count;
public PercolationStats(int N, int T) {
    if (N <= 0 || T <= 0)
        throw new IllegalArgumentException();
    else {
        this.N = N;
        this.T = T;
        count = new int [T];
        totalSum = N*N;
        fraction = new double[T];


    int randomX, randomY;
    for (int i = 0; i < T; i++) {
    Percolation perc = new Percolation(N);
    while (true) {
        if (perc.percolates()) {
            fraction[i] = (double) count[i]/totalSum;
            break;
        }
        randomX = StdRandom.uniform(1, N+1);
        randomY = StdRandom.uniform(1, N+1);
        if (perc.isOpen(randomX, randomY)) continue;
        else {
             perc.open(randomX, randomY);
             count[i]++;
        }
    }
    }
    }
} // perform T independent experiments on an N-by-N grid
public double mean() {
    double totalFraction = 0;
    for (int i = 0; i < T; i++) {
        totalFraction += fraction[i];
    }
    return totalFraction/T;
} // sample mean of percolation threshold
public double stddev() {
    double u = this.mean();
    double sum = 0;
    for (int i = 0; i < T; i++) {
        sum += (fraction[i] - u) * (fraction[i] - u);
    }
    return Math.sqrt(sum/(T-1));
} // sample standard deviation of percolation threshold
public double confidenceLo() {
    double u = this.mean();
    double theta = this.stddev();
    double sqrtT = Math.sqrt(T);
    return u-1.96*theta/sqrtT;
} // low  endpoint of 95% confidence interval
public double confidenceHi() {
    double u = this.mean();
    double theta = this.stddev();
    double sqrtT = Math.sqrt(T);
    return u+1.96*theta/sqrtT;
} // high endpoint of 95% confidence interval

   public static void main(String[] args) {
   int N = 200;
   int T = 100;
   if (args.length == 1) N = Integer.parseInt(args[0]);
   else if (args.length == 2) {
       N = Integer.parseInt(args[0]);
       T = Integer.parseInt(args[1]); }

   PercolationStats a = new PercolationStats(N, T);
   System.out.print("mean                    = ");
   System.out.println(a.mean());
   System.out.print("stddev                  = ");
   System.out.println(a.stddev());
   System.out.print("95% confidence interval = ");
   System.out.print(a.confidenceLo()); 
   System.out.print(", ");
   System.out.println(a.confidenceHi());

} }

public class Percolation {
private boolean[][] site;
private WeightedQuickUnionUF uf;
private int N;

public Percolation(int N) {
    if (N < 1)
        throw new IllegalArgumentException();
    else {
        site = new boolean[N + 2][N + 2];
        for (int j = 1; j <= N; j++) {
            site[0][j] = true;
            site[N + 1][j] = true;
        }
        uf = new WeightedQuickUnionUF((N + 2) * (N + 2));
        for (int i = 1; i <= N; i++) {
            uf.union(0, i);
        }
        this.N = N;
    }
}

public void open(int i, int j) {
    if (i > N || i < 1 || j > N || j < 1)
        throw new IndexOutOfBoundsException();
    else {
        if (!site[i][j]) {
            site[i][j] = true;
            if (site[i - 1][j]) {
                uf.union((N + 2) * (i - 1) + j, (N + 2) * i + j);
            }
            if (site[i + 1][j]) {
                uf.union((N + 2) * i + j, (N + 2) * (i + 1) + j);
            }
            if (site[i][j + 1]) {
                uf.union((N + 2) * i + (j + 1), (N + 2) * i + j);
            }
            if (site[i][j - 1]) {
                uf.union((N + 2) * i + (j - 1), (N + 2) * i + j);
            }
        }
    }
}

public boolean isOpen(int i, int j) {
    if (i > N || i < 1 || j > N || j < 1)
        throw new IndexOutOfBoundsException();
    else
        return site[i][j];
}

public boolean isFull(int i, int j) {
    if (i > N || i < 1 || j > N || j < 1)
        throw new IndexOutOfBoundsException();
    else
        return site[i][j] && (i == 1 || uf.connected((N + 2) * i + j, 0));
}

public boolean percolates() {
    for (int i = 1; i <= N; i++) {
        if (this.isFull(N, i)) {
            return true;
        }
    }
    return false;
}

public static void main(String[] args) {

}

}

1 个答案:

答案 0 :(得分:0)

添加了meanValue实例变量以保持平均值,并将其替换为您曾经调用过的mean()方法的多个地方,这些方法一次又一次地计算。同样修改了&#34; int [] count&#34;作为您在构造函数外部未使用的局部变量。发布你的&#34; Percolation&#34;和&#34; StdRandom&#34;用于更多代码优化的类。您可以运行此代码并进行测试,它应该减少运行时间而不是您的。

public class PercolationStats {

private int N, T, totalSum;
private double []fraction;
private double meanValue;

public PercolationStats(int N, int T) {



    if (N <= 0 || T <= 0)
        throw new IllegalArgumentException();
    else {
        this.N = N;
        this.T = T;
        int [] count = new int [T];
        totalSum = N*N;
        fraction = new double[T];


    int randomX, randomY;
    for (int i = 0; i < T; i++) {
    Percolation perc = new Percolation(N);
    while (true) {
        if (perc.percolates()) {
            fraction[i] = (double) count[i]/totalSum;
            break;
        }
        randomX = StdRandom.uniform(1, N+1);
        randomY = StdRandom.uniform(1, N+1);
        if (perc.isOpen(randomX, randomY)) continue;
        else {
             perc.open(randomX, randomY);
             count[i]++;
        }
    }
    }
    }
}
// perform T independent experiments on an N-by-N grid
public double mean() {
    double totalFraction = 0;
    for (int i = 0; i < T; i++) {
        totalFraction += fraction[i];
    }
    meanValue = totalFraction/T;
    return meanValue;
} // sample mean of percolation threshold
public double stddev() {
    double u = meanValue;
    double sum = 0;
    for (int i = 0; i < T; i++) {
        sum += (fraction[i] - u) * (fraction[i] - u);
    }
    return Math.sqrt(sum/(T-1));
} // sample standard deviation of percolation threshold
public double confidenceLo() {
    double u = meanValue;
    double theta = this.stddev();
    double sqrtT = Math.sqrt(T);
    return u-1.96*theta/sqrtT;
} // low  endpoint of 95% confidence interval
public double confidenceHi() {
    double u = meanValue;
    double theta = this.stddev();
    double sqrtT = Math.sqrt(T);
    return u+1.96*theta/sqrtT;
} // high endpoint of 95% confidence interval

   public static void main(String[] args) {
   int N = 200;
   int T = 100;
   if (args.length == 1) N = Integer.parseInt(args[0]);
   else if (args.length == 2) {
       N = Integer.parseInt(args[0]);
       T = Integer.parseInt(args[1]); }

   PercolationStats a = new PercolationStats(N, T);
   System.out.print("mean                    = ");
   System.out.println(a.mean());
   System.out.print("stddev                  = ");
   System.out.println(a.stddev());
   System.out.print("95% confidence interval = ");
   System.out.print(a.confidenceLo()); 
   System.out.print(", ");
   System.out.println(a.confidenceHi());
   }
}