Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 运行时间和内存_Memory_Big O - Fatal编程技术网

Memory 运行时间和内存

Memory 运行时间和内存,memory,big-o,Memory,Big O,如果您看不到函数的代码,但知道它包含参数。是否有可能找到运行时间、速度和内存。如果是这样,你会怎么做。在这种情况下,有没有办法使用大O?没有,仅仅通过查看函数的参数是不可能找到函数的内存或性能的。例如,相同的函数 void DoSomething(int x, int y, int z); 可实现为O(1)时间和内存: void DoSomething(int x, int y, int z) { } 或者作为一个非常非常昂贵的函数,取O(x*y*z): void DoSomething(i

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

没有,仅仅通过查看函数的参数是不可能找到函数的内存或性能的。例如,相同的函数

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;
对于(int i=0;i

还有很多其他的可能性。因此,不可能发现函数有多昂贵。

您能用代码运行函数吗?大概是这样的:

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

我可以运行这个函数吗?多次


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

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

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


如果我在面试中,以下是我的方法

我可以问面试官几个问题,因为面试是互动的

因为我看不到代码,我想我至少可以运行它,希望可以多次。这将是我的第一个问题:我可以运行它吗?(如果我不能运行它,那么我就什么也做不了,我就放弃了。)

该函数用于什么?如果函数写得合理,这可能会暗示其复杂性


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

作为一个面试问题,你永远不应该回答“不,这不可能”

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

对于big-O型符号,也可以采用相同的方法,根据数据集大小绘制结果。然后尝试用已知的复杂度曲线拟合这条曲线,如n,n^2,n^3,n*log(n),(n^2)*log(n)等,使用最小二乘拟合


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

只有在无法运行函数或只能运行少量次的情况下才是不可能的。有趣的是,这就是我的想法。这是一个面试问题,我想这是一个技巧性的问题,即使你能多次运行它也是不可能的。例如,想象一个函数将根据外部源(文件、随机数、当前温度等)采取不同的操作。如果你知道一个函数的算法,你只能确定它的算法复杂度:-)这是有意义的,但不是最科学的方法。这个解决方案如何处理O(无穷大)问题?(提示:它没有)此解决方案如何处理O(无穷大)问题?(提示:没有)@Dante:关键是看你是否可以减少HP问题,这被称为无法解决的问题(详见我的答案)。@amit,我们看不到代码。因此,我们必须作出一些猜测。如果它不能在阈值时间内完成,我只把它看作是O(无穷大)。顺便说一句,我的回答中已经包括了这一点(如果面试官告诉我一些关于惠普的事情,因为这是互动式的)。“该函数用于什么?”@Dante:定义“阈值时间”。你怎么判断它是O(无穷大)还是O(100^n^n)?@amit,听起来像是一个严厉的面试官?我会说:根据我到目前为止的知识,(我可能已经知道函数的用途,以及机器运行它的方式),我会决定一个阈值。例如,该函数用于查找第1000个斐波那契(将一个参数设为1000),我想在主流计算机中不会花费超过1分钟的时间。如果它在1分钟后继续运行,我(至少)会说函数有问题。@Dante:有时他们会问问题,但没有解决方案,有人问我的朋友:“你怎么能在未排序的列表中找到比O(n)更复杂的元素?”这是不可能的。“不可能”是正确的答案。我想听听投票否决我的人的评论,这样我就能从错误中吸取教训。我没有投票否决你,但你的O(无穷大)例子是不必要的悲观。如果我给你分配了一项任务,估计某个函数的复杂度,你回来说在一般情况下不可能这样做,这样你就不会尝试这个特定的函数,我一点也不高兴。。。。重要的是采取切实可行的方法,试图找到最好的答案。知道这种方法是否是防弹的很好,但可能不会比在基准测试运行完成之前计算机可能被闪电击中更有趣……如果你能运行它,有很多选择。使用callgrind运行它并查看行为。传递各种不同的参数,并查看函数行为是否发生更改。你看不到里面的代码,你只是在改变外部环境。@Jack:虽然我被否决了,但看看我的答案,为什么这种方法不能解决问题(因此
start = clock();
//call the function;
end = clock();
time = end-start;