数据结构复习记录
基本概念



线性表
线性表是最简单也最常用的一种数据结构,是由n( n ≥ 0 n\geq0 n≥0)个类型相同的数据元素组成的有限序列,是一种逻辑结构,有两种表示方式(即存储结构):顺序表示和链式表示。
栈和队列
栈:一种只能在一端进行进行插入和删除操作的线性表。特点:后进先出,存储结构:顺序存储和链式存储。
队列:一种运算受限的线性表,插入在队尾,删除在队头。特点:先进先出,存储结构:顺序、链式。
字符串
由n( n ≥ 0 n\geq0 n≥0)个字符的顺序排列所组成的线性表。一般会在串的最后添加一个结束标记'\0'表示串的结尾。
数组
数组分为一维数组和多维数组。一维数组是相同类型的元素在连续存储空间上的排列的集合。
数组的压缩存储
稀疏矩阵:非零元素的个数远小于零元素个数,可由如下方式表示:
- 三元组表:通过(行下标、列下标、值)三元组来唯一的表示一个元素,属于顺序存储结构。
- 十字链表:每个节点保存(head, value, row, column, down, right)这六个值,down和right分别指向行和列上的下一个非零元素,属于链式存储结构。
树
树是n( n ≥ 0 n\geq0 n≥0)个节点的有限集合。
存储表示法有:
- 双亲表示法:每个节点保存(data, parent),顺序存储。
- 子女链表示法:每个节点保存(data, first),first指向子女链表,每个节点顺序存储。
- 子女兄弟链表表示法:树的二叉树表示法,每个节点保存(data, first_child, firs_brother),其实就是转一个角度看。
- 广义表表示法:(A(B(D(G,H,I)),C(E,F)))

二叉树
一些特殊的二叉树:

