【数据结构大全】你想要的都有,数组、链表、堆栈、二叉树、红黑树、B树、图......

目录

1.概述

2.线性结构

3.时间复杂度

4.查找算法

5.树

6.图


1.概述

博主之前写过一个完整的关于数据结构的系列文章,一共十三篇,内容包含,数组、链表、堆栈、队列、时间复杂度、顺序查找、二分查找、二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树、大顶堆、小顶堆、图、DFS、BFS、最短路径算法。由于各篇文章分的比较散,本文中将对做一次清单式的总结,这是一份属于你的数据结构大全,请签收。

2.线性结构

文章链接:

数据结构(1)线性结构——数组、链表、堆栈、队列(介绍和JAVA代码实现)_线性结构中队列、数组、栈结构__BugMan的博客-CSDN博客

在线性数据结构中,数据元素之间存在一对一的关系,每个数据元素最多有一个直接前驱和一个直接后继。这种结构中,数据元素按照一定的顺序排列,形成一个线性序列。常见的线性数据结构包括数组、链表、栈和队列。

以下是一些常见的线性数据结构及其特点:

  1. 数组(Array)
    1. 数组是一种固定大小的线性结构,它在内存中分配一块连续的存储空间,用于存储相同类型的数据元素。
    2. 数组的访问是基于索引的,索引从 0 开始,通过索引可以快速访问数组中的元素。
    3. 插入和删除操作可能需要移动其他元素,因此在数组中执行这些操作可能较慢。
  2. 链表(Linked List)
    1. 链表是一种由节点组成的线性结构,每个节点包含数据元素和一个指向下一个节点的引用(或指针)。
    2. 链表分为单向链表和双向链表。双向链表的节点还包含一个指向前一个节点的引用。
    3. 链表的插入和删除操作相对较快,因为不需要移动其他元素,但访问元素可能较慢,需要遍历链表。
  3. 栈(Stack)
    1. 栈是一种后进先出(LIFO,Last In First Out)的线性结构,只能在栈顶进行插入和删除操作。
    2. 栈可以用于实现函数调用、表达式求值等场景,常用的操作包括压栈(push)和弹栈(pop)。
  4. 队列(Queue)
    1. 队列是一种先进先出(FIFO,First In First Out)的线性结构,元素只能从队列的一端插入,从另一端删除。
    2. 队列常用于实现任务调度、广度优先搜索等场景,常用的操作包括入队(enqueue)和出队(dequeue)。

3.时间复杂度

文章链接:

数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界__BugMan的博客-CSDN博客

时间复杂度是算法分析中用来衡量算法执行时间随输入规模增长而增长的速率。它通常用大O符号(O)来表示。时间复杂度不考虑精确的执行时间,而是关注算法运行时间的增长趋势。

时间复杂度分析的目的是衡量算法在不同规模的输入下的性能表现,从而可以选择更高效的算法来解决问题。

以下是一些常见的时间复杂度:

  1. O(1) - 常数时间复杂度
    1. 表示算法的执行时间与输入规模无关,无论输入多大,执行时间恒定。
    2. 典型的例子是访问数组中的特定元素、执行固定次数的操作等。
  2. O(log n) - 对数时间复杂度
    1. 表示算法的执行时间与输入规模的对数呈线性关系,随着输入规模增大,执行时间增长较慢。
    2. 典型的例子是二分查找,每次迭代将搜索范围缩小一半。
  3. O(n) - 线性时间复杂度
    1. 表示算法的执行时间与输入规模成线性关系,随着输入规模增大,执行时间也会线性增长。
    2. 典型的例子是对数组进行遍历、查找最大/最小值等。
  4. O(n log n) - 线性对数时间复杂度
    1. 表示算法的执行时间介于线性和平方之间,通常在大多数情况下,效率很高。
    2. 典型的例子是快速排序和归并排序。
  5. O(n^2) - 平方时间复杂度
    1. 表示算法的执行时间与输入规模的平方成正比,随着输入规模增大,执行时间迅速增长。
    2. 典型的例子是嵌套循环,例如选择排序和插入排序。
  6. O(n^k) - 多项式时间复杂度
    1. 表示算法的执行时间与输入规模的某个常数幂成正比,k 是一个常数。
    2. 典型的例子是冒泡排序等。
  7. O(2^n) - 指数时间复杂度
    1. 表示算法的执行时间随着输入规模呈指数级增长,通常效率非常低。
    2. 典型的例子是递归穷举算法。

4.查找算法

文章链接:

数据结构(3)基础查找算法——顺序查找、二分查找(JAVA版)__BugMan的博客-CSDN博客

查找算法,本系列包括两种:

  1. 线性查找(Sequential Search)
    1. 线性查找是最简单的查找算法,逐个遍历数据集合,比较每个元素是否与目标元素相等。
    2. 时间复杂度:O(n)(最坏情况下需要遍历所有元素)。
  2. 二分查找(Binary Search)
    1. 二分查找要求数据集合已排序。它将数据集合一分为二,然后与中间元素比较,根据比较结果确定目标元素在哪一半中,然后递归进行查找。
    2. 时间复杂度:O(log n)(每次比较都将数据集合减半)。
    3. 仅适用于有序数据。

5.树

树形结构里,本系列包含:

  1. 二叉树
  2. 二叉搜索树
  3. 平衡二叉树
  4. 红黑树
  5. B树
  6. B+树

文章链接:

数据结构(4)树形结构——二叉树(概述、前序、中序、后序、层序遍历JAVA实现)_树形图的结点顺序__BugMan的博客-CSDN博客

