您的位置:首页 > 其它

一个时间复杂度的问题

2016-10-23 13:10 176 查看

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         对于代码:

                   voidCalcTime() {

                            inti, j;

                            for (i = 1; i < n; i *=3) {

                                     for(j = i/3; j < i; j ++) {

                                               MyFunc();

                                     }

                            }

         }

        

         假定函数MyFunc()的时间复杂度为O(1),则上面代码的时间复杂度关于整数n是多少?

                   O(NlogN)还是O(N)
还是其他?

分析

          如果这样考虑:

                  for (i = 1; i < n; i *=3) 行的时间复杂度是 O(n)

                  for (j = i/3; j < i; j ++) 行的时间复杂度是 O(n)

         的话,那这段代码的时间复杂度就是 O(n2)。

         但真实情况是这样吗?

         先看内层循环:

                  对于给定的i,j从(i/3)累加到i,循环次数为(2/3)i

         再看外层循环:

                  i从1到n遍历,每次变成当前值的3倍,即1,3,9,27…,通项为3k,(k = 0,1,…3k<N)

         所以将内层循环次数按照递增3倍做累加后,得循环总次数:

                  Time = (2/3)*1 + (2/3)*3 + (2/3)*9 + …+ (2/3)*3k

                            = (2/3)*(1 + 3 + 9 + … + 3k)

                            = (2/3)*((1-3k+1)/(1-3)

                            = 3k - (1/3)

                            < N

         所以时间复杂度是 O(N)。

图示分析

         其实用图示更能够清楚的反映这一问题:

 


         上图中,当外层循环的i位于紫色位臵时,内层循环执行的是紫色的①;下次循环,当外层循环的i位于红色位臵 3*i时,内层循环执行的是红色的②,依次类推。所以,循环次数的上限为N。从而,时间复杂度为O(N)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法