数据结构 一 📅 2026/6/26 7:11:46 数据结构一数据结构是计算机领域的核心基础在求职面试、考研、保研等场景中均为重点考察内容。本文系统梳理数据结构的核心意义、时间复杂度评判标准以及数组、链表、哈希表、二叉树等经典结构的原理与特性建立完整的入门知识框架。一、为什么要学习数据结构数据结构的核心价值是对大规模数据进行合理的存储规划从而提升查找、插入、删除等操作的执行效率。我们可以用图书馆藏书做类比家中只有几十本书时随意摆放也能快速找到效率差异可以忽略图书馆有百万级藏书如果杂乱堆放每次借阅都需要全量翻找效率会极低通过分门别类文学、理工、计算机等层级分类存放前期需要付出整理成本但后续查找能直接缩小范围效率大幅提升计算机中的海量数据同理磁盘、服务器中存储着TB级甚至更多数据如果毫无规律地存储每次查找都要遍历全部内容耗时无法接受。数据结构就是通过设计不同的组织存储方式针对性地优化特定操作的性能。关键前提数据结构的优劣只在大规模数据下才能体现。只有十几个数据时任何结构的执行时间差异都微乎其微只有数据量达到一定量级结构的性能差异才会凸显。二、算法效率的评判标准时间复杂度1. 为什么不用真实运行时间直观来看程序运行时间越短效率越高但真实运行时间受太多外部因素干扰无法作为客观标准硬件性能差异高端CPU和低端CPU的运算速度天差地别系统调度影响CPU何时分配时间片给当前程序存在随机性长周期算法需要运行数天的模型不可能通过实测时间评判优劣因此行业统一使用**「基础操作的执行次数」**作为评判依据计算机单次基础操作的耗时是固定的完成同一件事需要的操作次数越少算法效率越高。2. 大O表示法时间复杂度用大O符号描述核心是刻画「操作次数随数据量增长的变化趋势」遵循抓主要矛盾、忽略低影响项的原则忽略常数项与常数系数如y ax b简化为O(n)只保留最高次项如y ax² bx c简化为O(n²)数据规模越大低次项的影响越可以忽略3. 常见时间复杂度与增长趋势从优到劣最核心的四类时间复杂度O(1) 常数级无论数据量多大操作次数固定是最优的时间复杂度O(logn) 对数级数据量翻倍操作次数仅增加1次效率极高O(n) 线性级操作次数与数据量成正比O(n²) 平方级操作次数随数据量呈平方增长效率较低增长速度对比O(1) O(logn) O(n) O(n²)计算机中绝大多数操作都依赖查找因此数据结构优化的核心目标就是尽量将查找效率从O(n)降低到O(logn)甚至O(1)。4. 经典场景的时间复杂度推导1无序数组遍历查找O(n)在长度为n的无序数组中从头到尾逐个比对目标值。最优情况第一个元素就是目标仅1次操作最坏情况最后一个元素才是目标需要n次操作平均情况约遍历一半数据即 n/2 次忽略常数系数后时间复杂度为O(n)。2等差数列公式求和O(1)对1到n的等差数列求和两种思路效率天差地别思路1循环遍历累加每个数相加一次共n次操作时间复杂度O(n)思路2直接套用求和公式sum n*(n1)/2仅需1次运算第二种思路无论n多大操作次数固定时间复杂度为O(1)。这也说明同一件事算法思路不同效率差距可以非常大。3冒泡排序O(n²)冒泡排序的核心逻辑相邻元素两两比较小数前移、大数后移每一轮都会让当前最大的数“冒泡”到末尾的正确位置。第1轮遍历全部n个数据比较n-1次1个数据归位第2轮遍历前n-1个数据比较n-2次第2个数据归位…最后1轮仅比较1次最后2个数据同时归位总操作次数为等差数列求和12...(n-1) n*(n-1)/2最高次项为n²因此时间复杂度为O(n²)。冒泡排序可做优化如果某一轮遍历中没有发生任何交换说明数组已经完全有序可以提前终止。但最坏场景下时间复杂度仍为O(n²)。4二分查找O(logn)二分查找必须基于有序数组核心逻辑每次和中间值比较直接丢弃一半不可能的区间。初始查找范围n个数据第1次比较丢弃一半剩余 n/2 个数据第2次比较再丢弃一半剩余 n/4 个数据…直到范围缩小到1个数据比较后结束设共比较k次则满足n / 2^k 1推导得k log₂n。忽略底数常数时间复杂度为O(logn)。5. 快速判断时间复杂度的技巧从头到尾全量遍历数据O(n)循环中数据量持续折半O(logn)k层和数据量n相关的嵌套循环O(n^k)两层嵌套即为O(n²)三、经典数据结构详解1. 数组数组是最基础的线性结构底层是一块连续的内存空间每个元素对应唯一的下标索引。核心优势通过下标随机访问元素时间复杂度O(1)速度极快劣势无序数组查找效率低为O(n)有序数组可通过二分查找达到O(logn)但将无序数据转为有序需要排序本身有时间成本如快速排序O(nlogn)、冒泡排序O(n²)插入、删除元素需要移动后续所有元素效率较低2. 链表链表是另一种线性结构内存空间不连续由一个个独立的节点串联而成。节点结构每个节点包含两部分——数据域存储本身的数值指针域存储下一个节点的内存地址常见分类单链表每个节点只记录下一个节点的地址只能从头向后单向遍历双向链表每个节点同时记录上一个和下一个节点的地址支持双向遍历链表的核心特性优势插入、删除节点只需要修改相邻节点的指针不需要移动批量数据操作本身为O(1)前提是已定位到目标位置劣势无法随机访问查找必须从头节点开始逐个遍历时间复杂度O(n)即使链表有序也无法使用二分查找——无法直接定位中间节点必须遍历才能到达每个节点需要额外存储指针空间开销大于数组3. 哈希表散列表哈希表结合了数组和链表的优势目标是让查找效率接近O(1)是工业界最常用的快速查找结构。核心原理底层主体是一个数组通过哈希函数常见如「数值对数组长度取余」计算数据应该存储的数组下标存数据时按计算出的下标存入查数据时按同样的公式计算下标直接定位理想情况时间复杂度O(1)哈希冲突哈希碰撞两个不同的数值通过哈希函数计算出了同一个下标这就是哈希冲突。如果直接覆盖写入会导致原有数据丢失。经典解决方案链地址法数组的每个位置不直接存单个数据而是挂载一条链表算出同一下标的所有数据都挂到对应位置的链表上。查找流程先算下标定位到链表再遍历链表查找目标链表较短时遍历开销可忽略整体仍可视为O(1)性能优化当链表长度超过阈值时将链表转换为红黑树查找效率提升为O(logn)避免链表过长导致性能退化4. 二叉树基础概念树是一种层级结构类似倒置的自然树最顶端的节点叫根节点没有子节点的节点叫叶子节点每个节点向下分出的分支叫子树分为左子树、右子树二叉树每个节点最多有两个子节点有序二叉树二叉搜索树有序二叉树是专门用于查找的基础二叉树核心规则任意节点的左子树所有节点值 当前节点值 右子树所有节点值。构建逻辑逐个插入数据从根节点开始匹配第一个数据作为根节点后续数据从根节点开始比较比当前节点小走左子树比当前节点大走右子树走到空位置时完成插入查找效率查找过程和二分查找逻辑一致从根节点开始每次比较后丢弃一整侧分支比较次数等于树的层数。理想平衡状态每层节点数翻倍n个数据的树高约为log₂n查找时间复杂度为O(logn)极端退化场景如果按有序顺序插入数据如1、2、3、4、5树会退化成一条链表高度为n查找时间复杂度退化为O(n)效率骤降平衡二叉树与红黑树为了解决有序二叉树容易退化的问题出现了可以自动维持平衡的树结构平衡二叉树严格维持左右子树高度差不超过1保证树高始终为logn查找效率稳定O(logn)但插入删除时调整平衡的成本较高红黑树一种近似平衡的二叉树通过红黑节点规则维持大致平衡插入、删除、查找效率均稳定在O(logn)是工业界最主流的平衡树实现5. 多叉树B树、B树二叉树在数据量极大时树高依然会很高。如果数据存储在磁盘上每访问一层树就需要一次磁盘IO而磁盘IO速度远慢于内存树高越高IO次数越多查找越慢。B树、B树属于多叉树每个节点可以存储多个数据、分出多个分支相同数据量下树高远低于二叉树能大幅减少磁盘IO次数因此广泛应用于数据库索引、文件系统设计中。四、总结不存在绝对最优的数据结构每种结构都有自己的优缺点和适用场景追求随机访问、数据长度固定优先选择数组频繁增删节点、很少随机查找优先选择链表追求单点快速查找、无强有序需求优先选择哈希表需要有序范围查询、追求稳定性能优先选择红黑树、B树数据结构的本质是权衡——根据业务的操作特点用空间换时间或者用灵活性换效率。这些底层原理是所有编程语言通用的基本功底层逻辑吃透后学习任何语言的对应实现都能快速上手。