数据结构(5)树形结构——二叉搜索树(JAVA代码实现)_树形结构搜索__BugMan的博客-CSDN博客

数据结构(6)树形结构——平衡二叉树(JAVA代码实现)_java 平衡二叉树__BugMan的博客-CSDN博客

数据结构(7)树形结构——红黑树(概念、插入过程、删除过程)_红黑树1的插入和删除__BugMan的博客-CSDN博客

数据结构(8)树形结构——B树、B+树(含完整建树过程)_b+树结构__BugMan的博客-CSDN博客

数据结构(9)树形结构——大顶堆、小顶堆__BugMan的博客-CSDN博客

  • 二叉树: 二叉树是一种树状结构,每个节点最多有两个子节点,称为左子节点和右子节点。它的节点可以为空,或者包含一个值和指向左右子节点的指针。二叉树在很多领域中有广泛的应用,如表达式求值、搜索和排序。

  • 二叉搜索树: 二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,对于每个节点,其左子树的所有节点值都小于该节点值,右子树的所有节点值都大于该节点值。这种有序性质使得二叉搜索树在查找、插入和删除操作上具有高效性能。

  • 平衡二叉树: 平衡二叉树是一种特殊的二叉搜索树,其左右子树的高度差(平衡因子)不超过某个固定值。这保证了树的高度保持在较小的范围内,从而保证了查找、插入和删除操作的平均时间复杂度为 O(log n)。

  • 红黑树: 红黑树是一种自平衡的二叉搜索树,它通过在插入和删除操作中进行颜色变换和旋转来保持树的平衡。红黑树的特点包括:每个节点是红色或黑色,根节点是黑色,每个叶子节点(NIL 节点)都是黑色,红色节点的子节点必定为黑色,从任一节点到其每个叶子的所有路径都包含相同数量的黑色节点。

  • B树: B树(B-tree)是一种多叉树,用于存储大量的有序数据。B树的特点包括:每个节点可以包含多个子节点,一个节点可以包含多个关键字,子节点的关键字范围和父节点的关键字范围有重叠,保证了树的平衡性和高效的查找性能。

  • B+树: B+树(B+ tree)是一种在B树基础上进行了优化的数据结构,主要用于磁盘存储和数据库索引。与B树不同,B+树的所有关键字都出现在叶子节点中,非叶子节点只包含指向叶子节点的指针。这种结构可以提高磁盘存储的效率,同时适合范围查询。

6.图

图,在本系列种包含:

  1. 图的存储和表示
  2. 图的深度遍历和广度遍历
  3. 图的最短路径算法
  4. 最小生成树

文章链接:

数据结构(10)图的概念、存储_数据结构中图的存储概念__BugMan的博客-CSDN博客

数据结构(11)图的遍历,DFS、BFS的JAVA实现_java实现bfs和dfs__BugMan的博客-CSDN博客

数据结构(12)Dijkstra算法JAVA版:图的最短路径问题_dijkstra算法求解最短路径例题java__BugMan的博客-CSDN博客

数据结构(3)基础查找算法——顺序查找、二分查找(JAVA版)__BugMan的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-406-根据身高重建队列

题目描述: 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…

设计模式(一)

1、适配器模式 (1)概述 适配器中有一个适配器包装类Adapter,其包装的对象为适配者Adaptee,适配器作用就是将客户端请求转化为调用适配者中的接口;当调用适配器中的方法时,适配器内部会调用适配者类的方法…

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中,后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台,以及Express作为一个流行的Node.js框架,共同构建了高性能的Web应用服务。 在本文中,我们将深入探讨Node与Express后端架构…

Vue脚手架中安装ElementUi

目录 ElementUi简介: ElementUi下载: npm 安装: 引入ElementUi: 测试是否引入成功: Element-ui官网:组件 | Element ElementUi简介: ElementUi,是由国内的饿了么团队开发并开源的一套为开…

SpringBootWeb案例 Part3

目录 1. 新增员工 1.1 需求 1.2 接口文档 1.3 思路分析 PostMapping RequestBody //把前端传递的JSON数据填充到实体类中 1.4 功能开发 1.5 功能测试 1.6 前后端联调 2. 文件上传 2.1 文件上传简介 Spring中提供了一个API:MultipartFile,使…

设计模式——装饰器模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中,以便动态…

5G NR:PRACH时域资源

PRACH occasion时域位置由高层参数RACH-ConfigGeneric->prach-ConfigurationIndex指示,根据小区不同的频域和模式,38.211的第6.3.3节中给出了prach-ConfigurationIndex所对应的表格。 小区频段为FR1,FDD模式(paired频谱)/SUL,…

W6100-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。 什么是UDP组播? 组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种,直连交换机、广播交换机、主题交换机; 直连交换机中队列与交换机需要约定好routingKey去进行绑定; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可; 主题交换机最大的特…

uniapp启动微信小程序开发者工具报错Enable IDE Service (y/N) 

下载安装好微信小程序开发者路径 配置好启动路径后 报错[微信小程序开发者工具] ? Enable IDE Service (y/N) [27D[27C 解决办法 因为微信开发者工具的服务端口号没有打开

续1-续3《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 我写了一篇文章,批评付施威的《DDD诊所——聚合过大综合症》(以下简称《DDD诊所》),文章是《你的医书是假的!批评付施威的《DDD诊…

微信小程序隐私协议接入

自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。 相关公告见:关于小程序隐私保…