当前位置: 首页 > news >正文

常见数据结构

一. 数据结构概述、栈、队列

1. 数据结构概述

 2. 栈数据结构的执行特点

 

 3. 常见数据结构之队列

 

 二. 常见数据结构之数组

  • 数组它就是内存中的一块儿连续区域。
  • 数组变量存的是数组在堆内存当中的起始地址。
  • 数组查询任意索引位置的值耗时相同,数组根据索引查询速度快。
  • 数组是一种根据索引查询快,增删慢的模型。
  • 数组增删元素要对元素进行移位,甚至可能要创建新数组。

 三. 链表

  • 链表中的每个元素节点首先是包含了自己的节点的地址,每个元素节点的内部包含了自己的数据值和下一个元素的地址。

  •  头地址指向链表中的第一个元素。

  •  链表只是增删那一刻相对来说比较快,增删数据要找到这个数据才能删,找的过程也就是查询的过程还是比较慢的。

 链表的分类:

  • 单向链表:只能从前往后找。
  • 双向链表:从前可以往后找,从后也可以往前找。有个头地址,有个尾地址,头可以往后找,尾可以往前找。Java中双链表用的比较多。增删首尾元素的速度特别快。因为双链表可以直接定位首尾元素。
  • 结论:数组根据索引查元素是最快的,而双链表增删首尾元素的速度是最快的。

 四. 二叉树和二叉查找树

  • 二叉树和二叉查找树是我们后面一些特殊集合的底层数据结构。
  • 二叉树是包含一个父节点,父节点产生一个左节点,还有一个右节点。每个节点最多只能有两个子节点,分别是左子节点和右子节点。
  • 如果是根节点,它的父节点地址值就为null。

 放了数据的二叉树:

 二叉查找树:

  • 二叉查找树它小的会往左边走,大的会往右边走。
  • 二叉查找树它是一种二分查找的算法,目的:为了提高检索数据的性能。
  • 二叉查找树又称二叉排序树或者二叉搜索树。
  • 因为二叉查找树它小的会往左边走,大的会往右边走,因此左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值。
  • 普通二叉树不怎么用,开发中用的最多的还是二叉查找树。

 二叉查找树节点添加的一个机制:

  • 规则:小的存左边,大的存右边,一样的不存。
  • 将7作为根节点,4比7小往左边走,10比7大往右边走。
  • 二叉查找树是一个增删改查都挺快的一个数据结构,相对来说比较完美,包括后续数据库检索数据也会用到这种数据结构。

 五. 平衡二叉树(比较完美的一种二叉树结构)

二叉查找树存在的问题:

  • 我们发现排好之后这个二叉查找树相当于是一个链表,而链表的话查询速度就慢了。

  •  问题:出现瘸子现象,导致它的查询性能与单链表一样,查询速度变慢!

 

  • 我们希望这个树它能在满足二叉树的规则之上,能够尽量的矮小,因为树越矮,去搜索的深度就会越短,可以提高检索的性能。
  • 而平衡二叉树的目的就是为了把这个数做的尽量矮小,数据的分布尽量的均匀。 

如何去满足成为一颗平衡二叉树:

  • 平衡二叉树要求任意节点的左右两个字数的高度差不超过1,这样可以使元素分布的尽量均匀,把树做的尽量矮小。

  •  思路:左边高,右拉。右边高,左拉。
  • 左边高,右拉,右拉不行,就放弃右拉,先以不平衡的那个点左拉再整体右拉,反之亦然。

 案例:使1234567成为一颗平衡二叉树: 4   2,6   1,3,5,7

 六. 红黑树

  • 红黑树与平衡二叉树的目的一样,都是为了提高数据的增删改查的性能。

  • 红黑规则:黑红黑红交替的。
  • 红黑树的每一个节点要多一个字段值来标记它是什么颜色。后面去看Java底层代码也能看到,有些是基于红黑树的,它的节点里面是有这种red,black这样的属性的。
  • 路径算法:每条路径均包含相同数目的黑色节点。

 怎样去通过红黑规则来保持平衡?

http://www.lryc.cn/news/32241.html

相关文章:

  • Mycat
  • Java 编写Vue组件(VueGWT的初尝试)
  • 【第二章 @RequestMapping注解(value,method,params属性),springMVC支持ant风格的路径,支持路径中的占位符】
  • QML Text详解
  • xxl-job启用https访问
  • 2023FL Studio最新中文版电子音乐、混音和母带制作DAW
  • pytorch 35 yolov5_obb项目解读+使用技巧+调优经验(提升map)
  • OpenMv H7 口罩识别--毕业设计学习记录
  • 有什么比较好的bug管理工具?5款热门工具推荐
  • 第五章 opengl之摄像机
  • nginx配置详解(容器、负载)—官方原版
  • 2023年中职网络安全竞赛——CMS网站渗透解析
  • SQL 窗口函数详解
  • Android 12系统源码_SystemUI(六)显示和隐藏最近任务
  • Docekr三剑客之 Docekr compose
  • 企业是否具备等保测评资质在哪里查?怎么查?
  • Spacedesk软件推荐,让你的平板也变成电脑的副屏
  • Vue 3.0 组合式API 介绍 【Vue3 从零开始】
  • 【算法数据结构体系篇class13、14】:贪心算法思想
  • C++知识点,关键字inline ,String,强制类型转化
  • MyBatis源码分析(六)MetaObject工具类的使用与源码分析
  • 文献资源最多的文献下载神器,99.99%的文献都可下载
  • 工控机ARM工业边缘计算机搭建Node-Red环境
  • 位图/布隆过滤器/海量数据处理方式
  • Tomcat 配置文件数据库密码加密
  • k8s-Kubernetes集群部署
  • Python数据分析案例19——上市银行财务指标对比
  • Python 中错误 ConnectionError: Max retries exceeded with url
  • SpringBoot下的Spring框架学习(Tedu)——DAY02
  • 容易混淆的点:C语言中char* a[] 与 char a[] 的区别以及各自的用法