Big o 如何找到算法的时间复杂度公式

Big o 如何找到算法的时间复杂度公式,big-o,complexity-theory,time-complexity,Big O,Complexity Theory,Time Complexity,为了找到时间复杂度,我为n设置了一个值,但一旦我迭代了该算法,就无法确定它是什么。任何关于如何为它找到正式答案的建议,这样我就可以确定什么是大O for (int i = 0; i < 2*n; i++){ X X } for (int i = n; i > 0; i--) { X } for(int i=0;i0;i--){ X } X只是算法中的操作 我将n设置为2,每次循环n加倍时,它都会快速增加。看起来可能是2^n因为i在第一个循环中每次增加1,n在循环中

为了找到时间复杂度,我为
n
设置了一个值,但一旦我迭代了该算法,就无法确定它是什么。任何关于如何为它找到正式答案的建议,这样我就可以确定什么是大O

for (int i = 0; i < 2*n; i++){
  X
  X 
}
 for (int i = n; i > 0; i--) {
  X
}
for(int i=0;i<2*n;i++){
X
X
}
对于(int i=n;i>0;i--){
X
}
X
只是算法中的操作


我将
n
设置为2,每次循环
n
加倍时,它都会快速增加。看起来可能是
2^n

因为
i
在第一个循环中每次增加1,
n
在循环中每次增加一倍,你认为循环会终止吗?(当
2*n
溢出时,它可能会终止,但如果您在一个环境中运行,例如,当数字超过原语
int
的大小时,程序会自动切换到大整数包,那么当系统内存不足时,程序可能会崩溃。)

但假设这不是正在发生的事情,
n
是常数。您没有说
X
的执行时间是否取决于
i
的值,但我们可以说它不取决于
i
的值

实现这一点的方法是回答以下问题:由于
i
在第一个循环中每次增加1,因此需要多少次迭代才能达到循环终止条件(对于
i
至少
2*n
)?当然,答案是O(n)次迭代。(常数系数与O()计算无关。)

根据同样的推理,第二个循环需要O(n)次迭代


因此,整个程序需要O(n+n)=O(n)次迭代(以及O(n)次执行
X
)。

您的时间复杂度应该是O(n)。我假设在提供X的地方没有任何其他循环。您使用的是一个n*2,它只是此算法的n的两倍,您的时间复杂度将线性增加


例如,如果您使用floyds算法,其中包括3个嵌套的for循环,您可以得出结论,floyd的时间复杂度为O(n^3),其中n是元素数,3由3个嵌套的for循环表示。

您可以按照以下步骤进行操作:


请注意,您可以通过避免每次将
n
乘以
2
来改进算法(第一个循环)

在两个循环中
int i
是相同的变量吗?在第一个循环中
n
真的每次都加倍吗?
X
是否修改了
i
以及
n
?在选择n的值时,选择大的还是小的数字更好?@jmurphy-我不理解这个问题。对于复杂性计算,您并不是“为
n
选择一个值”,而是试图确定执行时间对
n
的依赖关系的函数形式(或者,如果
n
不是正确的度量,则确定“问题大小”的其他度量)。我看到它在增加,但我怎么知道它是线性增加而不是指数增加呢?你要么对这个问题进行实验分析,要么对此进行纯理论分析。对于实验分析,您需要实现算法并使用各种大小的数据(n?)运行程序。在C语言中,您可以使用时间(给CPU提供相当精确的时间)将数据绘制成图形。从图表中,您可以为计算机上的算法绘制相当精确的时间复杂度。请看,从幻灯片8开始。此测试对您很有用:www.combineditorix.com