数据结构知识点总结
一、常见的数据结构
数组,栈,队列,链表,散列表,二叉树,堆,跳表,图,树。
1. 数组:
数组的元素在内存中存储是连续存放的,占有连续的存储单元(连续的内存空间);且容量固定(定容);只能存储一种类型的数据;添加、删除操作慢,因为要移动其他元素(提供随机访问,但插入删除操作慢)。
访问的时间复杂度:O(1);
插入/删除的时间复杂度:O(n)。
2. 栈:
后进先出,栈顶入栈,栈顶出栈。栈常应用于实现递归功能方面的场景,如斐波那契数列。
栈常由一维数组或链表表示,分别叫做顺序栈和链式栈。
不同的出栈排列个数:

常用的操作有:入栈push,出栈pop。
访问的时间复杂度:O(n)(最坏);
插入/删除的时间复杂度:O(1)。
应用:浏览器的倒退和前进;检查符号是否成对出现(如果是左括号就直接push到stack中,否则将stack的栈顶元素与该括号做比较,不相等就直接返回false);翻转字符串;维护函数调用等。
3. 队列:
先进先出,在多线程阻塞队列管理中非常适用。
队列用数组或链表实现,分别叫做顺序队列和链式队列。
访问的时间复杂度:O(n)(最坏);
插入/删除的时间复杂度:O(1)。
单队列:顺序队列(由数组实现,会出现假溢出现象)和链式队列。
循环队列:解决假溢出和越界问题。循环队列判断队满的常用方法是①设置flag标志位;②使用一个空闲位。
双端队列:元素可以从队头出队和入队,也可以从队尾出队和入队。
优先队列:由堆实现。
***循环队列中元素个数求法:(rear-front+m) % m(取余) ,其中,rear:队列尾指针,front:队列头指针,m:队列容量。
***循环队列中区分队空和队满的方法:
(1)牺牲一个存储单元(入队时少用一个队列单元):
队满条件:(q.rear+1)%maxsize == q.front
队空条件:q.front == q.rear
(2)增设表示元素个数的数据成员:
队满条件:q.size == MaxSize
队空条件:q.front == q.rear
(3)增设tag数据成员:
队满条件:tag == 1
队空条件:tag == 0
4.链表:
物理存储单元上非连续的,非顺序的存储结构;每个元素包含两个节点:数据域和指针域;不需要初始化容量,可以任意加减元素,只需要改变前后2个元素节点的指针域指向地址即可。
***如何判断链表是否有环?
(1)穷举遍历:设一个检测指针k和一个遍历指针q,count记录q走的步数,q每走一步,k就走q之前走过的节点,若发现相同的节点就说明有环。q=NULL时遍历完整个链表。时间复杂度是O(n^2),空间复杂度是O(1)。
(2)标记法:设置一个标记变量,每走一个节点,就判断一次,若visit=true则有环,反之无环。时间复杂度是O(n),空间复杂度是O(n)。
5. 散列表(哈希表):
根据键(key)而直接访问在内存存储位置的数据结构。哈希表建立了关键字和存储地址之间的一种直接映射关系。
- 构造方法:
(1)直接定址法:直接取关键字的某个线性函数为哈希地址。
(2)除留余数法:假定哈希表长度为m,取一个不大于m但最接近于/等于m的质数P,利用公式H(key)=key%P将关键字转化为哈希地址。
(3)数据分析法:设关键字是r进制数,选取数码分布较为均匀的若干位作为哈希地址。
(4)平方取中法:取关键字的平方值的中间几位作为哈希地址。
- 哈希冲突的解决方法:
(1)开放寻址法:线性探查法,平方探查法,双重散列探查法,伪随机探查法。
(2)拉链法(链地址法)
(3)再哈希法

6. 非线性数据结构——图:
图的存储使用:①邻接矩阵:二维矩阵,如A[i][j]=n(权值)或者A[i][j]=0/1,无线图的邻接矩阵是对称矩阵。邻接矩阵比较浪费空间。
②邻接表:如下图所示,在无向图中,邻接表元素的个数=边的条数*2;在有向图中,邻接表元素的个数=边的条数。

