常见的数据结构基本介绍

2023/6/5 22:35:57

文章目录

  • 常见的数据结构介绍
    • 栈和队列的介绍
    • 数组数据结构
    • 链表数据结构
    • 二叉树和二叉查找树
    • 平衡二叉树
    • 红黑树结构

常见的数据结构介绍

数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率

常见的数据结构有如下几种:

  • 队列
  • 数组
  • 链表
  • 二叉树
  • 二叉查找树
  • 平衡二叉树
  • 红黑树

栈和队列的介绍

栈数据结构的执行特点

后进先出,先进后出

栈数据结构分为栈顶和栈底, 数据从栈顶进栈顶出

在这里插入图片描述

数据进入栈模型的过程称为:压/进栈; 数据离开栈模型的过程称为:弹/出栈

例如下图, 我们按照顺序分别将数据A、数据B、数据C、数据D压入栈模型中:

  • 先压入栈的在下面, 后压入栈的在上面

在这里插入图片描述

后进先出, 先进后出, 所以弹出栈时, 是数据D先弹出

在这里插入图片描述

队列数据结构的特点:

先进先出,后进后出

队列数据有两端开口, 一端称为前端, 一端称为后端

在这里插入图片描述

数据从后端进入队列模型的过程称为入队列:

在这里插入图片描述

数据从前端离开队列模型的过程称为出队列:

数组数据结构

常见数据结构之数组

数组内存中的一块连续区域

在这里插入图片描述

数组是一种查询快,增删慢的模型

查询速度快: 查询数据通过地址值和索引定位,查询任意数据耗时相同**。**(元素在内存中是连续存储的)

删除效率低:要将原始数据删除,同时后面每个数据前移。

添加效率极低:添加位置后面的每个数据需要后移,再添加元素。

链表数据结构

链表的特点:

链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址。

链表查询慢: 因为无论查询哪个数据都要从头开始找

在这里插入图片描述

添加链表的流程:

在这里插入图片描述

链表的增删数据相对比较快:

添加数据的流程

在这里插入图片描述

删除数据的流程

在这里插入图片描述

链表的种类:

链表又分为单向链表和双向链表:

  • 单向链表: 从前往后的查找
  • 双向链表: 既可以从前往后的查找, 也可以从后往前的查找

在这里插入图片描述

二叉树和二叉查找树

二叉树的特点:

只能有一个根节点,每个节点最多支持2个直接子节点。

节点的度:节点拥有的子树的个数称为节点的度,二叉树的度不大于2, 叶子节点度为0的节点,也称之为终端结点。

高度:终端结点的高度为1,终端结点的父节点高度为2,以此类推,根节点的高度最高。

层:根节点在第一层,以此类推

兄弟节点 :拥有共同父节点的节点互称为兄弟节点

二叉树结构类似于如下模型:

在这里插入图片描述

二叉查找树又称二叉排序树或者二叉搜索树, 它的特点如下:

每一个节点上最多有两个子节点

左子树上所有节点的值都小于根节点的值

右子树上所有节点的值都大于根节点的值

通俗的讲:

  • 比根节点小的数据存左边
  • 比根节点大的数据存右边
  • 根节点数据一样大的不存

二叉查找树, 提高了检索数据的性能, 是一个增删改查都比较快得数据结构

在这里插入图片描述

平衡二叉树

二叉树查找存在的问题:

比如: 将7, 10, 11, 12, 13按照二叉查找树的规则存入, 会出现瘸子现象,导致查询的性能与单链表一样,查询速度变慢!

在这里插入图片描述

平衡二叉树:

平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。

在这里插入图片描述

平衡二叉树有如下要求:

任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树

识别如下是否是平衡二叉树:

在这里插入图片描述

平衡二叉树在添加元素后可能导致不平衡:

基本策略是进行左旋,或者右旋保证平衡。

平衡二叉树-旋转的四种情况

左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡

左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡

右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡

右左: 当根节点右子树的左子树有节点插入,导致二叉树不平衡

