For loop 用三次索引计算for循环的tilde复杂度
假设我有以下算法:For loop 用三次索引计算for循环的tilde复杂度,for-loop,time-complexity,complexity-theory,tilde,For Loop,Time Complexity,Complexity Theory,Tilde,假设我有以下算法: for(int i = 1; i < N; i *= 3) { sum++ } 但在这种情况下,基数不是二元对数函数,而是3。 这与精确的符号有关系吗?增长的顺序是否完全相同,因此我们在使用波浪形符号时可以忽略基数?我的方法正确吗?你是对的,for循环执行ceil(log\u 3n)次,其中log\u 3n表示N的以3为底的对数 不,使用平铺符号时不能忽略底面 下面是我们如何推导时间复杂度的方法。 我们将假设for循环的每次迭代都会花费C,对于某些常量C>0 让
for(int i = 1; i < N; i *= 3) {
sum++
}
但在这种情况下,基数不是二元对数函数,而是3。
这与精确的符号有关系吗?增长的顺序是否完全相同,因此我们在使用波浪形符号时可以忽略基数?我的方法正确吗?你是对的,for循环执行
ceil(log\u 3n)
次,其中log\u 3n
表示N
的以3为底的对数
不,使用平铺符号时不能忽略底面
下面是我们如何推导时间复杂度的方法。
我们将假设for循环的每次迭代都会花费C
,对于某些常量C>0
让T(N)
表示for循环的执行次数。由于在第次迭代时,i
的值是3^j
,因此我们进行的迭代次数是最小的j
,其中3^j>=N
。取两边以3为底的对数,我们得到j>=log\u 3n
。因为j
是一个整数,j=ceil(log\u 3 N)
。因此T(N)~ceil(log_3n)
让
S(N)
表示for循环的时间复杂度。因此,“总”时间复杂度是C*T(N)
,因为T(N)
每次迭代的成本是C
,用波浪线表示法,我们可以将其写成S(N)~C*ceil*(log\u 3n)
没问题。非常清楚地说,您可以将基数更改为b
,但不能忽略它——在右侧有一个额外的系数log\u b3
(例如S(N)~C*ceil(log\u b3*log\u bn)
)。
~ log N