两个嵌套for循环的时间复杂度

时间:2018-03-06 09:12:16

标签: time time-complexity complexity-theory

如果我走在正确的轨道上,这个问题是为了修改过去的试卷,只需要建议。

根据给定var phoneNumbers = []; var data = { Invite1: { Amount: 25, PhoneNumber: 917995954482 }, Invite2: { Amount: 25, PhoneNumber: 918179405940 }, Invite3: { Amount: 25, PhoneNumber: 918179441493 }, Invite4: { Amount: 25, PhoneNumber: 918309097608 } } for(var k in data){ phoneNumbers.push(data[k].PhoneNumber); } 的操作次数计算出以下代码段的时间复杂度T(n)

integer n

所以我认为外循环是for ( int k = n; k >0; k /= 3 ) { for ( int i = 0; i < n; i += 2 ) { // constant number C of elementary operations } for ( int j = 2; j < n; j = (j*j)) { // constant number C of elementary operations } } ,第一个内循环是O(logn),第二个内循环是O(n)。只是想知道我是否有一个粗略的想法以及如何从这里前进。

1 个答案:

答案 0 :(得分:1)

最近有一个问题在几天前有些类似,我提供了复杂性分析的逐步描述:https://stackoverflow.com/a/49093954/926701

  • 外环确实是O(log3(n))
  • 第一个内环确实是O(n)
  • 第二个内循环是O(log2(log2(n)))

非正式地,对于第二个循环,使用j(k) j循环的索引for所采用的值序列,我们可以写:

j(1) = 2, j(2) = j(1)^2 = 4, j(3) = j(2)^2 = 16, ..., j(k) = j(k-1)^2 >= n 
=> j(k) = j(k-1)^2 = j(k-2)^4 = ... = j(1)^(2^k) = 2^(2^k)
=> k = log2(log2(n))

由于内循环中的操作数与外循环的操作数独立,我们可以将复杂性倍增:

T(n) = O(log3(n) * (n + log2(log2(n))))
     = O(n.log3(n))

因为log2(log2(n)) << nn -> +Inf