C语言-数据结构-查找

news2025/2/7 10:18:51

目录

一,查找的概念

二,线性查找

1,顺序查找

2,折半查找

3,分块查找

三,树表的查找

1,二叉排序树

(1)查找方式:

(2)、二叉排序树的插入和生成

(3)、二叉排序树的删除

2,平衡二叉树 

(1)、什么是平衡二叉树

(2)、平衡二叉树的插入调整

(1)LL型调整

(2)RR型调整

(3)LR型调整

(4)RL型调整

3,B-树

4,B+树

四,哈希查找

1,基本概念

2,哈希函数构造方法

3 哈希冲突解决方法

1、开放定址法

2、拉链法


一,查找的概念

查找表:是由一组记录组成的表或文件,而每个记录由若干个 数据项组成,并假设每个记录都有一个能唯一标识该记录的关键字。
内查找:若整个查找过程都在内存进行,则称之为内查找;
外查找:若查找过程中需要访问外存,则称之为外查找。
动态查找表;若在查找的同时对表做修改操作(如插入和删除), 则相应的表称之为动态查找表;否则称之为静态查找表。

平均查找长度(ASL):

其中:n是查找表中记录的个数。pi 是查找第i个记录的概率,ci 是找到第i个记录所需进行的比较次数。

二,线性查找

1,顺序查找

顺序表的表示:

typedef struct{
    KeyType key;
    ...//其他数据    
}ElemType;

typedef struct{
    ElemType *R;
    int length; 
}SSTable;

顺序查找的算法如下(在顺序表R[0..n-1]中查找关键字为k的元 素,成功时返回找到的元素的逻辑序号,失败时返回0)

int Search_Seq(SSTable ST ,KEYType key){
    for(i=ST.length;i>=1;--i)
        if(ST.R[i].key==key)
            return i;
    return 0;
}

增加"哨兵"和"监视哨",将key值放到数组下标为0的地方,这样就可以免去每次对i的比较验证,加快查找速度,这样查找可以使查找的时间减少一半

int Search_Seq(SSTable ST ,KEYType key){
    ST.R[0].key=key;
    for(i=ST.length;ST.R[i].key!=key;--i);
    return i;
}
成功情况下的平均查找长度ASL: (无论是否有序查找长度不变)
不成功情况下的平均查找长度ASL: n    (有序表和无序表的平均查找长度是不同的)

2,折半查找

折半查找也称为二分查找,要求线性表中的记录必须己按关键 字值有序(递增或递减)排列。

int BinSearch(SeqList R,int n,KeyType k)
 { 
    int low=1,high=ST.length,mid;
    while (low<=high)
    {
         mid=(low+high)/2;
         if (ST.R[mid].key==k)
             return mid;
         if (k<ST.R[mid].key)
             high=mid-1;
         else
             low=mid+1;
     }
     return 0;
}

二分查找过程可用二叉树来描述: 把当前查找区间的中间位置上的记录作为 根; 左子表和右子表中的记录分别作为根的 左子树和右子树。 这样的二叉树称为判定树或比较树

成功时的平均查找长度为:
失败时的平均查找长度为:外部节点(i-n+1)*(所在层数-1)/外部节点总数

对于n个元素,二分查找,成功时最多的关键字比较次数为:log2(n+1)  ; 不成功时关键字比较次数为:log2(n+1) 。

二分查找的时间复杂度为O(log2n)。
内部节点为n,则外部节点为n+1

3,分块查找

索引存储结构=数据表+ 索引表;

分块查找方法: 索引表(有序):可以顺序查找块,也可以二分查找块。

数据块(无序):只能 顺序查找块中元素。

查找效率:

顺序查找折半查找分块查找
ASL最大最小中间
表结构有序表/无序表有序表分块有序
存储结构顺序表/线性链表顺序表顺序表/线性链表

三,树表的查找

1,二叉排序树

二叉排序树(简称BST)又称二叉查找(搜索)树. 其定义为:二叉 排序树或者是空树,或者是满足如下性质(BST性质)的二叉树: 若它的左子树非空,则左子树上所有节点值(指关键字值)均小于根节点值; 若它的右子树非空,则右子树上所有节点值均大于根节点值; 左、右子树本身又各是一棵二叉排序树

二叉排序树的中序遍历序列递增

