当前位置: 首页 > news >正文

Part03 数据结构

CSP-J 初赛常考知识点总结 - 数据结构篇

1. 图论基础

基本概念与术语

  • 边 (Edge):节点之间的连接线
  • 完全图:任意两个顶点之间都有边相连的图
    • mmm 个节点的完全图边数为:Cm2=m(m−1)2C_m^2 = \frac{m(m-1)}{2}Cm2=2m(m1)
  • 简单路径:顶点序列中顶点不重复出现的路径
  • 连通图:图中任意两个顶点都是连通的(存在路径相连)
    • 注意:完全图一定是连通图,但连通图不一定是完全图

图的分类

  • 有向图:边具有方向性(e=u→ve = u \rightarrow ve=uv
  • 无向图:边没有方向性(e=u−ve = u-ve=uv

环与度

  • :起点和终点相同的路径,且路径中除起点外无重复顶点
    • 自环:起点和终点相同的边(e=(u,u)e = (u,u)e=(u,u)
  • 入度:以顶点 vvv 为终点的边的数量
  • 出度:以顶点 vvv 为起点的边的数量

2. 树结构

基本概念

  • :连通且无环的无向图,具有以下性质:
    • 任意两点间有且仅有一条简单路径
    • 边数 = 顶点数 - 1(E=V−1E = V - 1E=V1
    • 形似倒置的树(根在上,叶在下)

树的术语

  • 根结点:树的最顶层节点,每棵树有且仅有一个
  • 深度:节点到根结点的路径上的边数
  • 高度:所有节点深度的最大值
  • 叶结点:没有子结点的结点
  • 父结点:除根结点外,每个结点到根路径上的第二个结点
  • 祖先:结点到根路径上除自身外的所有结点
  • 子结点:如果 uuuvvv 的父亲,那么 vvvuuu 的子结点
  • 兄弟:同一父亲的多个子结点互为兄弟
  • 子树:删除与父结点相连的边后,该结点所在的子图
    1
    2

3. 二叉树

遍历方式

  • 前序遍历:根 → 左子树 → 右子树
  • 中序遍历:左子树 → 根 → 右子树
  • 后序遍历:左子树 → 右子树 → 根

遍历性质

  • 前序遍历 + 中序遍历 = 确定唯一二叉树
  • 后序遍历 + 中序遍历 = 确定唯一二叉树

在这里插入图片描述

特殊二叉树

满二叉树/完美二叉树
  • 所有叶结点深度相同
  • 深度为 hhh 的满二叉树节点总数为:2h−12^h - 12h1
  • 叶结点数 m0m_0m0 与度为2的结点数 m2m_2m2 满足:m0=m2+1m_0 = m_2 + 1m0=m2+1
  • 高度为:⌊log⁡n⌋+1\lfloor \log n \rfloor + 1logn+1
    在这里插入图片描述
完全二叉树
  • 只有最下面两层结点的度数可小于2
  • 最下面一层的结点都集中在该层最左边
    在这里插入图片描述
编号性质

对于满二叉树/完美二叉树/完全二叉树:

  • 结点 iii 的左儿子编号为:2i2i2i
  • 结点 iii 的右儿子编号为:2i+12i + 12i+1
  • 结点 iii 的父结点编号为:⌊i/2⌋\lfloor i/2 \rfloori/2

4. 栈 (Stack)

定义与特性

  • 后进先出 (LIFO) 表:Last In First Out
  • 栈顶:栈的最顶端元素
  • 栈底:栈的最底端元素

基本操作

操作功能描述时间复杂度
push(x)元素 xxx 入栈O(1)O(1)O(1)
pop()弹出栈顶元素O(1)O(1)O(1)
top()返回栈顶元素值O(1)O(1)O(1)
empty()判断栈是否为空O(1)O(1)O(1)
size()返回栈中元素个数O(1)O(1)O(1)

5. 队列 (Queue)

定义与特性

  • 先进先出 (FIFO) 表:First In First Out
  • 队首:队列的第一个元素
  • 队尾:队列的最后一个元素

基本操作

操作功能描述时间复杂度
push(x)元素 xxx 入队O(1)O(1)O(1)
pop()队首元素出队O(1)O(1)O(1)
front()返回队首元素值O(1)O(1)O(1)
empty()判断队列是否为空O(1)O(1)O(1)
size()返回队列元素个数O(1)O(1)O(1)

6. 链表 (Linked List)

特点与性质

  • 通过指针连接元素
  • 与数组对比:
    • 优点:插入删除操作高效(O(1)O(1)O(1)
    • 缺点:随机访问效率低(O(n)O(n)O(n)
  • 不支持随机访问:必须从头开始遍历

6.1 STL List 的使用

STL中的list是双向链表容器,基本操作如下:

// 初始化
list<int> myList;// 添加元素
myList.push_back(1);    // 在末尾添加
myList.push_front(2);   // 在开头添加// 删除元素
myList.pop_back();      // 删除末尾元素
myList.pop_front();     // 删除开头元素// 插入元素
auto it = myList.begin();
advance(it, 1);         // 移动迭代器
myList.insert(it, 3);   // 在指定位置插入// 删除指定元素
myList.remove(2);       // 删除所有值为2的元素// 遍历
for (auto it = myList.begin(); it != myList.end(); ++it) {cout << *it << " ";
}
// 或使用范围for循环
for (int val : myList) {cout << val << " ";
}// 其他操作
myList.size();          // 返回元素个数
myList.empty();         // 判断是否为空
myList.clear();         // 清空链表

7. 字符串 (String)

基本概念

  • 子串:字符串中任意个连续字符组成的子序列
  • 长度为 nnn 的字符串:
    • 所有子串个数:n(n+1)2+1\frac{n(n+1)}{2} + 12n(n+1)+1(包含空串)
    • 非空子串个数:n(n+1)2\frac{n(n+1)}{2}2n(n+1)

表达式表示法

前缀表达式(波兰式)
  • 运算符在前,操作数在后
  • 例:−+123- + 1 2 3+123 对应中缀:1+2−31 + 2 - 31+23
中缀表达式
  • 运算符在操作数中间
  • 例:1+2−31 + 2 - 31+23
后缀表达式(逆波兰式)
  • 操作数在前,运算符在后
  • 例:12+3−1 2 + 3 -12+3 对应中缀:1+2−31 + 2 - 31+23
  • 求值方法:使用栈模拟运算

逆波兰式运算的栈模拟代码

// 假设输入为vector<string>& tokens,包含数字和运算符
stack<int> st;
for (string token : tokens) {if (token == "+" || token == "-" || token == "*" || token == "/") {int b = st.top(); st.pop();int a = st.top(); st.pop();if (token == "+") st.push(a + b);else if (token == "-") st.push(a - b);else if (token == "*") st.push(a * b);else if (token == "/") st.push(a / b);} else {st.push(stoi(token)); // 将字符串转换为整数}
}
int result = st.top(); // 最终结果

表达式转换方法

方法一:表达式树
  1. 构建表达式树(叶节点为操作数,内部节点为运算符)
  2. 前序遍历得前缀表达式
  3. 中序遍历得中缀表达式
  4. 后序遍历得后缀表达式
方法二:加括号法(推荐)
  1. 为中缀表达式加括号:1−2+3→((1−2)+3)1-2+3 \rightarrow ((1-2)+3)12+3((12)+3)
  2. 将运算符移到括号前/后
    • 前缀:移到括号前 → +(−(1,2),3)+(-(1,2),3)+((1,2),3)
    • 后缀:移到括号后 → ((1,2)−,3)+((1,2)-,3)+((1,2),3)+
  3. 删除括号得最终表达式

习题参考

  • CSP 2019 入门组第一轮-T6:链表应用
  • CSP 2019 入门组第一轮-T8:二叉树性质

文章转载自:

http://qwVLcmgm.bpkqd.cn
http://iWrmrPKd.bpkqd.cn
http://MUeutziZ.bpkqd.cn
http://X3DMkzha.bpkqd.cn
http://GWQCr5es.bpkqd.cn
http://9Y2ORifW.bpkqd.cn
http://vh7ZuMsc.bpkqd.cn
http://K0NZYPGi.bpkqd.cn
http://qeqwIRZx.bpkqd.cn
http://8oq7ILBf.bpkqd.cn
http://Z5maZTV2.bpkqd.cn
http://cjoH56Ue.bpkqd.cn
http://tEgOjBQp.bpkqd.cn
http://B3XWaizd.bpkqd.cn
http://hIPUnJFb.bpkqd.cn
http://EFszMeKL.bpkqd.cn
http://opKTxwm1.bpkqd.cn
http://EgK13ToD.bpkqd.cn
http://QHdtcunS.bpkqd.cn
http://ArWi10xU.bpkqd.cn
http://jxKmOTfU.bpkqd.cn
http://ngjxSxYZ.bpkqd.cn
http://d1qniyTq.bpkqd.cn
http://fGGKdk1v.bpkqd.cn
http://Q8jar9qy.bpkqd.cn
http://FGzSwb63.bpkqd.cn
http://FqtdKm4f.bpkqd.cn
http://wsAdUnMz.bpkqd.cn
http://xkLcpeZd.bpkqd.cn
http://SNBxNmqb.bpkqd.cn
http://www.dtcms.com/a/385967.html

相关文章:

  • Java 设置 Excel 表格边框:一份详尽的 Spire.XLS 教程
  • Electron + Vue2 IPC 通讯实例
  • 【工具代码】使用Python截取视频片段,截取视频中的音频,截取音频片段
  • 《百日战纪:最终防卫学园》体验版在Steam平台推出!
  • 服务器 IPMI 实战:从 BMC 认知到 ipmitool 命令行运维
  • Cancer Cell最新空间组学研究|香港科技大学王吉光/天坛医院江涛院士团队合作提出IDH突变型星形细胞瘤的新分类标准
  • MissionPlanner架构梳理之(十四)日志浏览
  • 搭建论坛用什么服务器好?论坛服务器配置要求
  • 两台电脑如何共享“共享文件夹”
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(7)细粒度分类理论
  • vscode实现第三方包的使用,cmake结合vcpkg(跨平台)
  • RabbitMQ 常见使用场景详解:从理论到实践
  • 【QT随笔】什么是Qt元对象系统?Qt元对象系统的核心机制与应用实践
  • 紧急供应链投毒预警 | NPM生态再次遭受盗号攻击引发新一轮开源供应链投毒
  • MySQL——10、视图和用户管理
  • 热点供应链投毒预警 | 知名NPM开发者遭受邮件钓鱼引发大规模供应链投毒攻击
  • 机器学习-NLP中的微调
  • uniapp+<script setup lang=“ts“>单个时间格式转换(format)
  • 第8篇、Kafka 监控与调优实战指南
  • R 语言查看类库源码的方法
  • 理解并发编程:自旋锁、互斥锁与读写锁的解析
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频内容理解与智能预警升级
  • 腾讯元宝 Java 中的 23 种设计模式(GoF 设计模式)
  • Excel:根据数据信息自动生成模板数据(多个Sheet)
  • hibernate和mybatis的差异,以及这种类似场景的优缺点和选择
  • 设计模式之:观察者模式
  • 【pycharm】ubuntu24.04 安装配置index-tts及webdemo快速上手
  • Java 设计模式——观察者模式:从 4 种写法到 SpringBoot 进阶
  • “光敏” 黑科技:杜绝手机二维码读取时的 NFC 误触
  • AIGC(生成式AI)试用 36 -- shell脚本(辅助生成)