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

数据结构-查找

一、基本术语

二、线性结构

ASL:平均查找长度  \sum_{i=1}^{n}PiCi

1、顺序查找

1.1、代码实现

typedef struct {int* elem;int TableLen;
}SSTable;int Search_Seq(SSTable ST, int key) {ST.elem[0] = key;   //哨兵,使得循环不用判断数组是否会越界int i;for (i = ST.TableLen; ST.elem[i] != key; i--);return i;
}

ALS_{yes}=(n+1)/2           ALS_{no}=n+1

1.2、优缺点

                缺:当n较大时,平均查找长度较大,效率低

                优:对数据元素的存储没有要求,顺序存储或链式存储都可以,对链表只能顺序查找

                对有序线性表的顺序查找,查找失败时不需要完整遍历整个线性表,从而降低查找失败的平均查找长度。

1.3、应用-有序顺序表上的顺序查找判定树

ALS_{no}=n/2+n/(n+1)

到达失败节点时所查找的长度等于它上面的一个圆形节点的所在层数

2、折半查找

2.1、代码实现

int Binary_Search(SSTable L, int key) {int low = 0, high = L.TableLen - 1, mid;while (low <= high) {mid = (low + high) / 2;if (L.elem[mid] == key)return mid;else if (L.elem[mid] > key)high = mid - 1;else low = mid + 1;}return -1;
}

ALS_{yes} = log_{2}(n+1) -1

2.2、折半查找判定树

①结点的值为该记录的关键字值,树的叶节点为方形,表示查找失败的区间。

②查找成功时的查找长度为从根结点到目的结点的路径上的结点数

③查找失败时的查找长度为从根节点到对应失败节点的父节点的路径上的结点数

④若有序序列有n个元素,则对应判定树有n个圆形叶节点和n+1个方型的叶节点

⑤若mid=\left \lfloor (low+high)/2 \right \rfloor,则对于任何一个结点,右子树结点数-左子树结点数=0或1,即右子树结点个数多于或等于左子树结点个数。下取反之

⑥折半查找的判定树是一棵平衡二叉树

⑦元素个数为n时,树高为\left \lceil log_2{(n+1)} \right \rceil,比较次数最多不会超过树高

3、分块查找

又称索引顺序查找,块内无序,块间有序(第一个块中的最大关键字小于第二个块中的所有记录)

typedef struct {int MaxValue;int low, high;//区间范围
};

顺序查找:ALS_{} = L1+L2=(s^{2}+2s+n)/2s   长度为n,分为b块,每块s个记录

s=\sqrt{n},平均查找长度取到最小值

三、树形查找

1、二叉排序树

1.1、目的及定义

        ①目的:提高查找,插入和删除关键字的速度

        ②定义:左(右)子树上的所有节点均小于(大于)根节点的值  (对二叉排序树进行中序遍历,可以得到一个递增的有序序列)

1.2、二叉排序树的查找

//非递归
BiTNode* BTS_Search(BiTree T, int key) {while (T && T->data != key) {if (key < T->data)T = T->lchild;else T = T->rchild;}return T;
}
//递归
BiTNode* BTS_Search(BiTree T, int key) {if (T == NULL)return;if (T->data == key)return T;else if (T->data > key)return BTS_Search(T->lchild, key);else return BTS_Search(T->rchild, key);
}

1.3、二叉排序树的插入

二叉排序树是一种动态树表,其特点是树的构造通常不是一次生成的,而是在查找过程中,当树不存在关键字值等于给定值的结点时再进行插入

int BTS_Insert(BiTree& T, int key) {if (T == NULL) {T = (BiTNode*)malloc(sizeof(BiTNode));T->data = key;T->lchild = NULL;T->rchild = NULL;return 1;}else if (T->data == key)return 0;//插入失败else if (T->data > key)return BTS_Insert(T->lchild, key);elsereturn BTS_Insert(T->rchild, key);
}

1.4、二叉排序树的构造

void Creat_BST(BiTree& T, int str[], int n) {T = NULL;int i = 0;while (i < n) BTS_Insert(T, str[i++]);
}

1.5、二叉排序树的删除