typedef struct node
 {
     KeyType key;//关键字项
     InfoType data;//其他数据域
     struct node *lchild,*rchild; //左右孩子指针
} BSTNode;

(1)查找方式:

BSTNode *SearchBST(BSTNode *bt,KeyType k)
 {
     if (bt==NULL|| bt->key==k) //递归出口
         return bt;
     if (k<bt->key)
         return SearchBST(bt->lchild,k); //在左子树中递归查找
     else
         return SearchBST(bt->rchild,k); //在右子树中递归查找
}
n个节点的二叉排序树的平均查找长度和树的形态有关
最好情况:ASL:时间复杂度:O(log2 N)
最坏情况:ASL: 时间复杂度:O(n)

(2)、二叉排序树的插入和生成

(1)若二叉排序树T为空,则创建一个key域为k的节点,将它作为 根节点;

(2)否则将k和根节点的关键字比较,若两者相等,则说明树中已 有此关键字k,无须插入,直接返回0;

(3)若k<T->key,则将k插入根节点的左子树中。

(4)否则将它插入右子树中。

任何节点插入到二叉排序树时,都是以叶节点插入的。

(3)、二叉排序树的删除

(1)被删除的节点是叶子节点:直接删去该节点。
(2)被删除的节点只有左子树或者只有右子树,用其左子树或者 右子树替换它(节点替换)。

(3)被删除的节点既有左子树,也有右子树:

以其中序前趋值替换之(值替换),然后再删除该前趋节点。 前趋是左子树中最大的节点。

也可以用其后继替换之,然后再删除该后继节点。后继是右子树 中最小的节点。

二叉排序树的特点
二叉排序树的中序序列是一个递增有序序列
根节点的最左下节点是关键字最小的节点
根节点的最 右下节点是关键字最大的节点

2,平衡二叉树 

(1)、什么是平衡二叉树

若一棵二叉树中每个节点的左、右子树的高度至多相差1,则称 此二叉树为平衡二叉树(AVL)。 平衡因子:该节点左子树的高度 - 右子树的高度。

(2)、平衡二叉树的插入调整

(1)LL型调整

LL型调整过程:

a, B节点带左子树α一起上升

b, A节点成为B的右孩子

c, 原来 B节点的右子树β作为A 的左子树

(2)RR型调整

RR型调整过程:

a, B 节点带右子树β一起上升

b, A节点成为B的左孩子 

c, 原来 B节点的左子树α作为A 的右子树

(3)LR型调整

LR型调整过程:

a, C节点穿过A、B节点上升

b, B节点成为C的左孩子,A 节点成为C的右孩子

c, 原来 C节点的左子树β 作为 B的右子树;原来C节点的 右子树γ 作为A的左子树

(4)RL型调整

RL型调整过程:

a, C节点穿过A、B节点上升

b, B节点成为C的右孩子,A 节点成为C的左孩子

c, 原来 C节点的左子树β 作为 A的右子树;原来C节点的 右子树γ 作为B的左子树

练习:

含有n个节点的平衡二叉树的平均查找长度为O(log2n)。

3,B-树

B-树又称为多路平衡查找树,是一种组织和维护外存文 件系统非常有效的数据结构。

定义一棵m阶B:

1, 树中每个节点至多有m个孩子节点(即至多有m-1个关键字) 最多关键字个数Max = m-1
2, 除根节点外,其他非叶子节子点至少有[m/2](向上取整)个孩子节点,最少关键字个数Min = [m/2]-1
3, 若根节点不是叶子节点,则根节点至少有两个孩子节点
4, 每个节点的结构如下,节点中按关键字大小顺序排列
5, 所有外部节点都在同一层上。B-树是所有节点的平衡因子均 等于0的多路查找树
6, 一棵B-树中总有n个关键字,则外部节点个数为n+1(外部节点就是失败节点,指向它的指针为空,不含有任何信 息,是虚设的)。

元素的添加:

1, 插入节点有空位置,即关键字个数n<m-1:直接把关键字k 有序插入到该节点的合适位置上。

2, 插入节点没有空位置,即原关键字个数n=m-1 进行分裂

元素的删除:

1,加入删除节点在叶子节点上,观察删除后是否会出现下溢出,即关键字个数小于min,如果小于观察兄弟是否有多余的节点,若有借过来,如果没有,将父节点里面的关键字下放到兄弟节点里面,然后,在与兄弟节点进行合并