7. 非线性数据结构——堆:
堆不一定是完全二叉树,任意一个节点的值都 ≥(或≤)所有子节点的值,堆通常用数组表示。
堆的插入和删除效率高,时间复杂度是O(logn),初始化的时间复杂度是O(n)。
***若根节点的序号为1,那么树中任意节点 i,其左子节点序号为 2i,右子节点为 2i+1。
①自底向上堆化:会产生“气泡”浪费存储空间,用于插入元素,即先将元素放至数组末尾,上浮。
②自顶向下堆化:用于删除堆顶元素,将末尾元素放至堆顶,再向下堆化,下沉。
根的下标一定为0,最后一个元素的下标一定为size-1.
已知一个节点下标为index,那么,他的双亲下标为(index-1)/2,左孩子的下标为2*index+1,右孩子的下标为左孩子下标+1。
8. 非线性数据结构——树:
n个节点,n-1条边。
高度:该节点到叶子节点的最长路径所包含的边数。
深度:根节点到该节点的路径所包含的边数。
层数:节点的深度+1。

二叉树(链式存储或顺序存储):第 i 层至多有 2^(i-1) 个节点,深度为k的二叉树至多共有 2^(k+1)-1 个节点(满二叉树),至少共有 2^k 个节点。
完全二叉树:除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则这个二叉树就是 完全二叉树 。
平衡二叉树:空或者左右子树的高度差绝对值不超过1,且左右子树都是一颗平衡二叉树。平衡二叉树的常用实现方法有 红黑树、AVL 树、替罪羊树、加权平衡树、伸展树 等。
红黑树:每个节点非红即黑,根节点是黑色节点,叶节点都是黑色的空节点。
二叉树的存储主要分为 链式存储 和 顺序存储 两种:
(1)链式存储:和链表类似,二叉树的链式存储依靠指针将各个节点串联起来,不需要连续的存储空间。
每个节点包括三个属性:
- 数据 data。data 不一定是单一的数据,根据不同情况,可以是多个具有不同类型的数据。
- 左节点指针 left
- 右节点指针 right。
(2) 顺序存储:利用数组进行存储,数组中的每一个位置仅存储节点的 data,不存储左右子节点的指针,子节点的索引通过数组下标完成。根结点的序号为 1,对于每个节点 Node,假设它存储在数组中下标为 i 的位置,那么它的左子节点就存储在 2i 的位置,它的右子节点存储在下标为 2i+1 的位置。如:

