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