当前位置: 首页 > 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;表结构本身是…...

Tarjan算法学习笔记

目录 无向图的割点与桥 时间戳&#xff1a; 搜索树&#xff1a; 追溯值&#xff1a; 割边判定法则&#xff1a; 割点判定法则&#xff1a; 无向图的双连通分量 定理&#xff1a; 边双连通分量(e-DCC)的求法&#xff1a; e-DCC的缩点&#xff1a; 有向图的连通性 追…...

vue 项目涉及的焦点聚焦、格式化日期、判断是否为对象或数组、判断是否为空、深拷贝、节流、防抖

焦点聚焦 import Vue from vue // 插件对象(必须有 install 方法, 才可以注入到 Vue.use 中) export default {install () {Vue.directive(fofo, {inserted (el) {el el.querySelector(input)el.focus()}})} }格式化日期格式 export const formatDate (time) > {// 将xx…...

软件工程知识梳理6-运行和维护

软件维护需要的工作量很大&#xff0c;大型软件的维护成本高达开发成本的4倍左右。所以&#xff0c;软件工程的主要目的就是要提高软件的可维护性&#xff0c;减少软件维护所需要的工作量&#xff0c;降低软件系统的总成本。 定义&#xff1a;软件已经交付使用之后&#xff0c;…...

docker- php7.4

安装 gd拓展 anzhuanga在Dockerfile里面安装php7.4的GD库 - 知乎 apt update apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-devdocker-php-source extractdocker-php-ext-configure gd \ --with-jpeg/usr/include \ --with-freetype/usr/include/docker-…...

开发一个Android App,在项目中完成添加联系人的功能,通过ContentResolver向系统中添加联系人信息。

实现步骤&#xff1a; &#xff08;1&#xff09;添加动态联系人的权限。 &#xff08;2&#xff09;创建Activity和布局文件&#xff0c;添加输入框和按钮等控件。 &#xff08;3&#xff09;完成添加联系人的功能。 代码文件如下&#xff1a; activity_main.xml文件 <!…...

Flume搭建

压缩包版本&#xff1a;apache-flume-1.9.0-bin.tar 百度盘链接&#xff1a;https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码&#xff1a;ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…...

Web APIs 1 DOM操作

Web APIs 1 引入&#xff1a;const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…...

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路high low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <scr…...

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升&#xff1a;摩尔定律与嵌入式虚拟化二、CPU多核技术&#xff1a;为嵌入式虚拟化提供支持三、业务负载整合&#xff1a;嵌入式虚拟化的核心需求四、降低硬件成本&#xff1a;虚拟化技术的经济效益五、软件重用与移植&#xff1a;虚拟化技术的优势六、…...

linux 文件查看 head 、 cat 、 less 、tail 、grep

查看文件详细信息 stat 文件 cat 》》适合显示小文件【行数比较少】&#xff0c;如果行数较多&#xff0c;屏幕显示不完整&#xff08;如果虚拟操作&#xff0c;是无法上下键的&#xff0c;或者滚动鼠标的&#xff0c;第三方 xsheel&#xff0c;crt 可以方向键查看&#xf…...

13.2 Web与Servlet进阶(❤❤)

13.2 Web与Servlet进阶 1. 请求与响应1.1 URL与URI1.2 HTTP请求的结构1. 结构2.后端获取访问工具类型:getHeader().toLowerCase方法1.3 响应的结构1. 结构2. 响应常见状态码3. 后端设置响应参数4. 响应的ContentType作用1.4 请求转发与响应重定向应用1. 请求转发:getRequestDis…...

记录解决报错--vue前后端分离,接口401(Unauthorized)

1.场景 前端访问不了后端接口。报错401。 2.解决步骤 ①在页面console.log(111)查看走到代码的位置没有。&#xff08;走到了&#xff0c;没问题&#xff09; ②查看vue.config.js配置。这段配置就是vue访问api的url。&#xff08;没问题&#xff09; devServer: {port: 80…...

【笔记】Android 常用编译模块和输出产物路径

模块&产物路径 具体编译到软件的路径要看编译规则的分区&#xff0c;代码中模块编译输出的产物基本对应。 Android 代码模块 编译产物路径设备adb路径Comment 模块device/mediatek/system/common/ 资源overlay/telephony/frameworks/base/core 文件举例res/res/values-m…...