在这里插入图片描述

红黑树结构

红黑树概述:

红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。

1972年出现,当时被称之为平衡二叉B树。1978年被修改为如今的"红黑树"。

每一个节点可以是红或者黑;红黑树不是通过高度平衡的,它的平衡是通过“红黑规则”进行实现的。

在这里插入图片描述

红黑规则:

每一个节点或是红色的,或者是黑色的,根节点必须是黑色

如果一个节点没有子节点或者父节点, 则该节点相应的指针属性值为NIL, 这些NIL视为叶节点, 叶节点是黑色的

如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况, 可以两个黑色相连)。

对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑树每一个节点会多一个字段来标识颜色:

在这里插入图片描述

添加节点: 添加的节点的颜色,可以是红色的,也可以是黑色的。默认用红色效率高。

红黑树小结:

红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的

规则如下:

每一个节点或是红色的,或者是黑色的,根节点必须是黑色, 默认添加元素时使用的是红色

如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;

如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况, 黑色可以相连)

对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑树增删改查的性能都很好
总结: 各种数据结构的特点和作用是什么样的

队列:先进先出,后进后出。

栈:后进先出,先进后出。

数组:内存连续区域,查询快,增删慢。

链表:元素是游离的,查询慢,首尾操作极快。

二叉树:永远只有一个根节点, 每个结点不超过2个子节点的树。

查找二叉树:小的左边,大的右边,但是可能树很高,查询性能变差。

平衡查找二叉树:让树的高度差不大于1,增删改查都提高了。

红黑树(就是基于红黑规则实现了自平衡的排序二叉树)


http://www.jnnr.cn/a/154111.html

相关文章

Leetcode刷题Day5休息 Day6----------哈希表

Leetcode刷题Day5休息 & Day6----------哈希表 1. 哈希表理论基础 数组、Set、Map 如果数据量小------------数组 如果数据量大------------Set 如果有Key、value------------Map 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.1 记录系统访客独立IP访问次数案例介绍

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.1 记录系统访客独立IP访问次数案例介绍2.1.1 介绍2.1.2 需求…

idea,web开发中jsp页面中不提示控制层的请求地址

随着开发的进行,打开spring配置文件会有如下提示 同时工程管理里如下 删掉后,发现打开sping配置文件不告警了,可是jsp页面中也没有了地址的提示 这个提示没有了 正确的做法是删掉Spring Application Context 因为其他配置文件都导入App…

【小5聊】纯javascript实现图片放大镜效果

实现图片放大镜效果,其实就是一个比例放大的效果 以下通过纯javascript方式对图片进行等比例放大,等比倍数和出界判断可自行实现 文章后面会附上全部代码 放大镜效果 1、 放大镜组成 1)目标图片,一般是小图 2)鼠标移…

Linux学习

一、linux目录结构 /bin [常用] :是Binary的缩写,这个目录存放着最经常使用的命令/sbin:s就是super user的意思,这里存放的是系统管理员使用的系统管理程序/home [常用]:存放普通用户的主目录,在Linux中每…

MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧

目录 前言 1、如何开启使用慢查询日志? 1.1 开启慢查询日志 1.2 设置慢查询阈值 1.3 确定慢查询日志的文件名和路径 1.3.1 查询MySQL数据目录 1.3.2 查询慢查询日志文件名 1.3.3 查询全局设置变量 1.3.4 查询单个变量命令 1.3.5 其他注意事项 2、如何定位并优…

第八章《Java高级语法》第12节:Lambda表达式

Lambda 表达式是 JDK8 的一个新特性,它可以定义大部分的匿名内部类,从而让程序员能写出更优雅的Java代码,尤其在集合的各种操作中可以极大地优化代码结构。 8.12.1 认识Lambda表达式 一个接口的实现类可以被定义为匿名类。经过大量实践,人们发现定义一个接口的匿名实现类…

痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制。 痞子衡之前写过一篇文章 《MCUXpresso IDE下工程链接文件配置管理与自动生成机制》,这篇文章介绍了 MCUXpresso ID…

机器学习模型与backtrader框架整合

原创文章第116篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 北京疫情似乎还没有到拐点,但这三天结束后应该会到来。 今天重点说说,机器学习模型整合到我们的回测框架中,并与backtrader连接起来回测…

文献解读——基于深度学习的病毒宿主预测

文章目录背景介绍作者介绍文章概述流程数据准备输入数据处理深度神经网络结果背景介绍 人畜共患病病毒对人类和动物的健康产生巨大了威胁,例如近期爆发的寨卡病毒、埃博拉病毒以及冠状病毒。病毒起源的宿主信息对于有效控制和消灭传播是至关重要的,这是…

后台管理不可忽视,华为云会议最新支持管理员分权分域

如今,跨地域, 跨组织,需要随时随地接入的远程沟通协作变得愈加频繁,众多企业开始纷纷建设符合自身需求的智能会议室。在会议系统的众多能力中,后台管理,这项常常被C端用户忽略的能力,B端的企业却…

FreeCAD二次开发-基于PyQT对话框与FC交互的开发

版本 FreeCAD0.18.2+PyCharm Community 2020.3.3 演示效果 环境搭建步骤 1.先安装好FreeCAD和PyCharm 2.添加环境变量 点击确定,全部关掉。 3.测试变量是否生效(CMD打开控制台,输入python回车) 弹出如下,说明可以进入FreeCAD自带的python解释器 4.创建工作台Workbench(…

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan(所有的原码都放在了我上面的gitee仓库里) 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介:双一流非科班的一名小白,期待与各位大佬一起努…

scrapy的入门使用

目录 一、 安装scrapy 1.windonws/Mac安装命令: 2. 安装依赖包:pip install pypiwin32 二、 scrapy项目开发流程 1.创建项目:    2.生成一个爬虫: 3.提取数据: 4.保存数据: 三、 创建项目 四、创建爬虫 五、完善爬虫 5.2 定位元素以及提取…

C++智能指针之shared_ptr

C智能指针之shared_ptr前言一、Shared_ptr1.1 shared_ptr类的操作1.2 make_shared函数1.3 shared_ptr的拷贝赋值1.4 shared_ptr的自动销毁对象内存机制1.5 使用动态生存期的资源的类1.6 shared_ptr与new结合使用1.7 不要混合使用普通/智能指针1.8 不要使用 get 初始化另一个智能…

世界杯来了,让 Towhee 带你多语言「以文搜球」!

四年一度的世界杯已正式拉开战幕,各小组比赛正如火如荼地进行中。在这样一场球迷的盛宴中,不如让 Towhee 带你「以文搜球」,一览绿茵场上足球战将们的风采吧~ 「以文搜球」是跨模态图文检索的一部分,如今最热门的跨模…

百行代码实现VLC简易视频播放器【详细环境配置过程+可执行源码注释完整】

文章目录❓什么是VLC🚀VLC 库的集成⭐VLC环境配置演示【win10系统vs2017win64】🍎VLC 库的基本使用🎂视频播放器实现⭐自定义函数Unicode2Utf8讲解🏠总结❓什么是VLC VLC 是 Video Lan Client 的缩写,原先是几个法国的…

ES6解析赋值

ES6中新增了一种数据处理方式,可以将数组和对象的值提取出来对变量进行赋值,这个过程时将一个数据结构分解成更小的部分,称之为解析。 1.对象解析赋值: 在ES5中,要将一个对象的属性提取出来,需要经过一下几个过程。 …

springcloud22:sentinal的使用

sentinal对比(分布式系统的流量防卫) 监控保护微服务 Hystrix 需要自己去手工搭建监控平台,没有一套web界面可以进行细粒度化的配置,流控,速率控制,服务熔断,服务降级… 整合机制:se…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群: 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词(一) 让学前端不再害怕英语单词(二) 让学前端不再害怕英语单词&#xff0…