数据结构复习记录
基本概念
线性表
线性表是最简单也最常用的一种数据结构,是由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…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...

Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...