常数阶 O(1)
无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是 O(1),如:
int i = 1;
int j = 2;
int k = 1 + 2;
上述代码执行时,单个语句的频度均为 1,不会随着问题规模 n 的变化而变化。因此,算法时间复杂度为常数阶,记作 T(n)=O(1)。这里我们需要注意的是,即便上述代码有成千上万行,只要执行算法的时间不会随着问题规模 n 的增长而增长,那么执行时间只不过是一个比较大的常数而已。此类算法的时间复杂度均为 O(1)。
对数阶 O(log n)
先来看对应的示例代码:
int i = 1; // ①
while (i <= n) {
i = i * 2; // ②
}
在上述代码中,语句①的频度为 1,可以忽略不计。
语句②我们可以看到它是以 2 的倍数来逼近 n,每次都乘以 2。如果用公式表示就是 1_2_2*2…*2 <=n,也就是说 2 的 x 次方小于等于 n 时会执行循环体,记作 2^x <= n,于是得出 x<=logn。也就是说上述循环在执行 logn 次之后,便结束了,因此上述代码的时间复杂度为 O(log n)。
其实上面代码的时间复杂度公式如果精确的来讲应该是:T(n) = 1 + O(log n),但我们上面已经讲到对应的原则,“只保留时间函数中的最高阶项”,因此记作 O(log n)。