1. 时间复杂度:
概念: 可以通俗的理解为一段代码被重复执行的次数, 其中可以忽略单行代码的执行, 将重点放在会重复执行的循环代码上.
专业一点说就是算法的执行时间和数据规模之间的增长关系.
对于时间或者空间复杂度都是在数据量较大的情况下, 会出现明显的性能差别, 在平时开发中应该多思考性能优化问题.
时间复杂度为 O(n)
int cal(int n) {
int sum = 0;
int i = 1;
for (; i <= n; ++i) {
sum = sum + i;
}
return sum;
}
解析: 方法中的第2 ,3行代码都是只执行一次, for循环中的代码需要执行 n 次, 当 n 足够大时可以忽略剩余单行代码的常量数值, 所以这里的时间复杂度为 O(n)
时间复杂度为 O(n²)
int cal(int n) {
int ret = 0;
int i = 1;
for (; i < n; ++i) {
ret = ret + f(i);
}
}
int f(int n) {
int sum = 0;
int i = 1;
for (; i < n; ++i) {
sum = sum + i;
}
return sum;
}
解析: call方法的循环中循环n 次调用了 f 方法, f 方法中循环 n 次, 所以当前算法的时间复杂度为O(n²)
时间复杂度为O(logn), O(nlogn)
i=1;
while (i <= n) {
i = i * 2;
}
解析 : 这段代码的最终执行结果为: 2的 x 次方 <= n , 这段代码循环执行的次数为 x, 数学公式上 2的 x 次方=n => log以 2 为底 n 的对数, 数学公式上, 不管是以几为底的对数, 都可以将底提出, 所以将所有对数级的时间复杂度统一记为 O(logn),
对于O(nlogn), 将上面循环再嵌入到一个for 循环中, 时间复杂度就是O(nlogn), 归并排序、快速排序的时间复杂度都是 O(nlogn)。
2. 空间复杂度
概念: 空间复杂度就是数据的存储空间和数据规模之间的增长关系.
void print(int n) {
int i = 0;
int[] a = new int[n];
for (i; i <n; ++i) {
a[i] = i * i;
}
for (i = n-1; i >= 0; --i) {
print out a[i]
}
}
解析: 方法的第二行, 开辟一个长度为 n 的数组, 整个方法而言, 当前的最大空间占用就在这行代码, 所以当前方法的空间复杂度为 O(n)
常见的空间复杂度为 O(1), O(n), O(n²)..