2,如果不是叶子节点,找该节点的前驱或者后驱,将其顶替

4,B+树

定义m阶B+树:

1, 每个分支节点至多有m棵子树
2, 有n棵子树的节点恰好有n个关键字。
3, 所有叶子节点包含全部关键字及指向相应记录的指针,而且叶子节点按关键字大小顺序链接。并将所有叶子节点链接起来。
4, 所有分支节点(可看成是索引的索引)中仅包含它的各个子节点 (即下级索引的索引块)中最大关键字及指向子节点的指针。

四,哈希查找

1,基本概念

哈希函数把关键字为ki 的对象存放在相应的哈希地址中
哈希冲突对于两个关键字分别为ki 和kj (i≠j)的记录,有ki ≠kj ,但h(ki )=h(kj )。 把这种现象叫做哈希冲突(同义词冲突)
哈希表设计

与装填因子有关。装填因子α=存储的记录个数/哈希表的大小 =n/m α越小,冲突的可能性就越小;α越大(最大可取1), 冲突的可能性就越大。通常使最终的控制在0.6~0.9的范围内。

散列法的平均检索长度不随表中节点个数的增加而增加,而是随α的增加而增加的

与所采用的哈希函数有关 。好的哈希函数会减少冲突的发生;不 好的哈希函数会增加冲突的发生
与解决冲突方法有关 。好的哈希冲突解决方法会减少冲突的发生。

2,哈希函数构造方法

1、直接定址法: 直接定址法是以关键字k本身或关键字加上某个数值常量c作为哈希地 址的方法。直接定址法的哈希函数h(k)为: h(k) = kx+b
2、除留余数法:h(k)=k mod p ,p通常取小于等于表长的素数
3、数字分析法

3 哈希冲突解决方法

1、开放定址法

(1)线性探查法:d0 =h(k)  => d i =(di-1 +1) mod m (1≤i≤m-1)
(2)平方探查法: d0 =h(k) => d i =(d0 ± i^2) mod m (1≤i≤m-1)

2、拉链法

拉链法是把所有的同义词用单链表链接起来的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[江科大编程技巧] 第1期 定时器实现非阻塞式程序 按键控制LED闪烁模式——笔记

提前声明——我只是写的详细其实非常简单&#xff0c;不要看着多就放弃学习&#xff01; 阻塞&#xff1a;执行某段程序时&#xff0c;CPU因为需要等待延时或者等待某个信号而被迫处于暂停状态一段时间&#xff0c;程序执行时间较长或者时间不定 非阻塞&#xff1a;执行某段程…

如何理解:产品线经营管理的战略、组织、业务、项目、流程、绩效之间的逻辑关系?-中小企实战运营和营销工作室博客

如何理解&#xff1a;产品线经营管理的战略、组织、业务、项目、流程、绩效之间的逻辑关系&#xff1f;-中小企实战运营和营销工作室博客 产品线经营管理中&#xff0c;战略、组织、业务、项目、流程、绩效之间存在着紧密的逻辑关系&#xff0c;它们相互影响、相互作用&#xf…

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

Oracle 11G还有新BUG?ORACLE 表空间迷案!

前段时间遇到一个奇葩的问题&#xff0c;在开了SR和oracle support追踪两周以后才算是有了不算完美的结果&#xff0c;在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线&#xff0c;系统卡死不可用&#xff0c;通知到我排查&#xff0c;查看alert log看到是…

三只脚的电感是什么东西?

最近在做加湿器&#xff0c;把水雾化的陶瓷片需要有专门的驱动电路。 我参考了某宝卖家的驱动板以及网上的开源项目&#xff0c;发现了驱动电路的核心就是一个三脚电感。 在此之前我都没注意过这玩意&#xff0c;三脚电感不也还是电感嘛&#xff1f; 今天我们就来看看三脚电…

pyQT + OpenCV相关练习

一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作&#xff0c;如灰度化、翻转、旋转、亮度与对比度调整&#xff0c;以及一些滤镜效果&#xff08;模糊、锐化、边…

【Git_bugs】remote error GH013 Repository rule violations found for.md

