Big o 对嵌套循环的时间复杂性感到困惑并寻找提示

Big o 对嵌套循环的时间复杂性感到困惑并寻找提示,big-o,Big O,假设我有两个代码: 代码A: for i = 0; for j = 0; while(i<n){ // O(n) while(j<n){ // O(n) printf("hello"); ..... 表示i=0; 对于j=0; (i让我们在头脑中运行代码B: 假设n相当大,比如至少100。最初我们有i=0,因此外部循环的条件为true,i将由于第5行(i+=1)而增加1).因此,此时我们有i=1,但是在这种情况下,内循环的条件是f

假设我有两个代码:

代码A:

for i = 0;
for j = 0;
while(i<n){       // O(n)
    while(j<n){   // O(n)
       printf("hello");
       .....
表示i=0;
对于j=0;

(i让我们在头脑中运行代码B:

假设
n
相当大,比如至少100。最初我们有
i=0
,因此外部循环的条件为
true
i
将由于第5行(
i+=1
)而增加
1
).因此,此时我们有
i=1
,但是在这种情况下,内循环的条件是
false
,因此我们只需继续到外循环的下一轮

外环和内环的条件分别保持为
true
false
,直到
i
变为
n/2-1
,在此阶段,外环的条件为
true
,因此
i
增加到
n/2
,在这种情况下,内环的条件为becomes
true
也是如此。因此,内部循环将
i
增加到
n

最后,我们得到了
i=n
,循环的条件都是
false
,它不会进一步循环

因此,复杂性如下所示:

i          Work done
------------------------
0          1
1          1
2          1
.          .
.          .
.          .
n/2-2      1
n/2-1      n/2 + 1
因此,所做的全部工作是:

(1 + n/2 - 2) * 1 + 1 * (n/2 + 1) = O(n)

假设你有类似于A的东西,但这两个循环没有嵌套,它们一个接一个地运行。你知道为什么会是O(n)?是的,但这些都是嵌套的。第二个代码应该是嵌套的,不是吗?在B中,循环是嵌套的,但它们的行为好像不是嵌套的;内部循环直到外部循环的最后一次迭代才会运行。这就是为什么B是O(n)。它不像“有嵌套时总是相乘,除了这一种特殊情况”那么简单。一般来说,您必须理解代码的功能,而不仅仅是它的概要。感谢您的明确解释。我认为我的错误在于我没有分析代码,只是试图通过定义来解决jsut。但是,对于任何其他情况,除了此特殊代码,我们都可以成倍正确?请参阅我对您的问题的评论当你能将内环和外环的功相乘时,我已经对你的回答发表了评论,如果你有时间,请阅读。
(1 + n/2 - 2) * 1 + 1 * (n/2 + 1) = O(n)