Java 数据结构与算法:时间空间复杂度 从入门到实战全解

Java 数据结构与算法:时间空间复杂度 从入门到实战全解
在这里插入图片描述
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言数据结构(C语言)EasyXJAVA数据结构与算法(JAVA)游戏规划程序人生
✨ 从来绝巘须孤往,万里同尘即玉京
在这里插入图片描述


文章目录

在这里插入图片描述

Java 数据结构与算法:时间空间复杂度 从入门到实战全解 🚀

算法入门第一课,吃透复杂度,刷题少走90%弯路!

📝 文章摘要

  • 阅读时长:12 分钟
  • 适合人群
    1. Java 算法零基础初学者 → 重点看:数据结构概念、学习路线、复杂度定义与大O推导
    2. 准备开始刷力扣/剑指Offer 的同学 → 重点看:复杂度分析、实战例题、最优解判断
    3. 面试复习算法基础 → 重点看:复杂度对比、大O规则、时间/空间取舍思想
    4. 写技术博客/做知识复盘 → 重点看:结构逻辑、知识点梳理、表述规范
  • 本文内容:全覆盖数据结构基础认知、算法学习方法、Java 版时间复杂度与空间复杂度、大O表示法、常见复杂度对比,并搭配两道经典 LeetCode 题进行复杂度实战分析,全程 Java 代码、图文清晰、全是干货。

🧠 前置知识回顾

在正式进入数据结构与算法之前,我们已经掌握:

  1. Java 基础语法、数组、循环、方法
  2. Java 集合框架(List、ArrayList 等)
  3. 面向对象、继承、多态、泛型
  4. 简单的代码编写与调试能力

而今天要学习的 数据结构与算法 + 复杂度分析,是所有进阶知识、框架源码、面试算法的基石


一、数据结构与算法基础认知 📚

1. 什么是数据结构?

  • 数据结构(Data Structure):计算机存储、组织和描述数据的方式。
  • 简单理解:数据怎么放、怎么取、怎么查最高效。
  • 在 Java 中:很多常用数据结构已经被 JDK 封装好,就是我们常用的 集合类(ArrayList、LinkedList、HashMap、TreeSet 等)。

2. 数据库 ≠ 数据结构(一定要分清)

  • 数据库:用来持久化存储数据的软件(MySQL、Oracle 等)。
  • 数据结构:数据在内存中的组织方式。
  • 关系:数据库在底层存储数据时,会大量使用数据结构(如索引用 B+ 树)。

3. 数据结构与算法的关系

它们是相辅相成、不可分割的:

  • 数据结构:数据怎么存
  • 算法:数据怎么处理
  • 好算法 + 好结构 = 高效程序

4. 最实用的学习路线(直接照做)

  1. 手写代码 + 画图理解逻辑
  2. IDEA 断点调试,看每一步变化
  3. 写 ZEEKLOG 博客总结
  4. 定期复盘巩固
  5. 刷题提升
    • 《剑指 Offer 第2版 + 专项突破版》
    • LeetCode 热题 Hot100
    • 各类高频面试题
不刷题、不复盘,算法永远学不会!

二、算法复杂度:评价算法好坏的唯一标准 ⚖️

我们写代码,不只要能跑通,还要:

  • 跑得够快(时间)
  • 占内存够小(空间)

衡量这两点的,就是 时间复杂度空间复杂度

1. 两个核心概念

① 时间复杂度 ⏱️

  • 定义:随着输入数据规模 n 增大,代码执行次数的增长趋势
  • 关注:数据量变大后,代码会不会“崩”。
  • 和运行时间无关:不同机器速度不同,只看执行次数

② 空间复杂度 📦

  • 定义:算法运行时,临时占用的额外存储空间n 的增长趋势。
  • 注意:只算临时开辟的空间,不算输入/输出本身占用的空间。

③ 时间 vs 空间:怎么取舍?

  • 早年内存贵:以时间换空间
  • 现在内存充足:以空间换时间(更常用)
  • 企业开发优先:时间效率 > 空间效率