背景 1 在一个分支上的提交顺序如下&#xff1a;-> 代表新的提交 在提交 E 中&#xff0c;文件包含了 GitHub 生成的 token提交 F 是一次普通的提交&#xff0c;不包含 token A -> ... -> E -> F (敏感信息在 E 中)附&#xff1a;给提交起名是为了方便说明问题。…

Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign

目录 1.导入单体架构项目 1.1 安装mysql 1.2 后端 1.3 前端 2.微服务 2.1 单体架构 2.2 微服务 2.3 SpringCloud 3.微服务拆分 3.1 服务拆分原则 3.1.1 什么时候拆 3.1.2 怎么拆 3.2 拆分购物车、商品服务 3.2.1 商品服务 3.2.2 购物车服务 3.3 服务调用 3.3.1 RestTemplate 3.…

安卓执法仪Android接入国标GB28181平台实现实时监控、对讲、报警、定位等管理方案

最近协助不少企业完成了4G无线设备国标接入的需求&#xff0c;尤其是国产芯片的接入&#xff0c;国标发展了十年的时间&#xff0c;目前协议从完成度、性能、AI等各个方面&#xff0c;都已经非常完美地满足各种各样的场景需求&#xff0c;尤其是GB28181-2022的推出&#xff0c;…

SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换

一、RESTful (一)RESTful概述 RESTful是一种软件架构风格&#xff0c;用于设计网络应用程序。REST是“Representational State Transfer”的缩写&#xff0c;中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作&#xff0c;以及使用HTTP请求来处理数据。RES…

国内独立开发者案例及免费送独立开发蓝图书

独立开发者在国内越来越受到关注&#xff0c;他们追求的是一种自由且自给自足的工作状态。 送这个&#xff1a; 少楠light&#xff08;Flomo、小报童、如果相机&#xff09;&#xff1a;他们是独立开发者的典范&#xff0c;不仅开发了多款产品&#xff0c;还坚信“剩者为王”…

【JavaEE进阶】@RequestMapping注解

目录 &#x1f4d5;前言 &#x1f334;项目准备 &#x1f332;建立连接 &#x1f6a9;RequestMapping注解 &#x1f6a9;RequestMapping 注解介绍 &#x1f384;RequestMapping是GET还是POST请求&#xff1f; &#x1f6a9;通过Fiddler查看 &#x1f6a9;Postman查看 …

一文详解MacOS+CLion——构建libtorch机器学习开发环境

对于希望在本地环境中进行深度学习开发的开发者来说&#xff0c;配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上&#xff0c;利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch&#xff0c;快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…

Bert中文文本分类

这是一个经典的文本分类问题&#xff0c;使用google的预训练模型BERT中文版bert-base-chinese来做中文文本分类。可以先在Huggingface上下载预训练模型备用。https://huggingface.co/google-bert/bert-base-chinese/tree/main 我使用的训练环境是 pip install torch2.0.0; pi…

shardingsphere分库分表项目实践5-自己用java写一个sql解析器+完整项目源码

前1节我们介绍了 shardingsphere 分表分库的sql解析与重写&#xff1a; shardingsphere分库分表项目实践4-sql解析&重写-CSDN博客 那么shardingsphere sql 解析底层究竟是怎么实现的呢&#xff0c;其实它直接用了著名的开源软件 antlr . antlr 介绍&#xff1a; ANTLR&a…

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里&#xff0c;犹如一场精心编排的交响乐演奏&#xff0c;每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS&#xff08;工作分解结构&#xff09;、甘特图、关键路径法无疑是这场交响乐中的关键乐章&#xff0c;它们从不同维度为项目管…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力&#xff0c;不仅达到了 AGI 的门槛&#xff0c;甚至摸到了 ASI&#xff08;超级人工智能&#xff09;的边。 Day 1&#xff1a;o1完全版&#xff0c;开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件&#xff0c;提供了多种机制来确保消息的可靠传递。其中&#xff…

sentinel限流+其他

quick-start | Sentinel sentinel 作用 限流 熔断降级 1&#xff0c;限制什么 QPS 并发线程数 2&#xff0c;限制什么 资源&#xff0c;什么资源 服务&#xff0c;方法&#xff0c;接口&#xff0c;或者一段代码 3&#xff0c;实现方式 配置规则 注解 其他 Java常见5种限流…