【发布时间】:2017-02-11 00:18:02
【问题描述】:
我对插入排序和测试/实现它的平均情况有疑问。
据我所知,它的意思是 n^2,当我做了大约 1 到 200000 个填充随机数的数组时,我完全明白了。但是现在我做了 20 分并计算平均值以确保我得到一条直线所以 O(n)
但是,当我尝试大小为 100,000、从 100,000 到 1,000,000 的数组时,我得到了一条曲线的二次线
public static void averageCase() {
for (int x = 10000; x <= 30000; x += 1000) {
int[] averageArray = randomArray(x);
float average = 0;
for (int i = 1; i <= 100000; i++) {
float startTime = System.nanoTime();
insertionSort(averageArray, averageArray.length);
float estimateTime = System.nanoTime() - startTime;
average += estimateTime;
}
System.out.println(average/100000);
}
}
public static int[] randomArray(int n) {
Random random = new Random();
int[] randomArray = new int[n];
for (int i = 0; i < randomArray.length; i++) {
randomArray[i] = random.nextInt(1000);
}
return randomArray;
}
结果是:
16504.586
18559.795
20468.203
22083.01
23530.045
25186.795
27179.09
28793.896
30534.533
32149.34
33869.004
35819.355
37539.02
39216.742
40978.35
42551.215
44186.992
46158.316
47584.38
49660.56
51191.48
【问题讨论】:
-
是的,而且? O(n^2) 是指长期行为,对于小的 n,它可能看起来不同。
-
同意 Louis、O、theta 和 omega 时间仅指渐近界。尝试使用更接近无穷大的输入。然后排除所有可能的运行时测试问题,例如缓存等隐藏行为以及使物理计算机与理论计算机不同的任何其他问题。然后您可能会看到符合您期望的结果。
-
我只是在确定/确认说实话,我花了很多时间认为我的实施方法有问题,因为我已经尝试并确认了最好和最坏的情况,但不确定为什么我无法获得适当的测量值。
-
我认为问题不在于 n 不够大,而在于您的代码没有测量您认为它正在测量的内容。看我的回答。
标签: java algorithm performance big-o insertion-sort