删除某结点后,该树必须还是一棵二叉排序树

步骤:①若被删的结点z是叶节点,直接删除

           ②若结点z只有一棵左子树或者右子树,让z的子树成为z父节点的子树,代替z的位置

           ③若结点z有两棵子树,让z的直接后继(右子树的min,右子树左走到头)(或直接前驱(左子树max,左子树右走到头))代替z,然后从二叉排序树中删除这个直接后继(或直接前驱),从而转化为①②

1.6、查找效率分析

取决于树的高度。若二叉排序树的左右子树的高度只差的绝对值不超过1,则ALS_{yes} = O(log_{2}n )。若该树为单支树,则ALS=O(n)

1.7、二分查找判定树和二叉排序树的区别

①查找过程:差不多

②平均时间性能:差不多

③唯一性:二分判定树唯一,但二叉排序树不唯一

④维护表的有序性:二叉排序树无需移动结点,只需修改指针即可完成插入和删除,平均执行时间为O(log_{2}n ),二分查找的对象是有序顺序表,插入删除平均执行时间为O(n)

⑤若有序表是静态查找表:宜用顺序表作为存储结构,而采用二分查找实现查找

⑥若有序表是动态查找便:采用二叉排序树作为逻辑结构

2、平衡二叉树AVL

2.1、目的及定义

        ①目的:避免树的高度增长过快,降低二叉排序树的性能,适用于以查为主,很少删/插的场景

        ②定义:左子树和右子树的高度之差的绝对值不超过1

2.2、平衡二叉树的插入

若插入导致了不平衡,则先找到插入路径上离插入结点最近的平衡因子的绝对值大于1的结点A,再对以A为根的子树,调整。

调整方法:

①LL(A的L的L插入新结点导致不平衡):右旋一次,将A的左孩子B作为根,而A成为B的右孩子,B原来的右子树作为A的左子树

②RR(A的R的R插入新结点导致不平衡):左旋一次,将A的右孩子B作为根,而A成为B的左孩子,B原来的左子树作为A的右子树

③LR(A的L的R插入新结点导致不平衡):先左旋再右旋。左旋:以A的左子树B为根,进行一次左旋操作,使B的右孩子C提升到B的位置。再进行右旋,使C提升到A的位置

④RL(A的R的L插入新结点导致不平衡):先右旋再左旋。右旋:以A的右子树B为根,进行一次右旋操作,使B的左孩子C提升到B的位置。再进行左旋,使C提升到A的位置

2.3、平衡二叉树的构造

在构造过程中不断调整使树平衡

2.4、平衡二叉树的删除

先以二叉排序树的方法对结点z删除

步骤:①若被删的结点z是叶节点,直接删除

           ②若结点z只有一棵左子树或者右子树,让z的子树成为z父节点的子树,代替z的位置

           ③若结点z有两棵子树,让z的直接后继(右子树的min,右子树左走到头)(或直接前驱(左子树max,左子树右走到头))代替z,然后从二叉排序树中删除这个直接后继(或直接前驱),从而转化为①②

            ④若导致了不平衡,对结点z向上回溯,找到第一个不平衡的结点w,再进行调整

2.5、平衡二叉树的查找

①与二叉排序树相同,进行关键字的比较次数不超过树的高度

②深度为h的平衡二叉树中含有最少结点数n_{h}=n_{h-2} + n_{h-1} +1,其中n0=0,n1=1,n2=2,n3=4,n4=7......

③含有n个结点的平衡二叉树的最大高度为O(log_{2}n ),因此平均查找效率为O(log_{2}n )

3、红黑树

3.1、目的及定义

①目的:为了保持AVL树的平衡性,在插入和删除操作后,会非常频繁地调整全树整体拓扑结构,代价较大,为放款条件,而引入。适用于频繁删/插操作

②定义:一棵红黑树是满足红黑性质的二叉排序树

        根节点是黑色的

        虚构的外部节点是黑色的(null结点)

        不存在两个相邻的红结点

        对每个结点,从该结点到任意一个外部节点的简单路径上,所含黑节点的数量相同

        引入n+1个外部节点,保证每个内部节点子树非空

        黑高(bh):从某结点出发(不包含该结点)到达一个外部节点的任意一个简单路上上的黑节点的总数