存储结构可以是线性或者链表,线性适合满二叉树或者完全二叉树,否则会造成空间浪费。
二叉树的一些特性:
- 第 i ( i ≥ 1 ) i(i\geq1) i(i≥1)层,至多有 2 i − 1 2^{i-1} 2i−1 个节点。
- 深度为 k ( k ≥ 1 ) k(k\geq1) k(k≥1),节点个数n: k ≤ n ≤ 2 k − 1 k \leq n \leq 2^k-1 k≤n≤2k−1
- 叶节点数等于度为2的节点的个数+1(数学归纳法可以证明)
- n节点完全二叉树的深度为 l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)向上取整。
树、森林
树、森林、二叉树的转换:都是唯一的
- 森林->二叉树:就是先把每棵树转化为二叉树,由于这样得到的二叉树的根节点没有右子节点,所以把第n棵树作为n-1棵树的右子节点即可。
- 二叉树->树/森林:如果右子节点为空,直接转化为树,否则先拆成n个右子节点为空的二叉树,再转化为森林
树的遍历:
- 深度优先
- 先序遍历
- 后序遍历
- 广度优先
森林的遍历:
- 深度优先
- 先序遍历:先访问第一个树的根,然后第一棵树的子树,然后其他树
- 中序遍历:先访问第一棵树的子树,第一棵树的根,然后其他子树
- 广度优先
树和森林的先序遍历、中序遍历、后序遍历、广度优先遍历都和转化为的二叉树的结果一致。非常巧妙!!!
哈夫曼树
权重小的路径更长。
图
由顶点集合V和顶点间的关系集合E组成的一种数据结构。存储结构有
- 邻接矩阵
- 邻接表:每个顶点节点(data, adj),adj指向一个链表,依次连接和顶点相连的顶点。
- 无向图的邻接多重表表示:每个顶点节点(data, firstout),firstout指向一个边节点,边节点的结构包括(mark, vertex1, vertex2, path1, path2),path* 指向依附于vertex*的下一条边。
- 有向图的十字链表表示:顶点节点包括(data, firstin, firstout),边节点包括(mark, vertex1, vertex2, nextout, nextin)
遍历:深度优先,广度优先
一些概念:
- 强连通图:有向图中,连通且1到2和2到1都有路径。
- 连通分量:非连通图的极大连通子图
- 生成树:一个无向连通图的生成树是它的极小连通子图
最小生成树
- Prim:从1个顶点扩张到所有顶点,每次选取已选顶点和未选顶点中最小的边
- Kruskal:每次选择一个权重最小的、两个顶点分别来自两个连通分量的边,把两个连通分量联合起来,直到只剩一个连通分量。
活动网络
AOV网络:用顶点表示活动的有向图
AOE网络:用边来表示活动的有向图,边上的权值表示活动的持续时间
关键路径:AOE网络上从源点到汇点具有最大长度的路径。特征:最早开始时间等于最晚开始时间。
最短路径
- Dijkstra算法:非负权值的单源最短路径
- Floyd算法:非负权值的所有顶点之间的最短路径
查找
- 顺序查找:又称线性查找
- 折半查找:又称二分查找,前提是有序存储
- 分块查找:又称索引顺序查找,把线性表分块,块中的数据无序存储,块与块之间是有序的(当然不一定要有序存储,只是说一个块中的所有节点必须都小于或大于另一个块的所有节点),再建一个索引表,把每个块的最大关键码作为索引表的关键码,关键码按序存储,即通过二分查找找到所在的块,然后通过顺序查找在块中找到具体的数据。
- 散列查找:又称哈希法或杂凑法,Address=Hash(key)
二叉查找树
节点的值大于左子树,小于右子树。
平衡二叉树(AVL):平衡的二叉查找树,左右子树高度差不超过1
B树:高度平衡的m叉查找树
B+树:B树的特殊情况,所有关键码都放在叶子节点,上层非叶子节点的关键码是其子树最大关键码的复写。叶节点本身按从小到大的顺序连接。常用于数据库的索引,这样查找到每一个关键码的时间都是固定的。
内排序
- 比较排序:有O(n log n) 下限
- 冒泡排序:稳定
- 插入排序:稳定
- 选择排序:每次选择最小(大)的元素与未排序的部分的最前(后)面的元素交换。因为有交换,所以都不稳定。
- 直接选择排序:每次选择都把未排序的元素遍历一遍
- 树选择排序:第一次选择要遍历所有元素,然后构建一个树,数组的元素放在叶子结点,非叶子节点是两个子节点的最小值。之后的每次选择都只要从上次选择的元素所在的叶子结点开始往根节点走一遍即可。
- 堆排序:其实也是树排序,只不过可以直接在原数组上建立树(堆),节省空间。
- 希尔排序:gap>1的时候的交换会导致不稳定
- 快速排序:基准值的选取随机,所以不稳定。递归占据的空间为O(log N)~O(N)
- 归并排序:稳定,但是要额外创建数组,且有递归,空间复杂度为O(N)
- 基数排序:从低位到高位比较,稳定
- 非比较排序:没有O(n log n) 下限
- 计数排序,也叫鸽巢排序,只适用于整数
- 桶排序:或所谓的箱排序,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。
总结:稳定的只有冒泡、插入、归并、基数。

