数据结构及八种常用数据结构简介
data-structure
数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。
常用的数据结构有 数组(array)、栈(stack)、队列(queue)、链表(linked list)、树(tree)、图(graph)、堆(heap)、散列表(hash)。
开局一张图 内容全靠编!

1、定义
数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。
常用的数据结构有 数组(array)、栈(stack)、队列(queue)、链表(linked list)、树(tree)、图(graph)、堆(heap)、散列表(hash)。
数据结构与算法常作为一个术语出现,这里的算法用来操作数据结构中的元素的,如检索、插入、删除、更新、排序等。
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。同时,算法的设计取决于数据的逻辑结构,而算法的实现却依赖于指定的存储结构。
2、研究对象
2.1、逻辑结构
逻辑结构是指反映数据元素之间的逻辑关系的数据结构,其中逻辑关系是指数据元素之间的前后间关系,而与它们的存储位置无关。
逻辑关系包括:
- 集合:数据结构中的元素除了 “属于同一集合” 的关系外,别无其它关系。
- 线性关系:数据结构中的元素存在一对一的相互关系。
- 树形结构:数据结构中的元素存在一对多的相互关系。
- 图形结构:数据结构中的元素存在多对多的相互关系。
2.2、物理结构
物理结构是指数据在计算机存储空间的存放形式。
数据物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和逻辑关系的机内表示。
数据元素的机内表示:
用二进制位(bit)的位串表示数据元素,通常称这种位串为节点(node)。当数据元素由若干个数据项组成时,位串中与各数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示。
逻辑关系的机内表示:
逻辑关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构,即顺序存储结构和非顺序存储结构。顺序映像借助数据元素在存储器内的相对位置来表示数据元素之间的逻辑关系,非顺序映像借助指示数据元素存储位置的指针来表示数据元素之间的逻辑关系。
物理结构的实现方法分为顺序存储和非顺序存储。
- 顺序存储:
- 特点:借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
- 常用的有 顺序存储 等。
- 非顺序存储:
- 特点:借助指示数据元素存储位置的指针来表示数据元素之间的逻辑关系。
- 常用的有 链式存储、索引存储、哈希存储 等。
3、分类
数据结构有很多种,一般来说,按照其逻辑结构可以分为 线性结构 和 非线性结构 两大类。
3.1、线性结构
线性结构是指各个数据元素之间具有线性关系。栈、队列 等就属于线性结构。从数据结构的角度来看,其有以下特点:
- 线性结构是非空集。
- 线性结构有且仅有一个开始结点和终端结点。
- 线性结构的所有结点都最多只有一个直接前驱结点和一个直接后继结点。
3.2、非线性结构
非线性结构是指各个数据元素之间有多个对应关系。数组、树、图 等就属于非线性结构。从数据结构的角度来看,其有以下特点:
- 非线性结构是非空集。
- 非线性结构的一个结点可能有多个直接前驱节点和多个直接后继节点。
4、常用数据结构
常用数据结构包括 数组(array)、栈(stack)、队列(queue)、链表(linked list)、树(tree)、图(graph)、堆(heap)、散列表(hash)。
4.1、数组(array)
数组是一种聚合数据类型,它是将具有相同类型的若干变量有序的组织在一起的集合。一个数组可以分解为多个数组元素。按照元素类型,数组可以分为 整型数组、字符型数组、浮点型数组 等。数组元素是通过下标进行访问的,且下标从 0 开始。
// java 定义一个数组
String[] strings = new String[] { "zed", "fizz", "ahri" }
优点:
- 根据下标遍历和检索速度快。
缺点:
- 数组大小固定后无法扩容。
- 数组只能存储同一类型的数据。
- 插入、删除操作慢,因为要移动其他元素。
适用场景:检索多、增删少的情况。
4.2、栈(stack)
栈是一种特殊的线性表,它只能在表的一个固定端进行数据元素的插入和删除。栈按照 先进后出或后进先出 的原则存储数据,即先插入的数据被压入栈底,后插入的元素放在栈顶。读数据时,从栈顶开始读。插入亦称入栈,读取亦称出栈。

适用场景:栈长应用于实现递归功能方面的场景。
注:线性表是一种最简单的数据结构。
4.3、队列(queue)
队列和栈一样,也是一种特殊的线性表。队列按照 先进先出 的原则存储数据。和栈不同的是,队列只允许在一端进行插入操作,在另一端进行读取操作。插入操作的一端称为队尾,取出操作的一端称为队首。

适用场景:由于其先进先出的特点,队列常用在多线程应用中。
4.4、链表(linked list)
链表是一种数据元素按照 链式存储结构 存储的数据结构,这种存储结构具有在物理上非连续的特点。链表由一系列数据结点组成,每个数据结点包含数据域和指针域两部分,其中指针域存放了数据结构中下一个元素的存放地址。链表数据结构中数据元素的逻辑关系是通过链表中指针的链接次序来实现的。根据指针的指向,链表可以形成不同的结构,如单链表、双向链表、循环链表等。

