用立方索引计算for循环的波浪形复杂度

时间:2016-05-25 10:00:50

标签: for-loop time-complexity complexity-theory tilde

说我有以下算法:

for(int i = 1; i < N; i *= 3) {
   sum++
}

我需要使用波浪符号来计算复杂度,这基本上意味着我必须找到波浪函数,这样当我用这个波浪函数除以算法的复杂度时,无穷大的极限必须是1 。

我认为没有必要计算确切的复杂性,我们可以忽略常数,然后我们有波浪复杂性。

通过观察指数的增长,我假设这个算法是

~ log N 

但是,不是使用二进制对数函数,本例中的基数为3。 这对于确切的符号是否重要?增长的顺序是否完全相同,因此在使用Tilde-notation时我们可以忽略基数吗?我能正确接近吗?

1 个答案:

答案 0 :(得分:1)

你是对的,for循环执行ceil(log_3 N)次,其中log_3 N表示N的基数为3的对数。

不,使用代字符表示法时不能忽略基数。

以下是我们如何推导时间复杂度。 我们假设for循环的每次迭代都花费C,对于某个常量C>0

T(N)表示for循环的执行次数。由于j - 次迭代i的值为3^j,因此我们所做的迭代次数最小j 3^j >= N 。取两边的基数为3的对数,得到j >= log_3 N。因为j是一个整数,j = ceil(log_3 N)。因此T(N) ~ ceil(log_3 N)

S(N)表示for循环的时间复杂度。因此,“总”时间复杂度为C * T(N),因为每个T(N)次迭代的成本为C,我们可以将其写为S(N) ~ C * ceil*(log_3 N)