三、大O表示法:复杂度的统一语言 🧮

大O表示法只看增长趋势,不看精确次数,规则只有三句:

  1. 常数项直接去掉
    3 → O(1)
  2. 只保留最高次项
    n² + 5n + 10 → O(n²)
  3. 最高次项系数去掉
    3n² → O(n²)

一句话:只看量级,不看细节!

Java 代码示例:简单复杂度分析

publicclassDemo{publicstaticvoidmain(String[] args){int n =100;int sum =0;// 1次for(int i =0; i < n; i++){ sum += i;// n次}System.out.println(sum);// 1次}}

总次数:1 + n + 1 = n + 2
按规则简化 → O(n)


四、三种情况:最好、最坏、平均

以在数组中找一个数为例:

  • 最好情况:第一个就找到 → O(1)
  • 最坏情况:遍历到最后才找到 → O(n)
  • 平均情况:平均查找 n/2 次 → O(n)

默认都看最坏情况
因为它能给程序性能兜底:再差也不会比这个慢。


五、常见复杂度从快到慢排序(必须背)

复杂度名称速度典型场景
O(1)常数阶极快取值、运算、赋值
O(log n)对数阶极快二分查找
O(n)线性阶单层循环、遍历
O(n log n)线性对数阶较快快排、归并排序
O(n²)平方阶双层循环、冒泡排序
O(2ⁿ)指数阶极慢暴力递归斐波那契
O(n!)阶乘阶最慢暴力全排列

增长速度:

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!) 

六、空间复杂度(比时间简单)

只看额外开辟的临时空间

  • O(1):几个固定变量
  • O(n):长度为 n 的数组/集合
  • O(log n):递归深度(如二分递归)
  • O(n²):n×n 二维数组

示例:

// 空间 O(1)int a =10;int b =20;// 空间 O(n)int[] arr =newint[n];

七、LeetCode 经典实战(Java 版)✨

例题1:268. 丢失的数字

题目:给定 [0,n] 中的 n 个数,找缺失的那个数。
要求:时间 O(n),空间 O(1)

思路1:数学求和法(最优)

publicintmissingNumber(int[] nums){int n = nums.length;int sum = n *(n +1)/2;int realSum =0;for(int num : nums){ realSum += num;}return sum - realSum;}
  • 时间:O(n)
  • 空间:O(1)

思路2:异或法(更稳,不溢出)

publicintmissingNumber(int[] nums){int res = nums.length;for(int i =0; i < nums.length; i++){ res ^= i ^ nums[i];}return res;}
  • 时间:O(n)
  • 空间:O(1)

例题2:189. 旋转数组

题目:将数组向右旋转 k 位,原地修改,空间 O(1)

最优解:三次翻转法

publicvoidrotate(int[] nums,int k){int n = nums.length; k %= n;reverse(nums,0, n -1);reverse(nums,0, k -1);reverse(nums, k, n -1);}privatevoidreverse(int[] nums,int left,int right){while(left < right){int temp = nums[left]; nums[left]= nums[right]; nums[right]= temp; left++; right--;}}
  • 时间:O(n)
  • 空间:O(1)

📌 全篇核心干货总结

  1. 数据结构:数据的存储组织方式,Java 中体现为集合类。
  2. 学习路线:写代码 + 画图 + 调试 + 博客 + 复盘 + 刷题(剑指Offer + Hot100)。
  3. 时间复杂度:执行次数的增长趋势。
  4. 空间复杂度:临时额外占用空间的增长趋势。
  5. 大O规则:去常数、去系数、留最高次项。
  6. 复杂度速度
    O(1) > O(log n) > O(n) > O(n log n) > O(n²) > O(2ⁿ)
  7. 企业原则:优先时间,空间换时间。
  8. 两道经典题
    • 丢失的数字:求和法 / 异或法
    • 旋转数组:三次翻转(原地最优)

✍️ 写在最后

数据结构与算法,是程序员的内功
复杂度分析,是判断你代码优不优秀的第一把尺子

从今天开始,写每一段代码都问自己三句:

  • 时间复杂度是多少?
  • 空间复杂度是多少?
  • 还能不能更优?

坚持下去,你会越来越接近“一眼看出最优解”的境界。

本篇是算法系列的开篇奠基之作,下一篇我们正式进入:
线性表 —— 数组、链表、栈、队列 从原理到手写

觉得这篇文章清晰、干货、适合 Java 学习者,欢迎 点赞 👍 收藏 💾 评论 + 关注,持续更新高质量算法博客!

Read more

(免费领源码)SSM校园二手物品交易网站75977-计算机毕设JAVA、PHP、python、爬虫、APP、小程序、C# 、C++、数据可视化、大数据、全套文案

(免费领源码)SSM校园二手物品交易网站75977-计算机毕设JAVA、PHP、python、爬虫、APP、小程序、C# 、C++、数据可视化、大数据、全套文案

目  录 摘要 1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.

By Ne0inhk
【C++】IO流

【C++】IO流

目录 * 一、C语言的输入与输出 * 二、流是什么 * 三、C++IO流 * 3.1 C++标准IO流 * 3.2 C++文件IO流 * 3.2.1 二进制读写 * 3.2.2 文本读写 * 四、stringstream的简单介绍 * 结尾 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示: 对输入输出缓冲区的理解: 1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,

By Ne0inhk
【C++】二叉搜索树深拷贝的致命陷阱:如何用前序遍历解决90%程序员的内存崩溃难题

【C++】二叉搜索树深拷贝的致命陷阱:如何用前序遍历解决90%程序员的内存崩溃难题

【【C++】二叉搜索树深拷贝的致命陷阱:如何用前序遍历解决90%程序员的内存崩溃难题 * 摘要 * 目录 * 一、key结构的默认成员函数 * 1. 拷贝构造函数 * 2. 赋值运算符重载函数 * 3. 析构函数 * 二、二叉搜索树key结构和key/val结构使用场景 * 三、key/val结构的模拟实现以及和key结构的对比 * 总结 摘要 本文以 “Key 结构→KeyValue 结构” 为演进主线,完整实现了两种结构的非递归与递归操作(插入、查找、删除),并针对默认成员函数(拷贝构造、赋值运算符重载、析构)的深拷贝需求,设计了基于前序遍历的拷贝逻辑、“拷贝 - 交换” 的赋值技法及后序遍历的销毁逻辑,同时结合 “小区车库车牌验证”“单词拼写检查”“中英互译字典” 等实际场景,清晰区分两种结构的适用范围,为 BST

By Ne0inhk
Java Web 桂林旅游景点导游平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 桂林旅游景点导游平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

系统架构设计### 摘要 随着信息技术的快速发展,智慧旅游逐渐成为提升旅游体验的重要方向。桂林作为中国著名的旅游城市,拥有丰富的自然景观和人文资源,但传统的旅游信息服务模式存在信息分散、更新滞后、用户体验不佳等问题。游客在规划行程时往往需要从多个平台获取信息,效率较低。因此,开发一个集景点介绍、路线规划、用户评价等功能于一体的智能化导游平台具有重要的现实意义。该平台旨在通过技术手段整合桂林旅游资源,为游客提供一站式服务,提升旅游体验的便捷性和个性化。关键词:智慧旅游、桂林、导游平台、资源整合、用户体验。 本系统采用前后端分离架构,后端基于SpringBoot2框架搭建,结合MyBatis-Plus实现高效的数据操作,数据库选用MySQL8.0以支持高并发访问。前端使用Vue3框架开发,利用其响应式特性提升用户交互体验。系统功能涵盖景点信息展示、用户评论管理、路线推荐、订单管理等模块,并通过JWT实现安全的用户认证。系统设计注重可扩展性和可维护性,采用RESTful API规范进行接口设计,确保前后端高效协作。关键词:SpringBoot2、Vue3、MyBatis-Plus、MyS

By Ne0inhk