树的存储方式图片来自:树 | JavaGuide(Java面试 + 学习指南)
二叉树的遍历:
(1)先序遍历(根左右);(2)中序遍历(左根右);(3)后序遍历(左右根)。
注:由先序序列和后序序列不能重现一颗二叉树。先序、后序、层序序列的两两组合无法唯一确定一棵二叉树。
可以通过①先序+中序;②后序+中序;或者③层序+中序 序列构造一颗二叉树。
二、常用算法
递归,排序,二分查找,搜索,哈希算法,分治算法,动态规划,字符串匹配算法等。
相关文章:
数据结构知识点总结
一、常见的数据结构 数组,栈,队列,链表,散列表,二叉树,堆,跳表,图,树。 1. 数组: 数组的元素在内存中存储是连续存放的,占有连续的存储单元&am…...
【经济研究】数字技术创新与中国企业高质量发展—来自企业数字专利的证据
数据简介:在当前数字经济时代,数字技术创新已成为驱动中国经济发展的核心要素,中国经济由高速增长转向高质量发展的“新常态”发展阶段,开启了革新经济增长方式,优化产业结构,寻找新的经济增长动能关键期。…...
Windows运维相关经验技巧
常用工具 在线PS Photoshop在线 FAQ 电脑能上网,浏览器上不了网 # 错误原因: 设置了网络代理,浏览器无法通过网络代理上网# 解决办法 关闭网络代理 (1)wini,打开设置 (2)网络和I…...
AYIT嵌入式实验室2023级C语言训练1-4章训练题
文章目录 前言1. 判断闰年2.(ab-c)*d的计算问题3.计算三角形的周长和面积4.牛牛的等差数列5.判断字母6.网购7. 牛牛的通勤8.获得月份天数9.大小写转换10.KiKi说祝福语11.小乐乐求和12.奇偶统计13.KiKi求质数个数14.乘法表15.牛牛学数列16.牛牛学数列217.数位之和18.魔法数字变换…...
trino tpcds测试
先下载tpcds-kit(有Linux和macOS),根据其文档生成数据和查询的sql。 然后hive-testbench,在ddl-tpcds/text/alltables.sql中有建表语句(用hive建表)。 建完表后LOAD DATA local INPATH "/Users/ding…...
SpringCloud学习笔记(上):服务注册与发现:Eureka、Zookeeper、Consul+负载均衡服务调用:Ribbon
壹、零基础 一、微服务架构零基础理论入门 SpringCloud分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。 二、从2.2.x和H版开始说起 springboot版本选择: git源码地址:https://github.…...
JavaPTA练习题 7-3 身体质量指数(BMI)测算
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI…...
类的属性和方法(java)
类和对象的使用 创建类,设计类的成员创建类的对象通过“对象.属性”或“对象.方法”调用对象的结构 代码 public class Per {public static void main(String[] args) {// TODO Auto-generated method stub//创建Person类的对象Person p1 new Person();//Scanne…...
C++模拟实现——list
一、成员变量及其基本结构 1.基本结构模型 本质是一个带头双向循环列表,将节点进行封装,并且为了方便使用,进行重定义 2.节点的封装定义 template<class T>//定义节点struct list_node{list_node<T>* _prev;list_node<T>…...
FPGA的音乐彩灯VHDL流水灯LED花样,源码和视频
名称:FPGA的音乐彩灯VHDL流水灯LED 软件:Quartus 语言:VHDL 代码功能: (1)设计一彩灯控制电路,按要求控制8路(彩灯由发光 二极管代替,受实验箱限制,多路同…...
企业知识库软件,快速构建企业知识分享与团队协同的软件
企业知识库是一种特殊的在线协同文档工具,支持包括FAQ、文档、视频、知识图谱等。从本质上讲,它是基于企业知识库软件从而实现内部或外部知识的沉淀、集合、更新、共享等,能为员工或客户提供常见问题的标准回答。 今天我就基于HelpLook &…...
Java,输出一个10行的杨辉三角
据图可以发现,杨辉三角是每行的首元素和末元素都为1,中间的元素都是等于它上面的元素加上左上角的元素。 首先,先完成二数组的创建和初始化,第一行的长度为一,第二行的长度为二……以此类推。所以,外元素的…...
Java版Http请求post和get两种调用实现
在实际项目中常涉及到相互调用,对于http接口的调用,需要经过建立连接,拼接参数,调用等步骤,记录下来,方便查看。 第一步、引入jar包 pom中引入apache的httpclient包 <dependency><groupId>c…...
yjs demo: 多人在线协作画板
基于 yjs 实现实时在线多人协作的绘画功能 支持多客户端实时共享编辑自动同步,离线支持自动合并,自动冲突处理 1. 客户端代码(基于Vue3) 实现绘画功能 <template><div style"{width: 100vw; height: 100vh; over…...
虹科分享 | 赋能物流机器人:CANopen通信如何发挥重要作用?
现代物流领域迅速融入了技术进步,特别是随着自主机器人的兴起,这一趋势越发明显。确保这些机器人在复杂的仓库环境中精确运行的一个关键方面是CANopen通信协议。该协议集成了各种组件(电机、传感器、摄像头和先进的电池系统)&…...
南丁格尔玫瑰图
目录 由来 效果图 echarts官网找相似图 将南丁格尔玫瑰图引进html页面中 引入echarts 准备容器 初始化echarts实例对象 指定配置项和数据(官网给的option) 将配置项给echarts 自定义南格丁尔玫瑰图 修改颜色 修改玫瑰图大小 修改图的模式为半…...
vue 大文件切片下载
前提是你上传的时候也是切片上传,下载的时候后端给你返回的是一个文件id的数组,如果是你就可以用下面的方法 // 循环下载文件 // id是每个文件的id type 是一个类型,我传入是应为给不同的组件赋值getFile(id, type) {// 通过wen文件id去获取…...
2023年“绿盟杯”四川省大学生信息安全技术大赛
pyfile 先check源码,没什么发现,接着进行目录扫描,扫到路径 /download 下载备份文件得到 www.zip,解压得到app.py 大致审一下代码: 在read目录下给file传参进行请求,如果这个东西存在就会读取出来 这里…...
YOLOv8改进实战 | 更换主干网络Backbone(二)之轻量化模型GhostnetV2
前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…...
【C++代码】二叉搜索树的最近公共祖先,二叉搜索树中的插入操作,删除二叉搜索树中的节点--代码随想录
题目:二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&a…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

