数据结构笔试核心考点

在数据结构笔试中,核心围绕 "数据的逻辑结构、存储结构、操作效率、经典算法思想" 四大维度展开。

一、基础概念:数据结构的 "骨架"

1. 数据结构的核心三要素
  • 逻辑结构 :数据元素之间的 "逻辑关系"(与存储无关),分为两类:

    • 线性结构:元素间一对一,如数组、链表、栈、队列、串。
    • 非线性结构:元素间一对多 / 多对多,如树(一对多)、图(多对多)、集合(无逻辑关系)。
  • 存储结构(物理结构) :逻辑结构在计算机中的 "实际存储方式",决定操作效率,核心有 4 种:

    存储结构 特点 典型应用
    顺序存储 元素连续存放,用下标访问 数组、顺序栈、顺序队列
    链式存储 元素分散存放,用指针 / 引用连接 单链表、双链表、链栈
    索引存储 额外建 "索引表"(key + 地址),加速查找 数据库索引
    散列存储(哈希) 元素 key 通过哈希函数直接映射到存储地址 哈希表、HashMap
  • 数据运算:对数据元素的操作(增删改查、排序、遍历),运算效率由 "逻辑结构 + 存储结构" 共同决定(如数组查快删慢,链表删快查慢)。

2. 时间复杂度与空间复杂度
  • 时间复杂度(T (n)) :算法执行 "基本操作次数" 与问题规模 n 的关系,只保留最高次项(忽略常数、低次项)。
    • 常见复杂度排序(从优到劣):O(1) < O(log₂n) < O(n) < O(nlog₂n) < O(n²) < O(n³) < O(2ⁿ) < O(n!)
    • 高频场景:
      • O (1):数组随机访问、哈希表查找(无冲突时);
      • O (log₂n):二分查找、平衡二叉树(AVL、红黑树)的增删查;
      • O (n):线性查找、链表遍历;
      • O (n²):冒泡排序、插入排序、简单选择排序(双层循环)。
  • 空间复杂度(S (n)) :算法执行时 "额外占用存储空间" 与 n 的关系(不包含输入数据的空间)。
    • 常见场景:
      • O (1):原地排序(冒泡、插入)、迭代算法(无额外数组 / 栈);
      • O (n):递归(递归栈深度为 n)、额外开辟大小为 n 的数组。

二、线性结构

1. 数组 vs 链表
对比维度 数组(顺序存储) 链表(链式存储)
访问效率 O (1)(随机访问) O (n)(需遍历)
增删效率 O (n)(需移动元素) O (1)(已知前驱 / 后继时)
存储空间 静态分配(大小固定) 动态分配(按需申请)
内存碎片 无(连续存储) 有(分散存储)
典型应用 需频繁访问的场景(如矩阵、查找表) 需频繁增删的场景(如链表队列、邻接表)
2. 栈:"先进后出(LIFO)" 的线性表
  • 定义:只允许在 "栈顶" 进行增(push)、删(pop)的线性表,栈底固定。
  • 存储:
    • 顺序栈:用数组实现,需注意 "栈满(top == 数组长度 - 1)" 和 "栈空(top == -1)";
    • 链栈:用链表实现,栈顶为链表头(无需考虑栈满,只需判断栈空:head == null)。
  • 高频应用:括号匹配、表达式求值(后缀表达式)、函数调用栈、递归的非递归实现。
3. 队列:"先进先出(FIFO)" 的线性表
  • 定义:只允许在 "队尾" 增(enqueue)、"队头" 删(dequeue)的线性表。
  • 存储与关键问题:
    • 顺序队列:用数组实现,易出现 "假溢出"(队尾满但队头有空位);
    • 循环队列(笔试重点) :解决假溢出,将数组视为环形,核心是 "判空 / 判满条件":
      • 判空:front == rear(队头和队尾指针重合);
      • 判满:(rear + 1) % 数组长度 == front(预留一个空位,避免与判空混淆)。
  • 高频应用:进程调度(操作系统)、缓冲区(如 IO 缓冲)、广度优先搜索(BFS)。
4. 串(字符串)
  • 定义:由字符构成的线性表(特殊线性表),长度为 0 的串称为 "空串"(""),注意与 "空格串"(" ")区分。
  • 子串:串中任意连续字符组成的子序列(如 "abc" 的子串有 "a""ab""abc" 等),笔试常考 "子串个数计算"(长度为 n 的串,子串个数为 n (n+1)/2 + 1,+1 是空串)。
  • 模式匹配:在主串中找子串(模式串)的位置,笔试考算法概念:
    • 暴力匹配(BF 算法):逐个比对,时间复杂度 O (mn)(m 为主串长度,n 为模式串长度);
    • KMP 算法:利用 "部分匹配表(next 数组)" 跳过重复比对,时间复杂度 O (m+n)(无需掌握代码,但需知道 "优化暴力算法" 的核心思想)。

三、非线性结构

1. 树:"一对多" 的层次结构
(1)树的基本概念(必背)
  • 节点关系:父节点、子节点、兄弟节点、叶子节点(无子女)、非叶子节点(有子女);
  • 树的属性:
    • 深度:从 "根节点" 到该节点的路径长度(根深度为 1 或 0,笔试需看题干定义);
    • 高度:从该节点到 "最远叶子" 的路径长度(叶子高度为 1);
    • 度:节点的子节点个数(树的度是所有节点度的最大值)。
  • 森林:m 棵互不相交的树的集合(树是森林的特殊情况,m=1)。