部署私有知识库项目FastGPT

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。 项目文档: [快速了解 FastGpt | FastGptFastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即…...

【2024-02-02】华为秋招笔试三道编程题解

恭喜发现宝藏&#xff01;搜索公众号【TechGuide】回复公司名&#xff0c;解锁更多新鲜好文和互联网大厂的笔经面经。 作者TechGuide【全网同名】 订阅专栏&#xff1a; 【专享版】2024最新大厂笔试真题解析&#xff0c;错过必后悔的宝藏资源&#xff01; 第一题&#xff1a;找…...

银行数据仓库体系实践(8)--主数据模型设计

主数据区域中保留了数据仓库的所有基础数据及历史数据&#xff0c;是数据仓库中最重要的数据区域之一&#xff0c;那主数据区域中主要分为近源模型区和整合&#xff08;主题&#xff09;模型区。上一节讲到了模型的设计流程如下图所示。那近源模型层的设计在第2.3和3这两个步骤…...

vue在main.js中引入三方插件不生效的原因

有的时候需要比较复杂的功能,但是自己实现比较复杂的话,可以引入第三方插件.如果这个第三方插件需要全局都使用的话,可以在main.js中进行引入. 比如router elementplus之类的. import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/…...

chatgpt搭建

chatgpt两步搭建大法 部署docker环境 下载docker curl -fsSL https://get.docker.com -o get-docker.sh安装docker sh get-docker.sh运行docker服务 systemctl start docker查看运行状态 systemctl status docker设置docker开机自启 systemctl enable docker部署chatgpt…...

vue基本理解

1、js闭包&#xff0c;作用&#xff1f;&#xff1f; 闭包是指在一个函数内部&#xff0c;可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。闭包的作用有&#xff1a; 保护变量&#xff1a;闭包可以保护函数内部的变量&#xff0c;使其不受外部环境的影响。实现…...

四旋翼姿态解算实战:MahonyAHRS算法中的初始姿态角优化策略

1. 四旋翼姿态解算与MahonyAHRS算法基础 四旋翼飞行器的姿态解算是飞行控制系统的核心环节&#xff0c;它直接决定了飞行器的稳定性和操控性。简单来说&#xff0c;姿态解算就是通过传感器数据计算出飞行器当前的俯仰、横滚和偏航角度。这就像我们人类闭着眼睛也能感知自己身体…...

健壮的容错机制:让Agent优雅降级与自动恢复

健壮的容错机制&#xff1a;让Agent优雅降级与自动恢复 关键词&#xff1a; Agent容错、优雅降级、自动恢复、多Agent系统、心跳检测、重试策略、状态一致性、故障隔离、自适应调节、系统可靠性摘要 在人工智能与软件工程深度融合的当下&#xff0c;自主智能体&#xff08;Agen…...

自动化测试:等待方式详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。等待能够确保在条件满足后再进行后续操作&a…...

Pixel Aurora Engine实战应用:教育类App像素插画素材自动化生产

Pixel Aurora Engine实战应用&#xff1a;教育类App像素插画素材自动化生产 1. 教育类App的像素素材需求 在当今教育类App开发中&#xff0c;视觉素材的质量直接影响用户体验和学习效果。传统设计流程面临三大痛点&#xff1a; 人力成本高&#xff1a;每个插画需要设计师手动…...

大模型转型实战指南:从入门到求职,避坑全攻略

这两年&#xff0c;大模型技术彻底打破行业壁垒&#xff0c;从科研领域的专属议题&#xff0c;变成后端、测试、运维乃至跨行者的职业新选项&#xff0c;更是不少人职业转型的核心方向。 日常对接学员和行业朋友时&#xff0c;类似的疑问反复出现&#xff1a; “我做测试/运维…...

高效挖掘论文开源项目的五大实战平台

1. 科研必备&#xff1a;五大开源代码平台全景解析 刚入行AI那会儿&#xff0c;最头疼的就是复现论文。明明算法原理都看懂了&#xff0c;可一动手就发现作者留了"课后习题"——关键实现细节全在"详见代码"四个字里。后来我摸索出一套方法论&#xff1a;与…...

避开SNP芯片分型的3个大坑:GenomeStudio聚类分析常见问题解决方案

避开SNP芯片分型的3个大坑&#xff1a;GenomeStudio聚类分析常见问题解决方案 在遗传学研究中&#xff0c;SNP芯片技术因其高通量、低成本的优势&#xff0c;依然是群体遗传学和复杂疾病研究的重要工具。然而&#xff0c;从原始信号到可靠的分型结果&#xff0c;这条路上布满了…...

雷石KTV惊艳7000系列专用云猫点歌系统刷机包|含刷机工具+硬盘系统文件|实测一键成功|可复刻部署

温馨提示&#xff1a;文末有联系方式 产品概览&#xff1a;专为雷石惊艳7000系列深度适配的云猫点歌系统刷机套件 本套件包含经实测验证的云猫点歌系统刷机包、配套刷机工具及完整硬盘系统文件&#xff0c;全面兼容雷石KTV惊艳7000系列主机。 所有组件已在多台设备上完成稳定刷…...

闲鱼AI客服终极指南:7×24小时自动化值守完整教程

闲鱼AI客服终极指南&#xff1a;724小时自动化值守完整教程 【免费下载链接】XianyuAutoAgent 智能闲鱼客服机器人系统&#xff1a;专为闲鱼平台打造的AI值守解决方案&#xff0c;实现闲鱼平台724小时自动化值守&#xff0c;支持多专家协同决策、智能议价和上下文感知对话。 …...

3大核心功能解放窗口控制:Simple Runtime Window Editor全场景应用指南

3大核心功能解放窗口控制&#xff1a;Simple Runtime Window Editor全场景应用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 在数字创作的世界里&#xff0c;窗口分辨率的限制常常成为创意落地的隐形障碍…...