3.2、结论

①从根到外部节点的最长路径不大于最短路径的2倍

②有n个内部节点的红黑树的高度h<=2log_2{(n+1)}

③根节点黑高为h的红黑树中,内部结点至少有多少个?

        最少:总共h层黑节点的满树:2^{h}-1

3.3、红黑树的插入

先以二叉排序树的方法对结点z插入,然后调整:新插入的结点初始为红色

①如果z的父节点是黑色,无需调整

②如果z是根节点,z为黑色,树的黑高增1

③如果z不是根节点,且父节点z.p为红色

        Ⅰ、z的叔结点y是黑色,且z是一个右孩子:LR,左旋再右旋 或 RL,右旋再左旋;

        Ⅱ、z的叔结点y是黑色,且z是一个左孩子:LL,右旋一次 或 RR,左旋一次。以上两者旋转后,将z的爷父结点交换颜色

        Ⅲ、z的叔结点u是红色:父叔都是红色的,爷是黑色的。先将父叔染为黑色,爷染为红色。然后把爷结点作为z重复循环,指针z在树上上移两层。知道满足z为根节点或ⅠⅡ的情况

3.4、红黑树的删除

4、B树和B+树

四、散列表

相关文章:

数据结构-查找

一、基本术语 二、线性结构 ASL&#xff1a;平均查找长度 1、顺序查找 1.1、代码实现 typedef struct {int* elem;int TableLen; }SSTable;int Search_Seq(SSTable ST, int key) {ST.elem[0] key; //哨兵&#xff0c;使得循环不用判断数组是否会越界int i;for (i ST…...

Ubuntu环境下 pip安装应用时报错

pip安装应用时&#xff0c;报SSL错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 可能原因是python没有ssl&#xff0c;则在python安装时应该添加ssl ./configure --with-openssl/usr/local/ssl …...

打包时未添加camera模块,请参考https://ask.dcloud.net.cn/arss/1ooticle/283

今天在app打包使用的时候突然发现app在拍照上传照片的时候遇到这个问题 遇到这种情况通常是因为app打包的时候manifestjson文件中App模块配置中的Camera&Gallery配置没有打开&#xff0c;点击相应选项勾选即可 然后再上传打包就好了! 哈哈哈好久没写博客了最近太忙了&…...

Vue3+Setup使用websocket

创建src/util/socket.ts let websock: any null; let global_callback: any null; const serverPort "8080"; // webSocket连接端口 const wsuri "ws://" window.location.hostname ":" serverPort "/wsdemo"; function crea…...

tcpdump快速入门及实践手册

tcpdump快速入门及实践手册 1. 快速入门 [1]. 基本用法 基本用法&#xff1a; tcpdump [选项 参数] [过滤器 参数] [rootkysrv1 pwe]# tcpdump -h tcpdump version 4.9.3 libpcap version 1.9.1 (with TPACKET_V3) OpenSSL 1.1.1f 31 Mar 2020 Usage: tcpdump [-aAbdDefhH…...

javascript双判断语句

JavaScript的if双判断语句和java相似 if&#xff08;条件表达式&#xff09; { 执行语句 } else { 执行语句 } 比如说要判断一个年份是否是闰年&#xff0c;代码如下 html><head><meta charset"UTF-8"><title></title></hea…...

C# 中的多态

多态的定义&#xff1a; 通过指向派生类的基类引用&#xff0c;调用虚函数&#xff0c;会根据引用所指向派生类的实际类型&#xff0c;调用派生类中的同名重写函数&#xff0c;便是多态。 C#中的多态可以分为两种类型&#xff1a; 编译时多态&#xff08;静态多态&#xff09;&…...

高性能内存对象缓存Memcached原理与部署

目录 一&#xff1a;Memcached 1&#xff1a;Memcached的概述 2&#xff1a;数据存储方式与数据过期方式 &#xff08;1&#xff09;数据存储方式&#xff1a;Slab Allocation (2)数据过期方式:LRU、Laxzy Expiration 3.Memcached 缓存机制 4.Memcached 分布式 5.Memcac…...

