C 寻找递归关系和复杂性

C 寻找递归关系和复杂性,c,complexity-theory,recurrence,C,Complexity Theory,Recurrence,根据运算次数,找出递归关系 a = N; var = 0; while (a > 1) { var = var + a; num = 2 * var; a = a / 2; } 我认为将形成的递归关系是:(不计算赋值操作) 我说的对吗 现在使用这个递归关系,如何找到它的复杂性。< /P> < P>你要做的是找到这个操作被调用的次数,所以考虑一下:在每次调用A被除以2之后,如果m= n/t,则t(m)=t(n)-1。< /p> 现在,该循环的每次迭代都会再次除以N,因此得到以下结果:

根据运算次数,找出递归关系

a = N;
var = 0;
while (a > 1) 
{
var = var + a; 
num = 2 * var; 
a = a / 2;
}
我认为将形成的递归关系是:(不计算赋值操作)

我说的对吗


现在使用这个递归关系,如何找到它的复杂性。< /P> < P>你要做的是找到这个操作被调用的次数,所以考虑一下:在每次调用A被除以2之后,如果m= n/t,则t(m)=t(n)-1。< /p> 现在,该循环的每次迭代都会再次除以N,因此得到以下结果:

T(N) = T(N/2) + 1 = ... = k + T(N/(2^k))
停止条件如下:
a>1
,因此需要在
N/(2^k)经验方法时检查:

首先,通过简化代码并添加迭代计数器(c),减少代码中的“教育噪音”。然后看结果(N,count),过一会儿你会看到,对于[1,2,4,8,16,…]中的所有N,2^count=N

所以复杂度Compl(loop)=O(log_2(N))

数据:

[(1,0,0);(2,1,1);(3,1,1);(4,2,2);(5,2,2);(6,2,2);(7,2,2); (8, 3, 3); (9, 3, 3); (10, 3, 3); (11, 3, 3); (12, 3, 3); (13, 3, 3); (14, 3, 3); (15, 3, 3); (16, 4, 4); (17, 4, 4); (18, 4, 4); (19, 4, 4); (20, 4, 4); (21, 4, 4); (22, 4, 4); (23, 4, 4); (24, 4, 4); (25, 4, 4); (26, 4, 4); (27, 4, 4); (28, 4, 4); (29, 4, 4); (30, 4, 4); (31, 4, 4); (32, 5, 5); (33, 5, 5); (34, 5, 5); (35, 5, 5); (36, 5, 5); (37, 5, 5); (38, 5, 5); (39, 5, 5); (40, 5, 5); (41, 5, 5); (42, 5, 5); (43, 5, 5); (44, 5, 5); (45, 5, 5); (46, 5, 5); (47, 5, 5); (48, 5, 5); (49, 5, 5); (50, 5, 5); (51, 5, 5); (52, 5, 5); (53, 5, 5); (54, 5, 5); (55, 5, 5); (56, 5, 5); (57, 5, 5); (58, 5, 5); (59, 5, 5); (60, 5, 5); (61, 5, 5); (62,5,5);(63,5,5);(64,6,6)]


递推关系为:

T(1) = a
T(n) = b + T(n/2)
第一部分来自循环变量等于1的情况,在这种情况下,只执行循环顶部的比较。第二行来自循环体b中完成的恒定工作量,加上使用更新的循环变量值执行循环的时间

前几个术语是:

n   T
1   a
2   a + b
4   a + 2b
8   a + 3b
基于此,我们可以猜测一般形式:

T(n) = a + b log n
证明这只是一个练习;但您可以将其插入到递归关系中,以查看它是否满足要求


渐近复杂性是对数的。

。。。其中log x:=log_2 x(如在base 2 log中)为什么不能(n)=a+b log n,Patrick87的解释似乎也正确??基本相同。我使用“大O”,所以常数“a”和“b”不相关。当将“a+blog(n)”转换为“big O”时,你省略了常数O(n)=O(cn),因此a+b*log(n)=O(log(n))@KatherineKewl是的,Clsforcoockies和我得到了相同的答案。这是我看到的第一个答案。真有趣。您使用了什么?使用了F#-但在OCAML中也应该非常相似。您如何判断哪个值是该嗯…语句、表达式的预期输出?@BitTickler什么语句、表达式?
T(1) = a
T(n) = b + T(n/2)
n   T
1   a
2   a + b
4   a + 2b
8   a + 3b
T(n) = a + b log n