复杂度是什么?

复杂度是衡量代码运行效率的重要衡量因素。

复杂度包括两个方面的负责度:时间复杂度、空间复杂度。

大 O 表示法 (Big O)

  • 一般用大 O 表示法来描述复杂度,它表示的是数据规模 n 对应的复杂度
  • 忽略常数、系数、低阶
    • 9 >> O(1)
    • 2n + 3 >> O(n)
    • n^2 + 2n + 3 >> O(n^2)
    • 4n^3 + 3n^2 + 2n + 1 >> O(n^3)
  • 对数阶一般省略底数,统称为 logn
  • O(1) < o(logn) < O(n) < O(nlogn) < O(n^2) < O(n3)<O(2n)

注意: 大 O 表示法仅仅是一种粗略的分析模型,是一种估算,能帮助我们快速了解一个算法的执行效率。

对比图:

复杂度 - 图1

计算方法

单个数据规模

  1. function static void test (int n){
  2. //执行次数: n + n + 1 + n = 3n => O(n)
  3. for(int i = 0 ; i < n ; i ++){
  4. System.out.println('test');
  5. }
  6. }
  1. function static void test (int n){
  2. //执行次数: n * n = n^2 => O(n^2)
  3. for(int i = 0 ; i < n ; i ++){
  4. for (int j = 0 ; j < n ; j ++){
  5. System.out.println('test');
  6. }
  7. }
  8. }

多个数据规模的情况

  1. function static void test (int n,int k){
  2. //执行次数: n + k => O(n + k)
  3. for(int i = 0 ; i < n ; i ++){
  4. System.out.println('test');
  5. }
  6. for(int i = 0 ; i < k ; i ++){
  7. System.out.println('test');
  8. }
  9. }

对于多个数据规模的,不能省略。

总结

时间复杂度与代码的结构设计高度相关。

空间复杂度与代码中数据结构的选择高度相关