使用三次索引计算 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)
。
假设我有以下算法:
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)
。