运行时间和记忆

时间:2011-05-14 15:43:53

标签: memory big-o

如果你看不到函数的代码,但知道它需要参数。是否有可能找到运行时间的速度和内存。如果是这样你会怎么做在这种情况下有没有办法使用Big O?

6 个答案:

答案 0 :(得分:3)

不,仅通过查看其参数就无法找到函数的内存或性能。例如,相同的功能

void DoSomething(int x, int y, int z);

可以实现为O(1)时间和内存:

void DoSomething(int x, int y, int z) { }

或作为一个非常非常昂贵的函数,取O(x * y * z):

void DoSomething(int x, int y, int z)
{
  int a = 0;
  for (int i = 0; i < x; i++) {
    for (int j = 0; j < y; j++) {
      for (int k = 0; k < z; k++) {
        a++;
      }
    }
  }
  Console.WriteLine(a);
}

还有很多其他可能性。所以,找不到这个功能的价格是不可能的。

答案 1 :(得分:2)

我是否可以运行该功能?多次?

我将使用一系列参数值执行该函数,并测量运行时间和(如果可能)每次运行的内存消耗。然后,假设函数采用n参数,我会在n+1 - 维图上绘制每个数据点并从那里查找趋势。

答案 2 :(得分:1)

你能用代码运行这个函数吗?像这样的东西:

start = clock();
//call the function;
end = clock();
time = end-start;

答案 3 :(得分:1)

首先,这是一个面试问题,所以你最好不要说不。


如果我在采访中,这是我的方法。

我可能会问面试官一些问题,因为面试是互动的。

因为我看不到代码,所以我想我至少可以多次运行它。这将是我的第一个问题:我可以运行它吗? (如果我不能运行它,那么我可以完全没有用它,我放弃了。)

用于什么功能?如果函数写得很清楚,这可能会暗示复杂性。

论证的类型是什么?有些是原始类型吗?尝试一下它们的组合。其中一些是“复杂的”(例如容器)?尝试一些不同大小的组合。它们中的一些是否相关(例如一个用于容器,一个用于容器的大小)?可以保存一些测试运行。此外,我希望论证的法律范围,所以我不会在非法猜测上浪费时间。最后,测试一些边缘情况可能有所帮助。

答案 4 :(得分:1)

作为一个面试问题,你不应该回答“不能做不到”。

您需要的是运行代码的能力。一旦运行代码,使用不同的参数调用相同的函数并测量所需的内存和时间。然后,您可以绘制这些数据并获得良好的估计值。

对于big-O类型的表示法,您可以按照相同的方法绘制结果WRT数据集大小。然后尝试使用最小二乘拟合将此曲线与已知的复杂性曲线拟合,如n,n ^ 2,n ^ 3,n * log(n),(n ^ 2)* log(n)等。

最后,请记住,所有这些方法都只是近似值。

答案 5 :(得分:0)

不,你不能,这会解决Halting Problem,因为代码可能无休止地运行O(无穷大)。因此,解决这个问题也解决了惠普,这当然被证明是不可能的。