常见树的数据结构

news/2025/2/23 9:45:53

时间复杂度

O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表),
O(n) 意味着先要检查 n 个元素来搜索目标
常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),k次方阶O(nk),指数阶O(2n)。
在这里插入图片描述

O(log n)

二分搜索一定有某种行为使其时间复杂度为 log n。
最好情况下二分搜索的时间复杂度是 O(1),最坏情况(平均情况)下 O(log n)。

设有 16 个元素的有序数组,最坏情况下

次数搜索范围缩小至计算是否找到值
816*1/2 = 8
48*1/2 = 4
24*1/2 = 2
12*1/2 = 1

n就是我们所需要遍历的数组个数(16),底数是2,k就是时间复杂度(4)
在这里插入图片描述
但是 O(log2n)为什么会变成O(log n) 呢
logcA(c为底数)为常数,由O的运算规则"O(C×f(N))=O(f(N)),其中C是一个正的常数"得O(logaB)=O(logcB)可知算法的时间复杂度与不同底数只有常数的关系,均可以省略自然可以用logN代替。


在这里插入图片描述

Binary Search Tree(时间复杂度 O(log n) )

最坏情况下的时间复杂度

操作二叉查找树平衡二叉树红黑树
查找O(n)O(log n)O(log n)
插入O(n)O(log n)O(log n)
删除O(n)O(log n)O(log n)

二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NULL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。
在这里插入图片描述
在二叉搜索树中:
1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3.任意结点的左、右子树也分别为二叉搜索树。

AVL树(最先发明的自平衡二叉查找树)

在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树
在这里插入图片描述
引入对左右子树高度差有限制的平衡二叉树,保证查找操作的最坏时间复杂度也为O(logN)

红黑树是一种特化的AVL树(平衡二叉树)

红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。

有了平衡二叉树,为什么还需要红黑树?

AVL的左右子树高度差不能超过1,每次进行插入/删除操作时,几乎都需要通过旋转操作保持平衡
在频繁进行插入/删除的场景中,频繁的旋转操作使得AVL的性能大打折扣
红黑树通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL
红黑树插入时的不平衡,不超过两次旋转就可以解决;删除时的不平衡,不超过三次旋转就能解决
红黑树的红黑规则,保证最坏的情况下,也能在O(log_{2}N)时间内完成查找操作。

在这里插入图片描述
节点不是红色就是黑色,根节点是黑色
红黑树的叶子节点并非传统的叶子节点,红黑树的叶子节点是null节点(空节点)且为黑色
同一路径,不存在连续的红色节点

B树

M阶B树性质:

  1. 根节点至少有两个子节点。
  2. 其他节点至少有M / 2个子节点。
  3. 每个节点最少2个key,最多M - 1个key。
  4. 位于父节点两个key之间的子节点的值位于父节点两个key对应的value之间。

B树的弊端
除非完全重建数据库,否则无法改变键值的最大长度。这使得许多数据库系统将人名截断到70字符之内。
(其他关联数组的实现,例如三元搜索树或者开散列哈希表,可以动态适应任意长度的键值)。
在这里插入图片描述

B+树

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下:
(1)每个结点至多有m个子女;
(2)除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
(3)有k个子女的结点必有k个关键字。
B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

B+树是B树的一种变形,比B树具有更广泛的应用,m阶 B+树有如下特征:
(1)每个结点的关键字个数与孩子个数相等,所有非最下层的内层结点的关键字是对应子树上的最大关键字,最下层内部结点包含了全部关键字。
(2)除根结点以外,每个内部结点有 到m个孩子。
(3)所有叶结点在树结构的同一层,并且不含任何信息(可看成是外部结点或查找失败的结点),因此,树结构总是树高平衡的。
在这里插入图片描述

B树和B+树的区别

1.B树每个节点都会有数据域和关键字,而B+树是在非叶子节点是没有数据域的,所有数据与都在叶子节点中,并且各个叶子节点之间通过指针相连接。

2.B树的查询最好时间复杂度为O(1)最差O(log n),B+树的查询时间复杂度固定为O(log n)。

3.B树更适合查找某一频繁出现的数据,同时B树无法进行范围查找,而B+树可以进行范围查找,只需要找到叶子节点最小的数据然后通过链表O(N)的时间复杂度就能查找整个数据的范围。

4.B+树只需要遍历叶子节点便可以实现整棵树的遍历,包含关键字并有序存储,增删效率更高。


http://www.niftyadmin.cn/n/172758.html

相关文章

避免踩坑,教给你VSCode中最常用到的6项功能

这里为程序员介绍VSCode中包含的许多令人兴奋的Tips。 1. 插件市场中免费下载使用CodeGeeX插件 AI辅助编程工具CodeGeeX,是完全免费,开源开放给所有开发者使用。程序员普遍反应使用这个插件后,代码编写效率提升2倍以上。 CodeGeeX插件拥有…

threejs与六轴机械臂联动思路

threejs与六轴机械臂联动思路 六轴机械臂的数据格式 如何将这种数据格式的数据与threejs中的模型进行联动,数据如何转换? 代码示例 以下是一个简单的Three.js示例,展示了如何将关节角度数据应用到一个六轴机械臂模型。假设您已经正确导入了模…

ONES 入选北大光华 MBA 整合实践项目,推动校企合作

近日,ONES 旗下开源问答社区软件 Answer 入选北京大学光华管理学院 MBA 整合实践项目,并受邀出席项目启动会。同时入选的还有国电投清洁能源基金、京东零售、瑞尔集团、美国丹纳赫集团、大众汽车(中国)和贝壳找房六家国内外知名企…

做一个元气满满的同路人,在社科院与杜兰大学金融管理硕士项目追寻更好的自己

人生需要归零。每过一段时间都要将过去清零,让自己重新开始。该放手时就放手,扔掉过去的包袱。时时刷新自己,为未来发展赋能。做一个元气满满的同路人,在社科院与杜兰大学金融管理硕士项目追寻更好的自己。在职场上行走&#xff0…

axios 请求其他服务器地址时候 会自动加上当前网址域名

场景还原: Vue2项目中在生产环境调用其他服务器请求地址时候会在请求地址默认加上一串当前浏览器域名 比如生产环境:http://123.com.cn; 生产环境服务器:http://789/production:20; 请求地址:http://789/production:21/postrReque…

【2023.3.18 美团校招】

文章目录1. 小美剪彩带2. 最多修改两个字符,生成字典序最小的回文串1. 小美剪彩带 题意:找出区间内不超过k种数字子数组的最大长度 使用双指针的方式,用哈希表来统计每个数出现次数。在双指针移动的过程中,动态的维护区间内不同数…

Python学习个人记录笔记

目录文件操作循环正则表达式requestsxpathasyncioseleniumscrapy安装:新建工程增加py文件**持久化存储:**分页信息的爬取请求传参:图片下载中间件crawlspider分布式爬虫增量式爬虫打包exe快捷键文件操作 创建目录 import os if not os.path…

java与c#的语法区别

Java中以package(包)管理“.java”文件,以import关键字引用其它包中的代码;C#中以namespace(命名空间)管理“.cs”文件,以using关键字引用其它命名空间中的代码。Java和C#中都定义了public、pri…