你能解释一下如何找到时间复杂度吗
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
。
请任何正确解释如何逐步计算..
谢谢:)
答案 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))
的顺序排列。