如果你看不到函数的代码,但知道它需要参数。是否有可能找到运行时间的速度和内存。如果是这样你会怎么做在这种情况下有没有办法使用Big O?
答案 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(无穷大)。因此,解决这个问题也解决了惠普,这当然被证明是不可能的。