2

我已经为同一个问题实现了两种算法,并想找出哪种算法是最好的专业方法。

基本思想是:

final static int LOOP_COUNT = 500;
long totaTime = 0;

worm-up();
for(int i =0, i<LOOP_COUNT, i++)
{
    long startTime = System.currentTimeMillis();
    myMethod();
    long endTime= System.currentTimeMillis();
    totalTime += endTime - startTime;
 }

 return totalTime / LOOP_COUNT;

并对这两种算法都这样做。

但:

  • 我怎样才能实现,android系统不会在后台进行任何系统计算并歪曲数据

  • 有没有办法我也可以比较使用的内存,两种方法都需要吗?

4

2 回答 2

1

如果您想要专业的统计和相关结果,并且想要最小化 Android 后台进程的影响,您将需要多次运行您的算法并比较平均值。这样,由于大数定律,您的结果将是正确的。

多少次取决于执行时间的标准偏差以及您想要的确定程度。如果您熟悉一些基本的统计知识,您可以使用一些基本公式确定您的样本量,例如,如果您的样本分布是正态分布的,您可以运行 t 检验来比较两种算法的平均值。这会自动包含您希望最小化后台进程的影响的事实。它们会随机出现,因此经过多次迭代,Android的影响将被抵消。

还要看看垃圾收集器,如果你在算法执行过程中创建了很多对象,它会影响你的结果,但它应该会影响算法的实际使用。

于 2012-10-30T18:16:33.923 回答
0

您可以尝试分析您的代码并找出时间复杂度。如果你有一个嵌套循环:

for(int i = 0; i< max; i++){
  for(int j = 0; j< max; j++){
      c = i + j;
   }
 }

这将具有时间复杂度 O(n^2)。空间复杂度为 O(1)

另一个例子是这样的:

for(int i = 0; i< max; i++){
   list[i] = "hello";
}

for(int j = 0; j< max; j++){
   list2[j] = "hello";
}

这将具有与 O(n) 相同的 O(2n) 的时间复杂度和 O(2n) 的 O(n) 的空间复杂度。

后者有更好的运行时间,但使用更多的内存。

于 2012-10-30T18:19:56.233 回答