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

数据结构—动态查找表

动态查找介绍

1. 动态查找的引入:当查找表以线性表的形式组织时,若对查找表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。

2. 动态查找表的设计思想:表结构本身是在查找过程中动态生成的

若表中存在其关键字等于给定值key的记录,表明查找成功;否则插入关键字等于key的记录。

利用树的形式组织查找表,可以对查找表进行动态高效的查找。

二叉排序树

1. 动态查找表的典型数据结构是二叉排序树,又称二叉查找树,其中序遍历输出为有序序列

    二叉排序树是空树或者是具有如下特性的二叉树:

若它的左子树不空,则左子树上所有结点的值均小于根结点的值

若它的右子树不空,则右子树上所有结点的值均大于根结点的值

它的左、右子树也都分别是二叉排序树。

 

2. 二叉排序树的查找

给定值与根结点比较:

①.若相等,查找成功

②.若小于,查找左子树

③.若大于,查找右子树

                实现代码

BSTNode *BST_Serach(BSTNode *T , KeyType key)
{  if (T==NULL)  return(NULL) ;else {  if  (EQ(T->key, key) ) return(T) ;else if ( LT(key, T->key) )return(BST_Serach(T->Lchild, key)) ;else  return(BST_Serach(T->Rchild, key)) ;}
}

 

3. 二叉排序树的插入

二叉排序树是一种动态树表

当树中不存在查找的结点时,作插入操作

新插入的结点一定是叶子结点,只需改动一个结点的指针

该叶子结点是查找不成功时路径上访问的最后一个结点左孩子或右孩子(新结点值小于或大于该结点值)

实现代码

void  Insert_BST (BSTNode *T , KeyType  key)
{ BSTNode *x ;x=(BSTNode *)malloc(sizeof(BSTNode)) ;x->key=key; x->Lchild=x->Rchild=NULL ; if (T==NULL)  T=x ;else{  if (EQ(T->key, x->key) )     return  ;/*  已有结点  */else if (LT(x->key, T->key) )Insert_BST(T->Lchild, key) ;else   Insert_BST(T->Rchild, key) ;   }
}

 

4. 性能分析

        在最好的情况下,二叉排序树为一近似完全二叉树时,其查找深度为log2n量级,即其时间复杂性为O(log2n)

        在最坏的情况下,二叉排序树为近似线性表时(如以升序或降序输入结点时),其查找深度为n量级,即其时间复杂性为O(n)

5. 其他

        一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列(通过中序遍历)

        插入新记录时,只需改变一个结点的指针,相当于在有序序列中插入一个记录而不需要移动其它记录

        二叉排序树既拥有类似于折半查找的特性O(log2n),又采用了链表作存储结构

        当插入记录的次序不当时(如升序或降序),则二叉排序树深度很深O(n),增加了查找的时间

 

6. 实现代码 

#include<iostream>using namespace std;class node {
public:int data;node *left, *right;node(int value) {data = value;left = right = nullptr;}
};class bitree {
private:bool flag = false;int l;node *root;
public:bitree() {cin >> l;root = nullptr;for (int i = 0; i < l; i++) {int tmp;cin >> tmp;root = insert(root, tmp);}pre_order(root);cout << endl;}//二叉树的创建和插入node *insert(node *q, int t) {if (q == nullptr) {q = new node(t);return q;}if (q->data <= t)q->right = insert(q->right, t);elseq->left = insert(q->left, t);return q;}//独立插入void insert_More() {int t;cin >> t;while (t--) {int tmp;cin >> tmp;insert(root, tmp);pre_order(root);cout << endl;}}//二叉排序树之查找void search_start() {int t;cin >> t;while (t--) {flag = false;int tmp;cin >> tmp;int num = 0;search(root, tmp, num);if (flag)cout << num << endl;elsecout << -1 << endl;}}void search(node *p, int tmp, int &num) {if (p == nullptr)return;num++;if (p->data == tmp) {flag = true;return;}if (tmp > p->data)search(p->right, tmp, num);elsesearch(p->left, tmp, num);}//先序遍历void pre_order(node *p) {if (p == nullptr)return;pre_order(p->left);cout << p->data << " ";pre_order(p->right);}};

平衡二叉树

1. 为解决而擦汗排序树的插入记录次序不当问题, 我们引入了二叉排序(查找)树的另一种形式—平衡二叉树,又被称为AVL树,其特点在于树中每个结点的左右子树深度之差的绝对值不大于1 

2. 平衡因子

每个结点附加一个数字, 给出该结点左子树的高度减去右子树的高度所得的高度差,这个数字即为结点的平衡因子balance

AVL树任一结点平衡因子只能取 -1, 0, 1

3. 平衡化旋转,又称为平衡化处理,如果在一棵平衡的二叉查找树中插入一个新结点或者删除一个旧结点,造成了不平衡,此时必须调整树的结构,使之平衡化

    平衡化旋转的操作:

每插入一个新结点时, AVL树中相关结点的平衡状态会发生改变

在插入一个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子

如果在某一结点发现高度不平衡,停止回溯。

从发生不平衡的结点起,沿刚才回溯的路径取下两层的结点。对这三个结点进行平衡化处理

    平衡化旋转有四种:

单向右旋,LL型,LL是指不平衡的三结点是双亲-左孩子-左孩子

单向左旋,RR型,RR是指不平衡的三结点是双亲-右孩子-右孩子

先左后右双向旋转,LR型,LR是指不平衡的三结点是双亲-左孩子-右孩子

先右后左双向旋转,RL型,RL是指不平衡的三结点是双亲-右孩子-左孩子

注意:英文类型简称是指不平衡状态,不是指旋转方向

注意:中文旋转名称是指旋转方向

B树 

B树是一种多路平衡查找树,应用内存和磁盘间的查找

B树又分B-树、B+树,一般把B-树称为B树

B-树

1. m阶B-树规定:

                ⑴ 根结点或者是叶子,或者至少有两棵子树,至多有m棵子树;

                ⑵ 除根结点外,所有非终端结点至少有ém/2ù棵子树,至多有m棵子树

                ⑶ 所有叶子结点都在树的同一层上;        

                ⑷ 每个结点应包含如下信息:

               (n,A0,K1,A1,K2,A2,… ,Kn,An)

  n是n个关键字,A是孩子指针,K是关键字

                 (5) Ki<Ki+1 且Ai所指向的子树中所有结点的关键字都在Ki和Ki+1之间

2. B-树的特点

m阶B-树即m叉树,m是树的度

m是指树结点最多包含m个孩子指针

每个树结点中,关键字的数量比孩子指针数量少1

根结点可以有2到m个孩子指针

叶子结点的关键字数量不受限制,孩子指针都是空指针,数量无意义

中间结点包含ém/2ù到m个孩子指针,即包含ém/2ù-1到m-1个关键字

B+树 

1. 基本概念

在实际的文件系统中,基本上不使用B-树,而是使用B-树的一种变体,称为m阶B+树。

B+树与B-树的主要不同是叶子结点中存储记录。

在B+树中,所有的非叶子结点可以看成是索引,而其中的关键字是作为“分界关键字”,用来界定某一关键字的记录所在的子树。

即B+树中,所有结果信息都在叶子,查找结束必定在叶子

2. B+树的特点

与B-树相比,对B+树不仅可以从根结点开始按关键字随机查找,而且可以从最小关键字起,按叶子结点的链接顺序进行顺序查找。

在B+树上进行随机查找、插入、删除的过程基本上和B-树类似。

在B+树上进行随机查找时,若非叶子结点的关键字等于给定的K值,并不终止,而是继续向下直到叶子结点(只有叶子结点才存储记录), 即无论查找成功与否,都走了一条从根结点到叶子结点的路径。

平衡二叉树AVL-Tree的改进——红黑树RB-Tree

红黑树是一种不那么严格的平衡二叉树

它允许不平衡达到一倍,即左右子树高度差可以达到一倍

RBT是用非严格的平衡来换取增删结点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决

AVL是严格平衡树,因此在增加或者删除结点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高!!

相关文章:

数据结构—动态查找表

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…...

Hbase-2.4.11_hadoop-3.1.3集群_大数据集群_SSH修改默认端口22为其他端口---记录025_大数据工作笔记0185

其实修改起来非常简单,但是在大数据集群中,使用到了很多的脚步,也需要修改, 这里把,大数据集群,整体如何修改SSH端口,为22022,进行总结一下: 0.hbase-2.4.11的话,hbase集群修改默认SSH端口22,修改成22022,需要修改 需要修改/opt/module/hbase-2.4.11/conf/hbase-env.sh 这里…...

c++学习第十四讲---STL常用容器---vector容器

vector容器&#xff1a; 1.vector基本概念&#xff1a; vector功能与数组类似&#xff0c;与数组不同的是&#xff0c;vector可以动态扩展。 2.vector构造函数&#xff1a; vector<T> v; //默认构造函数&#xff0c;创建数据类型T的容器 ve…...

数据结构-内部排序

简介 排序&#xff08;Sorting&#xff09;&#xff1a;将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个按关键字有序的序列 排序算法分为内部排序和外部排序 内部排序&#xff1a;在排序期间数据对象全部存放在内存的排序 外部排序&am…...

Qt加载网页崩溃 ASSERT:“m_adapterClient“ in file ...

1、软件启动后加载网页无异常&#xff0c;点击按钮&#xff0c;加载新网页时崩溃 崩溃代码&#xff1a; QWebEngineView *createWindow(QWebEnginePage::WebWindowType type) { Q_UNUSED(type); return this; } 2、原因 Qt只是调用谷歌的浏览器引擎&#xff…...

合约短线高胜率策略-扭转乾坤指标使用说明

扭转乾坤指标使用说明 行情判断 双绿线 多趋势双红线 空趋势大绿线 小红线 多震荡大红线 小绿线 空震荡 进场条件 趋势行情进场 多趋势 多信号 底金叉 做多空趋势 空信号 顶死叉 做空 震荡行情进场 多震荡 多信号 底金叉 做多多震荡 空信号 顶死叉 做空空…...

DAY37:贪心算法738

今天写了一道题目&#xff0c;顺便看了一个很好的总结&#xff0c;这篇博客可以跳过。 Leetcode&#xff1a;738 单调递增的数字 因为最大的数字是9&#xff0c;当出现后面位数的数字比前面位数的数字小的时候&#xff0c;就把后面的数字都变成9&#xff0c;前面那个数字--。…...

计算机中的缓存与内存

在现代计算机系统中&#xff0c;缓存和内存扮演着至关重要的角色&#xff0c;它们共同协作以实现高性能和高效率的数据处理。本文将深入探讨缓存和内存的概念、功能以及它们在计算机系统中的作用。 缓存与内存&#xff1a;概念与功能 1. 内存&#xff08;RAM&#xff09;&…...

2.1总结

还是一样水更一天&#xff0c;就随便做了几个题&#xff0c;有一个周期有点长&#xff0c;后面更一篇长的 随手刷的一道水题&#xff0c;就不往今天的行程单添了 问题&#xff1a;最大公约数 题解&#xff1a;题目太水了&#xff0c;就是求三个数&#xff0c;其中两组的最大公…...

探索Pyecharts:绘制多彩日历图的艺术与技巧

Pyecharts绘制多种炫酷日历图参数说明代码实战 导言 在数据可视化领域&#xff0c;日历图是一种直观展示时间和数据关系的方式。Pyecharts是一个基于Echarts的Python库&#xff0c;可以方便地绘制各种图表&#xff0c;包括炫酷的日历图。本篇博客将介绍Pyecharts中绘制多种炫…...

响应标头Allow-Headers和Expose-Headers的区别和用法

Access-Control-Allow-Headers和Access-Control-Expose-Headers&#xff0c;简单的说&#xff0c;这两者都是前端和后端之间通过header传递数据的&#xff0c;主要的区别就是方向。 Access-Control-Allow-Headers 举个例子&#xff0c;如果我们前端向后端发起请求&#xff0c…...

<网络安全>《13 上网行为管理》

1 概念 上网行为管理是指帮助互联网用户控制和管理对互联网的使用。其包括对网页访问过滤、上网隐私保护、网络应用控制、带宽流量管理、信息收发审计、用户行为分析等。 随着计算机、宽带技术的迅速发展&#xff0c;网络办公日益流行&#xff0c;互联网已经成为人们工作、生活…...

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…...

2022 年全国职业院校技能大赛高职组云计算赛项试卷

【赛程名称】云计算赛项第二场-容器云 说明&#xff1a; 完成本任务需要两台安装了 CentOS7.9 操作系统的云主机&#xff1a; master 和 node。Chinaskill_Cloud_PaaS.iso 镜像包中有本次容器云部署所需的所有文件&#xff0c;运维所需的文件见附件。 某公司技术部产品开发上线…...

Android开发中,Vue 3处理回退按键事件

vue3有一些变化&#xff0c;按照网上有些文章的方法&#xff0c;发现行不通&#xff0c;通过一段时间的打印、尝试后&#xff0c;发现以下方法可行。 第一步&#xff09;首先定义一个处理回退事件的js函数&#xff0c;一定是vue.methods中的函数&#xff0c;否则找不到this&am…...

three.js CSS3DRenderer、CSS3DSprite渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…...

【BBF系列协议】TR369管理平台软件设计

一、介绍 旨在促进CPE和IoT的多供应商管理平台的发展。遵循TR-369协议的任何设备都可以进行管理。主要目标是促进并统一设备管理,为最终用户和服务提供商带来无数好处,减少当前技术所需的要求:设备互连、数据收集、速度、可用性等等。 二、 TR-069 ---> TR-369 物联网…...

微信小程序 仿微信聊天界面

1. 需求效果图 2. 方案 为实现这样的效果&#xff0c;首先要解决两个问题&#xff1a; 2.1.点击输入框弹出软键盘后&#xff0c;将已有的少许聊天内容弹出&#xff0c;导致看不到的问题 点击输入框弹出软键盘后&#xff0c;将已有的少许聊天内容弹出&#xff0c;导致看不到的问…...

中国社会科学院大学-新加坡社科大学 招生简章

Singapore University of Social Sciences--University of Chinese Academy of Social Sciences Doctor of Business Administration (DBA) Programme in Global Strategy and Leadership 一、项目简介 全球经济正在经历由科技进步和创新、政治和人口剧烈变化所带来的巨大的不…...

js中继承的详解(一文读懂)

文章目录 一、是什么二、实现方式原型链继承构造函数继承组合继承原型式继承寄生式继承寄生组合式继承 三、总结参考文献 一、是什么 继承&#xff08;inheritance&#xff09;是面向对象软件技术当中的一个概念。 如果一个类别B“继承自”另一个类别A&#xff0c;就把这个B称…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...

SpringSecurity+vue通用权限系统

SpringSecurityvue通用权限系统 采用主流的技术栈实现&#xff0c;Mysql数据库&#xff0c;SpringBoot2Mybatis Plus后端&#xff0c;redis缓存&#xff0c;安全框架 SpringSecurity &#xff0c;Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...