Big o 对嵌套循环的时间复杂性感到困惑并寻找提示
假设我有两个代码: 代码A: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
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
,在这种情况下,内环的条件为becomestrue
也是如此。因此,内部循环将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)