《算法第四版》p44
Java中对象数组即是一个由对象的引用组成的数组,而非所有对象本身组成的数组。
如果对象非常大,那么在移动它们时由于只需操作引用而非对象本身,就会大大提高效率;如果对象很小,每次获取信息时都需要通过引用反而会降低效率。
import edu.princeton.cs.algs4.Counter;
import edu.princeton.cs.algs4.StdRandom;
public class Flips {
public static void main(String[] args) {
long curr = System.currentTimeMillis();
tollCoin(args);
System.out.println(System.currentTimeMillis() - curr);
curr = System.currentTimeMillis();
rollCoin2(args);
System.out.println(System.currentTimeMillis() - curr);
}
private static void rollCoin2(String[] args) {
int t = Integer.parseInt(args[0]);
int sides = 10;
Counter[] rolls = new Counter[sides];
for (int i = 0; i < sides; i++) {
rolls[i] = new Counter(i + "'s");
}
for (int i = 0; i < t; i++) {
int result = StdRandom.uniform(0, sides);
rolls[result].increment();
}
}
private static void tollCoin(String[] args) {
int t = Integer.parseInt(args[0]);
Counter heads = new Counter("heads");
Counter tails = new Counter("tails");
for (int i = 0; i < t; i++) {
if (StdRandom.bernoulli(0.5))
heads.increment();
else
tails.increment();
}
}
}
模拟抛硬币统计产生结果的例子,执行量级提高会提高两倍左右的速度。
LIGUORUIdeMacBook-Pro-2:bin xxx$ java Flips 5000000
115
60
LIGUORUIdeMacBook-Pro-2:bin xxx$ java Flips 50000000
1097
625