Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Algorithm 如何找到算法的运算时间?_Algorithm_Performance_Time Complexity_Big O - Fatal编程技术网

Algorithm 如何找到算法的运算时间?

Algorithm 如何找到算法的运算时间?,algorithm,performance,time-complexity,big-o,Algorithm,Performance,Time Complexity,Big O,我正在学习如何找到算法的运算时间,但在这张图片中我不明白1+2n+2(n-1)是什么意思。 这些方程是从哪里来的 因此,写这些幻灯片的人基本上认为尝试更“准确”是一个好主意,尽管它们并不准确(尝试可能是个坏主意) 第1行 (i=0;i

我正在学习如何找到算法的运算时间,但在这张图片中我不明白1+2n+2(n-1)是什么意思。 这些方程是从哪里来的


因此,写这些幻灯片的人基本上认为尝试更“准确”是一个好主意,尽管它们并不准确(尝试可能是个坏主意)

第1行 (i=0;i
i=0
只执行一次(我们不会一直初始化
i
)。因此,这算作:

一,

i
在循环开始之前、每次迭代之间以及最后一次迭代之后执行(这就是它知道如何退出的原因)。因此,这算作:

迭代次数+1
=num_元素{0,…,n-2}+1
=(n-1)+1
=n

i++
在每次迭代后执行(这次不是在第一次迭代期间)。因此,这算作:

迭代次数 =n-1

全部结束:

(1) +(n)+(n-1)

现在,这与你演讲幻灯片上的内容不同,因为你的讲师已经决定:
i
真的是:
inttmp_max=n-1;i

所以他们认为这实际上是两个操作,即使编译器只会预计算这个值一次(在循环之前)。对于像你这样的学生来说,这也不必要地混淆了事情

他们还必须认为:
i++

真的是
i=i+1

或者,换句话说:
inttmp_i=i+1;i=tmp_i

同样,他们误解了c/c++编译器的工作原理
i++
现在总是等同于
++i
,它不使用任何临时值,因此只在一个时钟周期内发生

困惑?当你学习复杂性理论时,你不应该关心这些东西。单一的加法只占用一个时钟周期,但在大多数现代CPU上,除法大约占5,但我怀疑您的老师希望您考虑一下。当你研究复杂性时,你不应该研究处理器。复杂性理论的全部观点是,你不关心这些乘法常数

我们关心的是
i
0
n
(谁关心
n-1
),这一行的复杂性是:

O(n)

第2行 (j=0;j
在他们决定乘法常数的过程中也有同样糟糕的推理,这次你的老师认为每个
j
都是3个运算

至于内部部分,这是有道理的,只是作者没有把问题分开

我们应该首先计算这一行的复杂度,就好像
i
是一个常数:

1+(n-i)+(n-i) =O(n-i)

稍后请记住,
j
值将从
0
变为
n-i

剩余线路 这些是恒定的时间。无论
n
i
j
的值是多少,程序要么只能执行
if
语句,要么可以执行全部4行

O(1)

总而言之: 外环,i={0,…,n},O(n)
内环,j={0,…,n-i},O(n-i)
内循环,O(1)

让我们去掉模块性,认识到
i
不是常数:

两个循环的复杂性=O(n-0)+O(n-1)+…+O(0)
=O(1+2+3…+n)
=O(n(n+1)/2)
=O(n^2)

我猜你已经知道:

1+2+3…+n

那么,内部循环执行了多少次?与第二个循环的迭代次数相同-由于其内容的复杂性与循环的复杂性无关,我们可以将其乘以:

总体复杂性=O(n^2)*O(1)
=O(n^2)



我希望我对计算的解释能有所帮助。它对于更大的示例非常有用,尤其是真正的代码库。大多数情况下,模块化组件之间没有依赖关系,因此您可以直接添加或乘以组件-希望我已经证明,即使您有依赖关系,模块化仍然很有用。

您需要查看一些社区不清楚的早期内容。@Shridharkulkarni,我确信幻灯片中有足够的信息@elliott循环
1+2n+2(n-1)
的第一个是什么?也许我会重读答案,但我没有从第一眼看到答案。@Shridharkulkarni基本上作者一定犯了错误。我在“第1行:部分=)@Elliott One需要等待OP为帖子带来清晰的内容。如果我们假设了一些东西并给出了答案,那么答案可能需要稍后更新。在这种情况下,OP发布的帖子对社区和试图回答的人的答案都没有用处。