我在Java中有一些代码,平均每次插入10尝试。它分类相同的数组,但最多100个单词,200个单词等,直到整个数组的完整lenght。下面的代码分别用于100个和200个单词,但随着变量的更改,所有代码看起来都一样。
但是,下一个平均时间似乎都会变短。例如。9658233ns用于100个单词,4273459ns,用于200个单词,300个单词的3716726ns,400个单词的2965091NS和2842528NS,用于459个单词。但是,如果我的顺序倒数,首先对整个数组进行排序,最后一个100个单词的数组,则花费最长的时间来分类完整的数组和最短的时间来通过100个单词的数组进行排序。
是否会使用其他方式计时插入排序会导致我取得更一致的结果?
long i1AverageTime = 0L;
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
insertionSort(myArray, 100);
long end = System.nanoTime();
long timeTaken = end - start;
i1AverageTime += timeTaken;
}
i1AverageTime /= 10;
long i2AverageTime = 0L;
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
insertionSort(myArray, 200);
long end = System.nanoTime();
long timeTaken = end - start;
i2AverageTime += timeTaken;
}
i2AverageTime /= 10;
使用定时方法进行算法分析确实是一种判断算法性能的困难方法,尤其是在笔记本电脑或机器上用于个人或学校使用。
有很多原因您可能会得到不稳定的时间:
- 您的计算机的处理速度可能会在您运行的每一秒钟都在更改。诸如Web浏览器,防病毒软件和其他背景过程之类的事情正在影响您拥有的处理能力,从而影响您运行算法的能力。
- 对于内存也是如此。您的RAM使用情况和内存可用性正在不断变化,并且非常动荡,因此使用它来衡量性能不是一个安全的指标。
测量算法性能的一种更准确的方法是分析算法的运行时复杂性,以相对于其已知复杂性(通常为O(n)
或O(n^2)
(。