i=1; while(i<=n) i=i*2; 问时间复杂度为多少?为什么答案为O(log(2)n)?

假设n=8,那么第一次循环后,i=2,第二次循环i=4,第三次i=8,第四次i=8<=8成立,然后i=16,第五次16>8不成立,循环结束,那么这时候循环进行了4次,那么时间复杂度应该是4,但是log2(8)=3,这是为什么?搞不清楚唉。。。求解释

按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,
k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
1、一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))
分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。
2、在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级(它的同数量级有以下:1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n) = 该数量级,若 T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n))追问

你讲的太深奥,看不懂,能否用你的方法解答一下这个题目,而且你这样说我的疑问也没有解除呀。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-03-10
在这个程序中,假设要运行y次,则i=i*2^y,由于i≤n,所以i*2^y≤n,考虑到i作为常数对比2的幂级数可忽略,得出最多运行2^y=n,则y=log2 n的结论。我初学,自己瞎琢磨,勿喷本回答被网友采纳
第2个回答  2019-09-07
时间复杂度为T(n),O(f(n))叫做渐进时间复杂度。
当n趋近于无穷大时,T(n)=O(f(n))。此时O(f(n))也可叫时间复杂度。且lim T(n)/O(f(n))=常数,表示两者的数量级相同。因此本题中,无论f(n)=log2(n)或=log2(n)+1,lim T(n)/O(f(n))都等于常数,也就是说T(n)=O(f(n)),后者可以代表时间复杂度。而答案为了方便简洁而写成log2(n).
第3个回答  2019-01-18
i的值规律:
1,2,4,8,16……
初始i=1(2的0次),所以i的变化实际是2的x次,所以就是求式子2^x=n,x=log(2)n
第4个回答  2014-01-10
假设n=8,那么第一次循环后,i=2,第二次循环i=4,第三次i=8,第四次i=16追问

你这不等于没回答我的问题嘛。。。不是四次循环吗?时间复杂度不应该是4,那为什么答案是3

追答

我的理解是时间复杂度要看有没有操作,看看循环内部计算了几次,你这个循环只执行了3次i=i*2。

追问

我就是想不通为什么执行了3次,第一次执行i=2,第二次执行i=4,第三次执行i=8,然后因为8<=8,不是又要执行一次嘛?第四次i=16,这不是一共是四次吗?唉。。。理解有些困难、、求大神解答清楚点嘛。。。

追答

我的理解是:
首先时间复杂度是在数量级上衡量一个算法的好坏,log2(n),n在数量级上不是一个层次;
其次就你的问题来看,i=16的时候程序并没有执行任何操作,所以这次可以忽略不计算在内;
这是我的理解,仅供参考。

本回答被提问者采纳

分析下列程序段的时间复杂度是___。 i=1: while(i<=n) i=i*2;
【答案】:C 循环体里面是i=i*2,即每循环一次i值增加一倍,所以执行次数与n之间是以2为底的对数关系,故时间复杂度为O(log2n)。

while(i<= n) i= i*2的时间复杂度是多少?
i=1; while(i<=n) i=i*2的时间复杂度O(log2n)。整段代码语句,中循环体只有一个while(i<=n),执行的次数是:i = 1,i = 1*2=2,判断2是否小于等于n,是则继续循环,否则跳出循环。i =2,i = 2*2=4,判断4是否小于等于n,是则继续循环,否则跳出循环。i =4 ,i = 4*...

i=1; while (i<=n) i=i*2 来问下这个这个循环的算法复杂度是多少哈?教...
答案没错。i是这样变化的:1, 2, 4, 8, 16, ...如果用i(x)表示第x次循环时i的值,则 i(x) = 2^x , x初始值为0。循环在 i <= n 的时候停止,即 i(x) = 2 ^ x <= n;=> x<= log2(n)即循环结束时,最多进行了log2(n)次运算。按照大O表示法定义,它的复杂度为 ...

i=1; while (i<=n) i=i*2 时间复杂度
没错,n=4的时候,log2n=2。但是,你有没有注意到,时间复杂度是O(log2n),不是log2n。你不能无视符号"O"。这个符号的意思是:时间复杂度不会比log2n大很多。通俗的说:就是时间复杂度或者和log2n在同一数量级,或者比log2n小。

...O(log{2}n):int i = 1; while(i <= n) i = i * 2;
因为从判断语句上看i从1循环到n,但是循环体中每次循环i都乘以2,所以实际上循环体只执行了log2n次(这是个简单的数学运算吧!),而判断时间复杂度一般都是看循环体的实际有效执行语句的次数,所以该循环的时间复杂度是O(log2n)。

i=1; while(i<=n) i=i*2 这个算法的时间复杂度怎么算
一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f (n),因此,算法的时间复杂度记做:T (n) =0 (f (n) )。随着模块n的增大,算法执行的时间的增长率和f (n)的增长率成正比,所以f (n)越小,算法的时间复杂度越低,算法的效率越高。在计算时间复杂度的时候,先找出算法的...

下面程序段的时间复杂度为___。(n>1)
i=1; while(i<=n) i=i*2的时间复杂度O(log2n)。整段代码语句,中循环体只有一个while(i<=n),执行的次数是:i = 1,i = 1*2=2,判断2是否小于等于n,是则继续循环,否则跳出循环。i =2,i = 2*2=4,判断4是否小于等于n,是则继续循环,否则跳出循环。i =4 ,i = 4*...

程序段“for(i=1; i<=n;) i=i*2;”的时间复杂度?
答案是:O(log2n )i=1; ① while (i<=n)i=i*2; ② 解: 语句1的频度是1,设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n 取最大值f(n)= log2n,T(n)=O(log2n ) ---*来源于百度*--- \/\/\/

...void f(int n) { int i=1; while (i<=n) i=2*i; }
时间复杂度,就是执行次数最多的那个语句次数。这段程序中,执行次数最多的就是 i=2*i;其执行的次数为:2*2*2*2*...*2<=n 假设为x次,则 2^x <=n 2^x =n 可以推出 x = log2n 所以,时间复杂度为 O(log2n)这里的2是log的下标。

for(i=1;i<=n;i=i*2){x++;s=0;} 为什么T(n)=O(log2n)?
因为①语句在for (i=1;i<n;i++) 的循环体中,其循环次数为n-1,所以①的运行次数为n-1。而时间复杂度是取次数算式中的最高次幂的那一项,因此①的时间复杂度为O(n)

相似回答