数据结构及八种常用数据结构简介

data-structure

数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。

常用的数据结构有 数组(array)、栈(stack)、队列(queue)、链表(linked list)、树(tree)、图(graph)、堆(heap)、散列表(hash)。


开局一张图 内容全靠编!
data-structure and algorithm

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 存放在该下标所对应的数组空间里。这种存储结构充分利用了数组的查找优势,所以查找速度很快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/163974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详细步骤记录:持续集成Jenkins自动化部署一个Maven项目

Jenkins自动化部署 提示:本教程基于CentOS Linux 7系统下进行 Jenkins的安装 1. 下载安装jdk11 官网下载地址:https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.g…

关于卓越服务的调研报告

NetSuite知识会发起的本次调研从2023年11月2日开始,到11月12日结束。16日已向参与调研的朋友邮件回复,感谢您的付出!今朝分享此报告,各位同学参考。 调研问题与反馈总结 问题1:您能想到哪些服务组织能够提供高满意度&…

[CUDA]去除Eigen库中的warning

一、问题提出 假如使用nvcc对cuda代码进行编译时,如果代码中使用了Eigen库(头文件),编译时可能会显示很多warning information,如下图红框中所示: 这些warning信息虽然不会影响代码的实际运行,…

linux如何使用Xshell远程连接

目录 1、创建虚拟机: 2、使用命令查看网段信息 拓展1:(若网卡上没有网段信息,可以使用任意两种方法): 准备工作: 1、点击左上角的编辑后再点击虚拟网络编辑器。 2、打开以后&#xff0c…

C++__string

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、string是什么? 二、string的构造函数 1.string(); 2.string(const char * s)&…

PHP常用的数组函数

PHP是一种流行的服务器端脚本语言,广泛用于Web开发。数组是PHP中最重要且最常用的数据类型之一,它提供了许多强大的数组函数,用于在数组上执行各种操作。在本文中,我们将深入解析PHP中一些常用的数组函数,以便更好地理…

07.webpack的性能优化 -- 产出代码

目标: 体积更小合理分包,不重复加载速度更快,使用内存更小 实现功能 小图片的base64编码提取公共代码bundle加hashIngorePlugin懒加载使用CDN使用productionScope Hosting 1. 使用production module.exports smart(webpackCommonConf, …

MyBatis 操作数据库(构造动态 SQL)

前言 动态 SQL 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if> 标签 我们在填写用户信息的时候经常会看到如下的界面&#xff0c;用户信息中包含必填信息和非必填信息&#xff0c;非必填信息是填和不填都可以的&#xff0c;那这样的话…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

JVM虚拟机:CMS垃圾回收器的日志分析

本文重点 本文我们将学习CMS垃圾回收器的日志 使用CMS java -Xms20M -Xmx20M -XX:PrintGCDetails -XX:UseConcMarkSweepGC 类名 日志格式 分析 上面的日志我们分为了两部分&#xff0c;上面表示新生代&#xff0c;下面表示老年代。 ParNew表示年轻代收集器&#xff0c;6144…

基于springboot实现电子招投标系统【项目源码】

基于springboot实现电子招投标系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计&#xff0c;其不仅继承了Spring框架原来有的优秀特性&#xff0c;而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原本的Spri…

更新文章分类

CategoryController PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService //更新分类void update(Category category); CategoryServiceImpl Overridepublic void update(…

C++之内建函数对象

C之内建函数对象 算术仿函数 #include<iostream> using namespace std; #include<functional>//内建函数对象头文件 //内建函数对象 算术仿函数void test() {// negate 一元仿函数 取反仿函数negate<int>n;cout << n(100) << endl;//plus 二元仿…

基于FPGA的五子棋(论文+源码)

1.系统设计 在本次设计中&#xff0c;整个系统硬件框图如下图所示&#xff0c;以ALTERA的FPGA作为硬件载体&#xff0c;VGA接口&#xff0c;PS/2鼠标来完成设计&#xff0c;整个系统可以完成人人对战&#xff0c;人机对战的功能。系统通过软件编程来实现上述功能。将在硬件设计…

前端为什么要工程化

前端为什么要工程化 文章目录 前端为什么要工程化传统开发的弊端一个常见的案例更多问题 工程化带来的优势开发层面的优势团队协作的优势统一的项目结构统一的代码风格可复用的模块和组件代码健壮性有保障团队开发效率高 求职竞争上的优势 现在前端的工作与以前的前端开发已经完…

【计算机毕业设计】Springboot 社区助老志愿服务系统-96682, 免费送源码,【开题选题+程序定制+论文书写+答辩ppt书写-原创定制程序】

Springboot 社区助老志愿服务系统 摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发…

Vue3-readonly(深只读) 与 shallowReadonly(浅只读)

Vue3-readonly(深只读) 与 shallowReadonly&#xff08;浅只读&#xff09; readonly(深只读)&#xff1a;具有响应式对象中所有的属性&#xff0c;其所有值都是只读且不可修改的。shallowReadonly(浅只读)&#xff1a;具有响应式对象的第一层属性值是只读且不可修改的&#x…

数据库的三范式(Normalization)

数据库的三范式&#xff08;Normalization&#xff09;是关系数据库设计中的基本理论原则&#xff0c;旨在减少数据冗余和提高数据库的数据组织结构。三范式通过将数据分解为更小的表&#xff0c;并通过关系建立连接&#xff0c;使得数据库设计更加灵活、规范和容易维护。在这篇…

同花顺,通达信,东方财富股票竞价,早盘板块、概念、题材竞价数据接口

早盘板块、概念、题材竞价数据接口 量化接口地址&#xff1a;https://stockapi.com.cn 通过分析每天早盘的板块竞价&#xff0c;从而判断出今日主力资金的看好方向 地址&#xff1a; https://stockapi.com.cn/v1/base/bkjjzq?tradeDate2023-11-08再结合个股竞价数据筛选出自…

数据库索引详解

数据库索引是一种用于提高数据库查询性能的关键技术。索引是一种数据结构&#xff0c;可以加速数据库中数据的检索过程。在本文中&#xff0c;我们将详细讨论数据库索引的定义、类型、优缺点以及如何选择和优化索引。 1. 什么是数据库索引&#xff1f; 数据库索引是一种数据结…