Yang's blog Yang's blog
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xiaoyang

编程爱好者
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • SpringCloud

    • 微服务架构介绍
    • SpringCloud介绍
    • Spring Cloud:生产者与消费者
    • Spring Cloud Eureka:构建可靠的服务注册与发现
    • Spring Cloud Ribbon:负载均衡
    • Spring Cloud Fegin:服务调用
    • Spring Cloud Hystrix:熔断器
    • Spring Cloud Zuul:统一网关路由
    • Spring Cloud Config:配置中心
  • Java后端框架

    • LangChain4j

      • 介绍
      • 快速开始
      • Chat and Language Models
      • Chat Memory
      • Model Parameters
      • Response Streaming
      • AI Services
      • Agent
      • Tools (Function Calling)
      • RAG
      • Structured Outputs
      • Classification
      • Embedding (Vector) Stores
      • Image Models
      • Quarkus Integration
      • Spring Boot Integration
      • Kotlin Support
      • Logging
      • Observability
      • Testing and Evaluation
      • Model Context Protocol
  • 八股文

    • 操作系统
    • JVM介绍
    • Java多线程
    • Java集合框架
    • Java反射
    • JavaIO
    • Mybatis介绍
    • Spring介绍
    • SpringBoot介绍
    • Mysql
    • Redis
    • 数据结构
    • 云计算
    • 设计模式
    • 计算机网络
    • 锁核心类AQS
    • Nginx
  • 前端技术

    • 初识Vue3
    • Vue3数据双向绑定
    • Vue3生命周期
    • Vue-Router 组件
    • Pinia 集中式状态存储
  • 中间件

    • RocketMQ
  • 开发知识

    • 请求参数注解
    • 时间复杂度和空间复杂度
      • 时间复杂度
        • 常数时间复杂度
        • 示例
        • 示例说明
        • 对数时间复杂度
        • 示例
        • 示例说明
        • 线性时间复杂度
        • 示例
        • 示例说明
        • 平方时间复杂度
        • 示例
        • 示例说明
        • 其他常见的时间复杂度
      • 空间复杂度
        • 常数空间复杂度
        • 示例
        • 示例说明
        • 线性空间复杂度
        • 示例
        • 示例说明
        • $\mathcal{O}(n^2)$ 平方空间复杂度
        • 示例
        • 示例说明
        • 其他常见的空间复杂度
      • 总结
    • JSON序列化与反序列化
    • Timestamp vs Datetime
    • Java开发中必备能力单元测试
    • 正向代理和反向代理
    • 什么是VPN
    • 正则表达式
  • Java
  • 开发知识
xiaoyang
2024-05-07
目录

时间复杂度和空间复杂度

# 理解时间复杂度和空间复杂度:优化算法效率的关键

在计算机科学中,算法的效率是衡量其好坏的关键因素之一。算法的效率主要体现在它所消耗的计算机资源上,其中最重要的资源包括时间和空间。

为了评估算法的效率,我们引入了时间复杂度和空间复杂度这两个概念。时间复杂度描述了算法执行所需的时间,而空间复杂度描述了算法所占用的存储空间。

# 时间复杂度

时间复杂度是衡量算法执行时间随输入规模增长而增长的程度。通常用大O符号(O)来表示,它描述了算法在最坏情况下执行所需的时间。在分析时间复杂度时,我们关注的是算法执行基本操作的次数。

# 常数时间复杂度

常数时间复杂度表示算法的执行时间不随输入规模变化而变化,无论输入数据多大,都需要恒定的时间。

# 示例

def constant_example(arr):
    return arr[0]
1
2

# 示例说明

无论输入的数组 arr 中有多少个元素,执行时间都只与数组的第一个元素访问有关,因此时间复杂度为 (O(1))。

# 对数时间复杂度

对数时间复杂度通常出现在分治算法中,它的增长速度比线性更慢。

# 示例

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1
1
2
3
4
5
6
7
8
9
10
11

# 示例说明

在二分查找算法中,每次循环将待搜索范围减半,因此随着输入规模 (n) 增大,执行次数不会像线性增长。时间复杂度为 (O(log⁡n))。

# 线性时间复杂度

线性时间复杂度表示算法的执行时间与输入规模成线性关系。

# 示例

def linear_example(arr):
    total = 0
    for num in arr:
        total += num
    return total
1
2
3
4
5

# 示例说明

算法需要遍历数组中的每个元素,执行次数与数组长度 (n) 成线性关系,因此时间复杂度为 (O(n))。

# 平方时间复杂度

平方时间复杂度常见于嵌套循环,每个元素都需要与其他元素做比较。

# 示例

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
1
2
3
4
5
6

# 示例说明

冒泡排序算法中,嵌套循环会导致总共执行 (O(n2)) 次操作。对于每个元素,需要与剩余的元素进行比较和交换,因此时间复杂度为 (O(n2))。

# 其他常见的时间复杂度

除了上述示例中提到的时间复杂度,还有一些其他常见时间复杂度,如 (O(nlog⁡n))、(O(2n)) 等,它们代表了不同算法的执行时间增长速度。

# 空间复杂度

空间复杂度是衡量算法所需内存空间随输入规模增长而增长的程度。通常用大O符号(O)来表示,它描述了算法所需的额外空间与输入规模之间的关系。

# 常数空间复杂度

常数空间复杂度表示算法所需的额外空间是固定的,与输入规模无关。

# 示例

def constant_space(n):
    a = 5
    b = 10
    return a + b + n
1
2
3
4

# 示例说明

在该示例中,无论输入的值是多少,算法所需的额外空间始终是固定的,因此空间复杂度为 (O(1))。

# 线性空间复杂度

线性空间复杂度表示算法所需的额外空间与输入规模成线性关系。

# 示例

def linear_space(n):
    arr = [0] * n
    for i in range(n):
        arr[i] = i
    return arr
1
2
3
4
5

# 示例说明

在该示例中,算法创建了一个长度为 (n) 的数组来存储元素,因此所需的额外空间与输入规模 (n) 成线性关系,空间复杂度为 (O(n))。

# O(n2) 平方空间复杂度

平方空间复杂度表示算法所需的额外空间与输入规模的平方成正比。

# 示例

def square_space(n):
    matrix = [[0] * n for _ in range(n)]
    return matrix
1
2
3

# 示例说明

在该示例中,算法创建了一个 (n×n) 的二维数组,因此所需的额外空间与输入规模 (n) 的平方成正比,空间复杂度为 (O(n2))。

# 其他常见的空间复杂度

除了上述示例中提到的空间复杂度,还有一些其他常见的空间复杂度,如 (O(log⁡n))、(O(2n)) 等,它们代表了不同算法所需的内存空间增长速度。

# 总结

时间复杂度和空间复杂度是评估算法效率的重要指标。通过分析算法的时间复杂度和空间复杂度,我们可以选择更高效的算法来解决问题。在设计算法时,我们应该尽量追求较低的时间复杂度和空间复杂度,以提高算法的执行效率。

编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12

← 请求参数注解 JSON序列化与反序列化→

最近更新
01
操作系统
03-18
02
Nginx
03-17
03
后端服务端主动推送消息的常见方式
03-11
更多文章>
Theme by Vdoing | Copyright © 2023-2025 xiaoyang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式