优点:
- 不需要初始化容量,可以任意增删元素。
- 插入和删除操作速度很快,只需要改变前后两个结点的指针域即可。
缺点:
- 因为含有大量指针域,所以占用空间较大。
- 查找元素时需要遍历链表,非常耗时。
适用场景:数据量小、插入删除操作多的情况。
4.5、树(tree)
树是一种典型的非线性数据结构,它是由 n(n >= 1)各有限节点组成的具有层次关系的集合。

其特点是:
- 每个节点有零个或多个子节点。
- 没有父节点的节点称为根节点。
- 每一个非根节点只有一个父节点。
- 除根节点外,每个子节点可以分为多个不相交的子树。
树 数据结构有很多扩展结构,如二叉树、平衡树、 B 树、B+ 树、红黑树等。其中最常用的是二叉树。
二叉树插入、删除元素很快,且在查找方面也有很多优化算法,所以二叉树既有数组的优点,也有链表的好处,是两者的优化方案,在处理大批量动态数据方面非常有用。
树的种类:
- 无序树:树的任意节点的子节点没有顺序关系。
- 有序树:树的任意节点的子节点有顺序关系。
- 二叉树:树的任意节点至多包含两颗子树。
- 满二叉树:叶子节点都在同一层且除叶子节点外的所有结点有且只有两个子节点。
- 完全二叉树:对于一颗二叉树,假设其深度为 d(d > 1),除第 d 层外的所有节点构成满二叉树,且第 d 层所有节点从左向右连续紧密的排列。
- 平衡二叉树:它是一棵空树或左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都为平衡二叉树,同时,平衡二叉树必定为二叉搜索树。
- 二叉搜索树:若任意节点的左子树不为空,则左子树上的所有节点值均小于该节点的值;若任意节点的右子树不为空,则右子树上的所有节点值均大于该节点的值;任意节点的左右子树也为二叉搜索树。
- 哈夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树。
- 红黑树:红黑树是一种特殊的二叉搜索树,除了二叉搜索树的特点外,其还包括一下特性:1、每个节点为黑色或红色;2、根节点时黑色;3、若叶子节点为 null 或 nil,则其为黑色;4、若一个节点为红色,则其子节点必须为黑色;5、从一个节点到该节点的子孙各路径上包含相同数目的黑节点。
- B 树:详见 /database/about mysql.md。
- B + 树:详见 /database/about mysql.md。
4.6、图(graph)
图是另一种非线性数据结构。是由顶点的有穷集合 V 和边的集合 E 组成。数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。
按照顶点指向的方向可分为有向图和无向图。

图是一种较复杂的数据结构,在存储数据上有着较复杂和高效的算法,如 邻接矩阵、邻接表、十字链表、邻接多重表、边集数组等存储结构。
4.7、堆(heap)
堆是一种特殊的树数据结构,一般讨论的堆都是二叉堆。堆的特点是根节点的值是所有节点中的最大值或最小值,为最大值时称为最大堆或大根堆;为最小值时称为最小堆或小根堆。且所有子节点也是堆结构。

适用场景:因堆有序的特点,所以常用来做排序。
4.8、散列表(hash)
散列表也叫哈希表,源自于散列函数(hash function),其思想是如果在结构中存在关键字和 T 相等的记录,那么必定在 f(T) 的存储位置可以找到该记录,这样就可以不用比较而直接获取需要查找的记录。

