这个算法的时间复杂度有两个for循环

时间:2014-02-01 20:19:06

标签: algorithm time-complexity nested-loops binary-search logarithm

你能解释一下如何找到时间复杂度吗

sum1=0;
for(k=1;k<=n;k*=2)
  for(j=1;j<n;j++)
     sum++

我正在考虑将N作为基础,并尝试计算

时发生的迭代次数
n=1,2,3...n

但我无法将其全局化。 有些人彻底解释了我。 我甚至检查过类似类型的其他查询: 说它跟着

1,2,4,8...n so it will be
2^n
nlogn

但我明白了。 我不知道他们怎么说2^n=logn。 请任何正确解释如何逐步计算..

谢谢:)

4 个答案:

答案 0 :(得分:1)

为了获得两个循环的完整复杂性,您需要将外循环乘以内循环的复杂性。这是通过考虑当n变得非常大时发生的事情来完成的(技术上,因为n倾向于无穷大)。总和,或者循环变量总共要执行多少次操作?

在这种情况下,外循环执行log(n)次,因为k呈指数增长。指数因为k在外循环的每次迭代中加倍,所以这意味着它增长为2 ^ k,直到2 ^ k到达n。关于如何将循环变量相乘的注释。根据你在评论中提出的问题,如果你将k乘以3,你仍然会得到log(n),但它将使用base-3进行记录,而不是使用base-2进行记录。渐近地,日志的基础是不相关的,所以你可以简单地说它是log(n),忽略了基数。因此,第一个循环具有O(log(n))复杂度。内部循环仍然是线性的(运行n次),所以如果你乘以那些,你会得到O(n*log(n))复杂度。

总结:O(nlogn)

答案 1 :(得分:1)

k以指数方式增长,因此O(log n)时间到达n。检查logarithm的定义。那是你的外循环。

内部循环是一个简单的O(n)

答案 2 :(得分:0)

因为内循环是

for(j=1;j<n;j++)

对于外循环的每次迭代,内循环将执行n次。您只需知道外循环执行的次数,并将这两个值相乘。

k将采用以下值

2^0, 2^1, 2^2, ...., 2^i where 2^i < n

取不等式两边的对数(基数2)

     2^i < n
log(2^i) < log(n)
i*log(2) < log(n)
       i < log(n)

外部循环将完全执行i + 1次,因此复杂度将为O(i * n),但是从上面开始,i&lt; log(n),因此复杂度将为O(nlogn)

相反,如果内循环是

for(j=1;j<k;j++)

然后内循环将执行

2^0 + 2^1 + ... + 2^i 

请注意这是一个序列而不是序列。事实上,这是众所周知的geometric series。这个系列的总和由

给出
a(1 - r^(i + 1))/(1 - r) 

其中a = 1,r = 2,如果你在log(n)中替换i(它是以前分析中的log(n)),你得到

2^(log(n) + 1) - 1

2*n - 1

答案 3 :(得分:0)

鉴于你的问题结构:

sum1=0;
for(k=1;k<=n;k*=2)  // <-- Takes 1+1/2+1/2^2+1/2^3...+1/2^n = O(log(n)) time
   for(j=1;j<n;j++)  // <-- Takes 1+2+3+...+n = O(n) time
      sum++

外部循环将k的值增加k*2,因此您每次基本上 半个 搜索空间:

k = 1*2 = 2 => 1/2^1 time
k = 2*2 = 4 => above + 1/2^2 time
k = 4*2 = 8 => above + 1/2^3 time
k = 8*2 = 16 => above + 1/2^4 time
.   .     .
.   .     .
.   .     .
k = n*2 = 2^n => above + 1/2^n time

换句话说,你每次都丢弃了一半的元素。话虽如此,您实际上是在

中搜索大小为n的数组
1+(1/2)+(1/2^2)+(1/2^3)+...+(1/2^n) time = log(n) time

log(n)是如何来的?

使用二叉树进行类比,其中在每个节点处我们分支到两个节点,这些节点可以显示为递归关系:

T(n) = 2T(n/2)

当搜索空间减少2时,当我们从根目录越来越远时,当搜索空间等于1时,我们必须达到 边界条件 。深度为k的搜索空间大小为n/2^k (类似于我们上面所见)

在等于搜索空间时,我们的等式变为:

n/2^k = 1
=> n = 2^k

Taking log on both sides:
=> log n = k log 2
=> log n/ log 2 = k

Rearranging:
k = log n base 2.

所以在叶子节点,我们将遍历的二叉树的高度将是log(n)base 2. 在我们的例子中,我们将搜索空间挖到两个并遍历我们的搜索空间两个在log(n)时间内到达结束元素。

两个循环的总时间复杂度将按n * log n = O(nlog(n)) 的顺序排列。