说我有以下算法:
for(int i = 1; i < N; i *= 3) {
sum++
}
我需要使用波浪符号来计算复杂度,这基本上意味着我必须找到波浪函数,这样当我用这个波浪函数除以算法的复杂度时,无穷大的极限必须是1 。
我认为没有必要计算确切的复杂性,我们可以忽略常数,然后我们有波浪复杂性。
通过观察指数的增长,我假设这个算法是
~ log N
但是,不是使用二进制对数函数,本例中的基数为3。 这对于确切的符号是否重要?增长的顺序是否完全相同,因此在使用Tilde-notation时我们可以忽略基数吗?我能正确接近吗?
答案 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)
。