【C++进阶】map与set的封装实践

文章目录 map和setmapmap的框架迭代器operator()operator--()operator()和operator!()operator*()operator->() insertbegin()end()operator[] ()map的所有代码&#xff1a; set的封装迭代器的封装总结 map和set 通过观察stl的底层我们可以看见&#xff0c;map和set是通过红…...

可视化编程-七巧低代码入门02

1.1.什么是可视化编程 非可视化编程是一种直接在集成开发环境中&#xff08;IDE&#xff09;编写代码的编程方式&#xff0c;这种编程方式要求开发人员具备深入的编程知识&#xff0c;开发效率相对较低&#xff0c;代码维护难度较大&#xff0c;容易出现错误&#xff0c;也需要…...

算法:魔法字典

1️⃣要求&#xff1a; 设计一个使用单词列表进行初始化的数据结构&#xff0c;单词列表中的单词 互不相同 。 如果给出一个单词&#xff0c;请判定能否只将这个单词中一个字母换成另一个字母&#xff0c;使得所形成的新单词存在于你构建的字典中。 实现 MagicDictionary 类…...

html+css 实现hover 翻转按钮

前言:哈喽,大家好,今天给大家分享html+css 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 一、效果二、原理解析1.这是一个,hover翻转按钮的效果。这其实是用==一个元素==实现的。…...

ETL程序员如何平衡日常编码工作与提升式学习

在快速发展的科技行业中&#xff0c;程序员面临着不断更新的技术和工具&#xff0c;尤其是数据领域的从业者&#xff0c;如ETL&#xff08;抽取、转换、加载&#xff09;工程师。如何在日常繁重的编码工作中找到时间进行提升式学习&#xff0c;成为了许多ETL工程师的共同挑战。…...

被嫌弃的35岁程序员,竟找到了职业的新出路:PMP项目管理

35岁&#xff0c;本应是事业发展的高峰期。更多听到的却是35岁职场天花板&#xff0c;特别是IT从业者&#xff0c;35岁就好像是一道迈不过的坎&#xff1a;多年的工作经验&#xff0c;在35岁的生理年龄面前&#xff0c;一文不值。 IT从业者若想安然度过“35岁危机”&#xff0…...

跟李沐学AI:目标检测、锚框

边缘框 用于表示物体的位置&#xff0c;一个边缘框通过四个数字定义&#xff1a;(坐上x, 左上y, 右下x, 右下y)或&#xff08;左上x, 左上y, 宽, 高&#xff09; 通常物体检测或目标检测的数据集比图片分类的数据集小很多&#xff0c;因为物体检测数据集标注成本高很多。 目…...

【鸿蒙学习】HarmonyOS应用开发者基础 - 构建更加丰富的页面(一)

学完时间&#xff1a;2024年8月14日 一、前言叨叨 学习HarmonyOS的第六课&#xff0c;人数又成功的降了500名左右&#xff0c;到了3575人了。 二、ArkWeb 1、概念介绍 ArkWeb是用于应用程序中显示Web页面内容的Web组件&#xff0c;为开发者提供页面加载、页面交互、页面调…...

机器学习深度学习中的Warmup技术是什么?

机器学习&深度学习中的Warmup技术是什么&#xff1f; 在机器学习&深度学习模型的训练过程中&#xff0c;优化器的学习率调整策略对模型的性能和收敛性至关重要。Warmup是优化器学习率调整的一种技术&#xff0c;旨在改善训练的稳定性&#xff0c;特别是在训练的初期阶…...

ECMAScript6中的模块:export导出、import导入

1、模块概述 早期的 JavaScript 程序很小&#xff0c;通常被用来执行独立的脚本任务&#xff0c;在 Web 页面中需要的地方提供一定的交互。随着 Web 应用程序变得越来越复杂&#xff0c;有必要考虑提供一种将 JavaScript 程序拆分为可按需导入的单独模块的机制&#xff0c;这就…...

mysql写个分区表