f 即为散列函数,又称哈希函数。则散列表是将 key 通过散列函数转换成一个整型数字,然后将该数字对数组长度进行取余,取余即是数组的下标,最后将 value 存放在该下标所对应的数组空间里。这种存储结构充分利用了数组的查找优势,所以查找速度很快。
相关文章:
数据结构及八种常用数据结构简介
data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。 常用的数据结构有 数组(array)、栈&…...
阿里云配置ssl(Apache)
阿里云申请证书,有个专门的免费的申请方式与普通证书是平级的功能; 访问服务器,判断apache是不是开启ssl功能,如果没有安装就安装它 [rootcentos ~]# rpm -qa | grep mod_ssl //什么没显示说明没装 yum install mod_ssl openssl …...
阿里云linux升级新版本npm、nodejs
在阿里云服务器上编译部署NextJS工程发现 alibaba linux默认yum install npm安装的版本太低, 使用以下方式升级node、npm新版本。 1、卸载现有版本 yum remove nodejs npm -y2、安装新版本 sudo yum install https://rpm.nodesource.com/pub_21.x/nodistro/repo/nodesource-…...
如何在el-tree懒加载并且包含下级的情况下进行数据回显-02
上一篇文章如何在el-tree懒加载并且包含下级的情况下进行数据回显-01对于el-tree懒加载,包含下级的情况下,对于回显提出两种方案,第一种方案有一些难题无法解决,我们重点来说说第二种方案。 第二种方案是使用这个变量对其是否全选…...
Pytorch 网络冻结的三种方法区别:detach、requires_grad、with_no_grad
1、requires_grad requires_gradTrue # 要求计算梯度; requires_gradFalse # 不要求计算梯度;在pytorch中,tensor有一个 requires_grad参数,如果设置为True,那么它会追踪对于该张量的所有操作。在完成计算时可以通过调…...
如何定位el-tree中的树节点当父元素滚动时如何定位子元素
使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器,使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值: 如果为 true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…...
【WiFI问题自助】解决WiFi能连上但是没有网的问题
WiFi能连上但是没有网的问题 背景:wifi能连上,但是没有网 解决 遇事不决,先重启啊!怎么重启?拔掉电源再插上!拔掉网线再插上! 直接ok了。 思考记录 今天WiFi又上不了网了,昨天报…...
论文阅读:JINA EMBEDDINGS: A Novel Set of High-Performance Sentence Embedding Models
Abstract JINA EMBEDINGS构成了一组高性能的句子嵌入模型,擅长将文本输入转换为数字表示,捕捉文本的语义。这些模型在密集检索和语义文本相似性等应用中表现出色。文章详细介绍了JINA EMBEDINGS的开发,从创建高质量的成对(pairwi…...
计数排序.
一.定义: 计数排序(Counting Sort)是一种非比较性质的排序算法,其时间复杂度为O(nk)(其中n为待排序的元素个数,k为不同值的个数)。这意味着在数据值范围不大并且离散分布的情况下,规…...
flink中配置Rockdb的重要配置项
背景 由于我们在flink中使用了状态比较大,无法完全把状态数据存放到tm的堆内存中,所以我们选择了把状态存放到rockdb上,也就是使用rockdb作为状态后端存储,本文就是简单记录下使用rockdb状态后端存储的几个重要的配置项 使用rockdb状态后端…...
代码随想录二刷 | 数组 | 有序数组的平方
代码随想录二刷 | 数组 | 有序数组的平方 题目描述题目分析 & 代码实现暴力排序双指针法 题目描述 977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 …...
基于单片机C51全自动洗衣机仿真设计
**单片机设计介绍, 基于单片机C51全自动洗衣机仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机C51的全自动洗衣机仿真设计是一个复杂的项目,它涉及到硬件和软件的设计和实现。以下是对这…...
「Verilog学习笔记」实现3-8译码器①
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路,同时要求采用基础逻辑门实现,那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…...
Centos(Linux)服务器安装Dotnet8 及 常见问题解决
1. 下载dotnet8 sdk 下载 .NET 8.0 SDK (v8.0.100) - Linux x64 Binaries 拿到 dotnet-sdk-8.0.100-linux-x64.tar.gz 文件 2. 把文件上传到 /usr/local/software 目录 mkdir -p /usr/local/software/dotnet8 把文件拷贝过去 mv dotnet-sdk-8.0.100-linux-x64.tar.gz /usr/loc…...
最强人工智能ChatGPT引领AIGC发展
从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- ——AI不会淘汰所有人,但会淘汰不懂AI的人 一、最强人工智能GPT-4 Turbo 在前不久的OpenAI开发者大会,正值Chatgpt3.5发布一…...
10.Oracle的同义词与序列
oracle11g的同义词与序列 一、Oracle同义词:1、同义词的基本使用2、同义词的相关权限3、同义词的作用范围 二、Oracle序列:1、序列的基本操作2、序列的相关权限 一、Oracle同义词: 同义词是一个数据库对象的别名,它允许用户通过不…...
【周报2023-11-10】
周报2023-11-10 本周的主要工作下周工作计划 本周的主要工作 本周的主要工作就有三个 第一个是进行对我们目前的高企项目的完善情况第二个是对于高企项目的接口对接情况以及细节的把控第三个为新的小程序项目做准备工作 首先第一个高企项目的完善情况得话主要是页面上 对于原…...
搜维尔科技:业内普遍选择Varjo头显作为医疗VR/AR/XR解决方案
Varjo 的人眼分辨率混合现实和虚拟现实头显将医疗专业人员的注意力和情感投入提升到更高水平。借助逼真的 XR/VR,医疗和保健人员可以为最具挑战性的现实场景做好准备! 在虚拟、增强和混合现实中进行最高水平的训练和表现 以逼真的 3D 方式可视化医疗数据…...
数据结构02附录01:顺序表考研习题[C++]
图源:文心一言 考研笔记整理~🥝🥝 之前的博文链接在此:数据结构02:线性表[顺序表链表]_线性链表-CSDN博客~🥝🥝 本篇作为线性表的代码补充,每道题提供了优解和暴力解算法…...
ClientDateSet:Cannot perform this operation on a closed dataset
一、问题表现 Delphi 三层DataSnap,使用AlphaControls控件优化界面,一窗口编辑时,出现下列错误提示: 编译通过,该窗口中,重新显示数据,下图: 相关代码: procedure…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