(2)二叉树:"每个节点最多 2 个子树"
  • 特殊二叉树:

    类型 定义 关键性质
    满二叉树 所有叶子在同一层,非叶子度均为 2 深度为 k 时,节点总数 = 2ᵏ - 1
    完全二叉树 按层序编号,每个节点编号与满二叉树一致(叶子只在最后两层) ① n 个节点的完全二叉树,深度 =⌊log₂n⌋ + 1;② 父节点 i 的左子树 = 2i,右子树 = 2i+1(i 从 1 开始)
    二叉搜索树(BST) 左子树值 < 根值 < 右子树值(中序遍历为升序) 无平衡限制,最坏情况下退化为链表(查找 O (n))
    平衡二叉树(AVL) BST + 左右子树高度差≤1 确保查找、增删效率均为 O (log₂n),平衡调整通过 "旋转"(LL、RR、LR、RL)
  • 二叉树的遍历:

    • 前序遍历(根→左→右);
    • 中序遍历(左→根→右);
    • 后序遍历(左→右→根);
    • 层序遍历(按层从左到右,用队列实现)。
    • 高频题:已知前序 + 中序,推导后序(或反之),核心是 "前序找根,中序分左右子树"。
(3)哈夫曼树(最优二叉树)
  • 定义:n 个叶子节点的二叉树中,"带权路径长度(WPL)最小" 的树(WPL=Σ 叶子权值 × 路径长度)。
  • 构建规则:每次选权值最小的两个节点作为左右子树,新节点权值为二者之和,重复至只剩一个节点。
  • 应用:哈夫曼编码(前缀编码,无歧义,用于数据压缩)。
2. 图:"多对多" 的复杂结构
(1)图的基本概念
  • 分类:
    • 按边有无方向:无向图(边用 (u,v) 表示)、有向图(边用 < u,v > 表示,分入度 / 出度);
    • 按边有无权值:无权图、带权图(网);
    • 特殊图:完全图(无向图:n 个节点有 n (n-1)/2 条边;有向图:n (n-1) 条边)、稀疏图(边少)、稠密图(边多)。
  • 连通性:
    • 无向图:两点间有路径→连通;所有节点连通→连通图;极大连通子图→连通分量;
    • 有向图:两点间双向有路径→强连通;所有节点强连通→强连通图;极大强连通子图→强连通分量。
(2)图的存储结构(笔试常考对比)
存储方式 特点 适用场景
邻接矩阵 用二维数组存储边(A [i][j] 表示节点 i 到 j 的边) 稠密图(空间 O (n²),访问边效率 O (1))
邻接表 用 "数组 + 链表" 存储(数组存节点,链表存邻接节点) 稀疏图(空间 O (n+e),e 为边数,遍历邻接节点效率高)
(3)图的遍历(与树遍历对比)
  • 深度优先搜索(DFS):类似树的前序遍历,用栈 / 递归实现,"一条路走到底,回溯再走其他路";
  • 广度优先搜索(BFS):类似树的层序遍历,用队列实现,"按层遍历,先访问当前节点的所有邻接节点";
  • 考点:遍历序列推导、基于遍历判断连通性、找路径。

四、查找与排序

1. 查找:从数据集中找目标元素
查找算法 适用结构 平均时间复杂度 特点
线性查找 任意序列(数组 / 链表) O(n) 简单,无需有序
二分查找 有序数组(顺序存储) O(log₂n) 高效,需有序 + 随机访问
二叉搜索树(BST)查找 二叉搜索树 O (log₂n)(平衡时)/ O (n)(失衡时) 动态查找(支持增删),依赖树的平衡性
哈希查找 哈希表 O (1)(理想无冲突) 最快,需解决冲突(开放地址法、链地址法)
2. 排序:将序列按规则排列
排序类别 算法 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性(相同元素相对位置不变)
插入类 直接插入排序 O(n²) O(n²) O(1) 稳定
希尔排序 O(n¹.³) O(n²) O(1) 不稳定
交换类 冒泡排序 O(n²) O(n²) O(1) 稳定
快速排序 O(nlog₂n) O(n²) O (log₂n)(递归栈) 不稳定
选择类 简单选择排序 O(n²) O(n²) O(1) 不稳定
堆排序 O(nlog₂n) O(nlog₂n) O(1) 不稳定
归并类 归并排序 O(nlog₂n) O(nlog₂n) O (n)(额外数组) 稳定
基数类 基数排序 O (d (n+r))(d 为位数,r 为基数) O(d(n+r)) O(n+r) 稳定
相关推荐
云知谷2 小时前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
电子_咸鱼2 小时前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
仰泳的熊猫2 小时前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
rit84324992 小时前
基于MATLAB实现基于距离的离群点检测算法
人工智能·算法·matlab
l1t3 小时前
DeepSeek辅助利用搬移底层xml实现快速编辑xlsx文件的python程序
xml·开发语言·python·xlsx
C_Liu_4 小时前
C++:list
开发语言·c++
my rainy days4 小时前
C++:友元
开发语言·c++·算法
haoly19894 小时前
数据结构和算法篇-归并排序的两个视角-迭代和递归
数据结构·算法·归并排序
微笑尅乐4 小时前
中点为根——力扣108.讲有序数组转换为二叉搜索树
算法·leetcode·职场和发展
小梁努力敲代码4 小时前
java数据结构--List的介绍
java·开发语言·数据结构