算法设计与分析
相关文章:
数据结构复习记录
基本概念 线性表 线性表是最简单也最常用的一种数据结构,是由n( n ≥ 0 n\geq0 n≥0)个类型相同的数据元素组成的有限序列,是一种逻辑结构,有两种表示方式(即存储结构):顺序表示和链式表示。 栈和队列 栈…...
Qt自定义checkbox实现按下回车键该项打勾
引言 开发环境代码结构示例代码运行效果总结使用qt实现一个列表,列表中每一项中的类似一个checkbox,通过上下键可以切换选中项,按下回车键在已经选中的项前出现对勾。效果如下: 20241203_163929 开发环境 使用ubuntu下QtCreator4.11.。 代码结构 这里将项目的结构截图贴…...
头歌作业 数据库与大数据管理 期末复习资料
1、 下列说法错误的是?c A、UserCF算法推荐的是那些和目标用户有共同兴趣爱好的其他用户所喜欢的物品 B、ItemCF算法推荐的是那些和目标用户之前喜欢的物品类似的其他物品 C、UserCF算法的推荐更偏向个性化 D、UserCF随着用户数目的增大,用户相似度…...
2023年华数杯数学建模A题隔热材料的结构优化控制研究解题全过程文档及程序
2023年华数杯全国大学生数学建模 A题 隔热材料的结构优化控制研究 原题再现: 新型隔热材料 A 具有优良的隔热特性,在航天、军工、石化、建筑、交通等高科技领域中有着广泛的应用。 目前,由单根隔热材料 A 纤维编织成的织物,…...
如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南
引言 在现代电商领域,数据的重要性不言而喻。亚马逊作为全球领先的电商平台,其页面上动态加载的内容包含了丰富的商品信息。然而,传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…...
在线钢琴源码
在线钢琴源码 是利用HTML5技术开发的在线钢琴应用,致力于为钢琴爱好者、音乐爱好者提供一个优雅、简洁的平台 在学习工作之余可以在线弹钢琴,享受音乐、生活的美好。自由钢琴支持自动演奏和手动演奏,简单易学,快来试试吧 源码截…...
【OpenDRIVE_Python】使用python脚本输出OD数据中含有信号灯地物的道路ID和信号灯信息
示例代码说明: 遍历OD数据中每条道路Road,若Road中存在信号灯地物signal,则将该道路ID和包含的所有信号灯输出到xml文件中。补充:一个Road中可能存在多个信号灯signal,这里取signal的上级标签signals,则将所有信号灯同…...
普中51单片机——LED流水灯模块
1、GPIO概念 GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51 单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、 控制以及数据采集的功能。 1.1、GPIO分类 &a…...
智已汽车x-signature 登录算法 签到
智已汽车x-signature 登录算法 签到 python代码成品...
浅谈留学essay之初级研究:What, why and how
所谓初级研究(primary research)指的是对研究者从观察、实践、访谈、问卷等第一手研究方法中得出的原始数据进行分析的研究方式。其主要特征是直接性(directness)、客观性(factual)、一手性(fir…...
Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。
项目启动5分钟,很明显有问题。像网上其他的提高jvm参数就不说了,应该不是这个问题,也就快一点。 首先找到自己的电脑名称(用命令行也行,只要能找到自己电脑名称就行,这里直接在共享里看)。 复制…...
电商营销活动-抽奖业务
目录 一、抽奖系统的核心功能 二、抽奖系统的业务逻辑 三、抽奖系统的业务优势 四、抽奖系统的业务注意事项 电商营销活动中的抽奖系统业务,是一种通过设立抽奖活动来吸引用户参与、提升用户活跃度和转化率的营销手段。以下是对电商营销活动抽奖系统业务的详细解…...
虚拟DOMdiff算法
一.什么是虚拟DOM? 虚拟DOM是 VUE 一个比较核心的概念,为什么会有虚拟DOM呢?首先可以与传统的网页开发做个对比,在没有 VUE 和 REACT 框架之前,我们都是使用原生 JavaScript 或者 jQuery,那时候是直接对 D…...
IDEA实现javaweb用户登录(增删改查)
IDEA实现javaweb用户登录(增删改查) 文章目录 IDEA实现javaweb用户登录(增删改查)前言一、IDEA 软件的简单使用1 创建一个普通 java 项目2 新增 web 配置将项目由普通的Java项目变为 javaweb项目2.1 新增 web 配置2.2 新增项目文件…...
JS进阶01-异步编程、跨域、懒加载
目录 一、异步编程 1.1.异步编程的基本概念与重要性 1.2.事件循环(Event Loop)机制 1.3.JavaScript异步编程的常见方式及详解 示例 1.4.异步编程的最佳实践 二、跨域 2.1.什么是跨域 2.2.怎么解决跨域 1. JSONP(JSON with Padding&…...
2012年 数模美赛 C题 犯罪克星
一、问题重述 银河犯罪建模中心(ICM)正在调查一个犯罪阴谋。调查人员已经识别出一些阴谋成员,但希望在逮捕之前确定其他成员和领导人。所有嫌疑人和可能的同谋者都受雇于同一家公司,并在一个大的综合办公室里工作。该公司正在开发…...
社区团购中 2+1 链动模式商城小程序的创新融合与发展策略研究
摘要:本文聚焦于社区团购这一新兴零售模式的发展态势,深入探讨 21 链动模式商城小程序与之融合的创新机制与应用策略。通过剖析社区团购的运营模式、优势特点以及发展现状,结合 21 链动模式商城小程序的功能特性,研究二者协同作用…...
【Go底层】time包Ticker定时器原理
目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究…...
RoBERTa- 稳健优化的 BERT 预训练模型详解
一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...
【C++】continue语句、goto语句
1、continue 语句 作用:在循环语句中,跳过本次循环中余下尚未执行的语句。继续下一次循环。 注意:continue只能用于循环中。 示例: 代码: //continue的用法 #include<iostream> using namespace std; int ma…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