因为表量已经达到1个亿了。现在想做个优化&#xff0c;先按照 create_time 时间进行分区吧。 create_time 是varchar类型。 CREATE TABLE orders (id varchar(40) NOT NULL ,order_no VARCHAR(20) NOT NULL,create_time VARCHAR(20) NOT NULL,amount DECIMAL(10,2) NOT NULL,…...

Hystrix——服务容错保护库

熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压&#xff0c;最终导致自身服务瘫痪的一种机制&#xff0c;它的功能类似电路的保险丝&#xff0c;其目的是为了阻断故障&#xff0c;从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…...

Unity游戏多语言实时翻译解决方案:XUnity Auto Translator全解析

Unity游戏多语言实时翻译解决方案&#xff1a;XUnity Auto Translator全解析 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏市场中&#xff0c;语言障碍成为制约玩家体验的关键因素。XUnity…...

终极资源下载神器:三分钟上手,轻松获取全网视频音频资源

终极资源下载神器&#xff1a;三分钟上手&#xff0c;轻松获取全网视频音频资源 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https:…...

OpenClaw私有化部署指南:Qwen3-VL:30B+飞书智能助手

OpenClaw私有化部署指南&#xff1a;Qwen3-VL:30B飞书智能助手 1. 为什么选择本地化部署&#xff1f; 去年我接手了一个需要处理大量敏感数据的项目&#xff0c;团队最初尝试使用公有云API&#xff0c;但很快遇到了数据合规问题。这促使我开始研究本地化AI解决方案&#xff0…...

音频可视化创新实践:从原理到场景的桌面交互指南

音频可视化创新实践&#xff1a;从原理到场景的桌面交互指南 【免费下载链接】rainmeter Desktop customization tool for Windows 项目地址: https://gitcode.com/gh_mirrors/ra/rainmeter 解析音频信号&#xff1a;从声波到视觉的转化机制 当音乐在耳边响起时&#x…...

深入解析IoU(Jaccard系数)在目标检测中的关键作用与高效实现

1. IoU究竟是什么&#xff1f;从基础概念到视觉理解 第一次接触目标检测时&#xff0c;我对着论文里满屏的"IoU"缩写发懵——这到底是个什么魔法指标&#xff1f;后来在调试YOLO模型时才发现&#xff0c;这个看似简单的比值&#xff0c;实际上是整个检测任务的基石性…...

Java GeoTools实战:5分钟搞定热力图生成与TIFF文件导出(附完整代码)

Java GeoTools实战&#xff1a;5分钟搞定热力图生成与TIFF文件导出&#xff08;附完整代码&#xff09; 热力图作为一种直观的数据密度可视化工具&#xff0c;在GIS开发中扮演着重要角色。本文将带你快速掌握使用Java GeoTools库生成热力图并导出为TIFF文件的核心技巧&#xff…...

流处理 vs 批处理:大数据时代的技术选择指南

流处理 vs 批处理&#xff1a;大数据时代的技术选择指南 关键词&#xff1a;流处理、批处理、大数据、实时计算、离线计算、延迟、吞吐量 摘要&#xff1a;在大数据时代&#xff0c;数据处理就像一场永不停歇的"数据马拉松"。流处理和批处理是两种最核心的技术方案&a…...

C语言入门:了解历史与适用人群

要是您身为一名刚开始接触学习事物的人&#xff0c;再者您尚未弄明白何种属于编程语言&#xff0c;那就去瞧瞧这个了&#xff1a;什么是编程语言。 若您先前未曾接触过任何一种编程语言&#xff0c;或者您并不明白为何要是学习C语言来着&#xff0c;请看&#xff1a;为什么C语言…...

DanKoe 视频笔记:重塑自我:如何摆脱糟糕的生活状态

在本教程中&#xff0c;我们将探讨为何生活可能陷入困境&#xff0c;并学习如何通过一系列有意识的微小选择、提升个人标准以及利用互联网的力量来重塑自我&#xff0c;最终走上价值创造者的道路。我们将分析问题的根源&#xff0c;并提供具体的行动步骤。 微小的选择&#xf…...

Cursor Pro功能优化工具:提升AI编程体验的完整指南

Cursor Pro功能优化工具&#xff1a;提升AI编程体验的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial …...