【数据结构和算法】-时间复杂度

时间复杂度概述

时间复杂度是衡量算法执行效率的一个重要指标,它描述了算法运行时间与输入数据规模之间的关系。时间复杂度通常用大O表示法(Big O notation)来表示。

常见的时间复杂度

  1. O(1) - 常数时间复杂度

    • 描述:无论输入数据规模如何,算法的执行时间都是常数。

    • 示例 :访问数组中的某个元素。

      java 复制代码
      int[] array = {1, 2, 3, 4, 5};
      int element = array[3]; // O(1)
  2. O(log n) - 对数时间复杂度

    • 描述:算法的执行时间与输入数据规模的对数成正比。

    • 示例 :二分查找。

      java 复制代码
      int binarySearch(int[] array, int target) {
          int left = 0, right = array.length - 1;
          while (left <= right) {
              int mid = left + (right - left) / 2;
              if (array[mid] == target) return mid;
              else if (array[mid] < target) left = mid + 1;
              else right = mid - 1;
          }
          return -1; // O(log n)
      }
  3. O(n) - 线性时间复杂度

    • 描述:算法的执行时间与输入数据规模成线性关系。

    • 示例 :遍历数组。

      java 复制代码
      int sum = 0;
      for (int i = 0; i < array.length; i++) {
          sum += array[i]; // O(n)
      }
  4. O(n log n) - 线性对数时间复杂度

    • 描述:算法的执行时间与输入数据规模的对数成线性关系。

    • 示例 :归并排序。

      java 复制代码
      void mergeSort(int[] array, int left, int right) {
          if (left < right) {
              int mid = left + (right - left) / 2;
              mergeSort(array, left, mid);
              mergeSort(array, mid + 1, right);
              merge(array, left, mid, right); // O(n log n)
          }
      }
  5. O(n^2) - 平方时间复杂度

    • 描述:算法的执行时间与输入数据规模的平方成正比。

    • 示例 :冒泡排序。

      java 复制代码
      void bubbleSort(int[] array) {
          for (int i = 0; i < array.length - 1; i++) {
              for (int j = 0; j < array.length - 1 - i; j++) {
                  if (array[j] > array[j + 1]) {
                      int temp = array[j];
                      array[j] = array[j + 1];
                      array[j + 1] = temp; // O(n^2)
                  }
              }
          }
      }
  6. O(2^n) - 指数时间复杂度

    • 描述:算法的执行时间与输入数据规模的指数成正比。

    • 示例 :递归计算斐波那契数列。

      java 复制代码
      int fibonacci(int n) {
          if (n <= 1) return n;
          return fibonacci(n - 1) + fibonacci(n - 2); // O(2^n)
      }
  7. O(n!) - 阶乘时间复杂度

    • 描述:算法的执行时间与输入数据规模的阶乘成正比。

    • 示例 :生成所有排列组合。

      java 复制代码
      void permute(int[] nums, int start, List<List<Integer>> result) {
          if (start == nums.length) {
              result.add(new ArrayList<>(Arrays.asList(nums)));
          } else {
              for (int i = start; i < nums.length; i++) {
                  swap(nums, start, i);
                  permute(nums, start + 1, result);
                  swap(nums, start, i); // O(n!)
              }
          }
      }
      
      void swap(int[] nums, int i, int j) {
          int temp = nums[i];
          nums[i] = nums[j];
          nums[j] = temp;
      }

总结

  • 选择合适的算法:根据实际需求和数据规模选择合适的时间复杂度,以优化程序性能。
  • 分析和优化:在编写算法时,应尽量避免高时间复杂度的操作,特别是在处理大规模数据时。

理解时间复杂度有助于评估和优化算法的性能,从而提高程序的效率。

相关推荐
知来者逆12 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊16 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北17 分钟前
力扣-160.相交链表
算法·leetcode·链表
草莓啵啵~43 分钟前
搜索二叉树-key的搜索模型
数据结构·c++
爱研究的小陈1 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing1 小时前
二叉树的最大宽度计算
算法·面试
丶Darling.2 小时前
26考研 | 王道 | 数据结构 | 第八章 排序
数据结构·考研·排序算法
BB_CC_DD2 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
我也不曾来过12 小时前
list底层原理
数据结构·c++·list
梁下轻语的秋缘3 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