使用三次索引计算 for 循环的波浪线复杂度

Calculating tilde-complexity of for-loop with cubic index

假设我有以下算法:

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

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

我认为没有必要计算确切的复杂度,我们可以忽略常量,然后得到波浪线复杂度。

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

~ log N 

但是这里没有二进制对数函数,底数是 3。 这对确切的符号重要吗?增长顺序是否完全相同,因此我们可以在使用波浪符号时忽略基数吗?我的做法正确吗?

你是对的,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循环的时间复杂度。 "total" 时间复杂度因此是 C * T(N),因为每次 T(N) 迭代的成本是 C,在波浪符号中我们可以写成 S(N) ~ C * ceil*(log_3 N)