数据结构 | 查找

基本概念

关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。例如,在由一个学生元素构成的数据集合中,学生元素中“学号”这一数据项的值唯一地标识一名学生。

查找表:同一类型的数据元素

平均查找长度:在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度,则是所有查找过程中进行关键字的比较次数的平均值,其数学定义为


顺序表查找

一、定义

顺序查找(Sequential Search) 又叫线性查找,若查找到某个元素的关键字满足给定条件,则查找成功返回该元素在线性表中的位置;若已经查找到表的另一端,但还没有查找到符合给定条件的元素,则返回查找失败的信息
 

二、算法

/*有哨兵顺序查找*/
int Sequential_Search(int *a, int n, int key){int i;a[0] = key;	//设置a[0]为关键字,称之为“哨兵”i = n;	//循环从数组尾部开始while(a[i] != key){i--;}return i;	//返回0则说明查找失败
}

有序表查找

一、折半查找

先决条件:表中结点按关键字有序,且顺序(一维数组)存储

二分法思想:

(1)求有序表的中间位置mid

  (2) 若r[mid].key==k 查找成功(k是要找的元素)

        r[mid].key>k  在左子表继续 

        r[mid].key<k 在右子表继续

算法:

int Binary_Search(SeqList L, ElemType key){int low = 0, high = L.length - 1, mid;while(low <= high){mid = (low + hight)/2;	//取中间位置if(L.elem[mid] == key){return mid;	//查找成功返回所在位置}else if(L.elem[mid] > key){high = mid - 1;	//从前半部分继续查找}else{low = mid + 1;	//从后半部分继续查找}}return -1;	//查找失败,返回-1
}


二叉排序树与平衡二叉树

一、二叉排序树(Binary Sort Tree)

1、定义

二叉排序树(也称二叉查找树)或者是一棵空树,或者是具有下列特性的二叉树:

  1. 左子树非空,则左子树上所有结点的值均小于根结点的值。
  2. 右子树非空,则右子树上所有结点的值均大于根结点的值。
  3. 左、右子树也分别是一棵二叉排序树

2、二叉排序树的常见操作

构造一个二叉树的结构:

/*二叉树的二叉链表结点结构定义*/
typedef struct BiTNode
{int data;	//结点数据struct BiTNode *lchild, *rchild;	//左右孩子指针
} BiTNode, *Bitree;
(1)查找操作
/*
递归查找二叉排序树T中是否存在key
指针f指向T的双亲,其初始调用值为NULL
若查找成功,则指针p指向该数据元素结点,并返回TRUE
否则指针p指向查找路径上访问的最后一个结点并返回FALSE
*/
bool SearchBST(BiTree T, int key, BiTree f, BiTree *p){if(!T){*p = f;return FALSE;}else if(key == T->data){//查找成功*p = T;return TRUE;}else if(key < T->data){return SearchBST(T->lchild, key, T, p);	//在左子树继续查找}else{return SearchBST(T->rchild, key, T, p);	//在右子树继续查找}
}
(2)插入操作

有了二叉排序树的查找函数,那么所谓的二叉排序树的插入,其实也就是将关键字放到树中的合适位置而已。

/*
当二叉排序树T中不存在关键字等于key的数据元素时
插入key并返回TRUE,否则返回FALSE
*/
bool InsertBST(BiTree *T, int key){BiTree p, s;if(!SearchBST(*T, key, NULL, &p)){//查找不成功s = (BiTree)malloc(sizeof(BiTNode));s->data = key;s->lchild = s->rchild = NULL;if(!p){*T = s;	//插入s为新的根节点}else if(key < p->data){p->lchild = s;	//插入s为左孩子}else{p->rchild = s;	//插入s为右孩子}return TRUE;}else{return FALSE;	//树种已有关键字相同的结点,不再插入}
}

 有了二叉排序树的插入代码,我们要实现二叉排序树的构建就非常容易了,几个例子:

int i;
int a[10] = {62, 88, 58, 47, 35, 73, 51, 99, 37, 93};
BiTree T = NULL;
for(i = 0; i<10; i++){InsertBST(&T, a[i]);
}

(3)删除操作

二叉排序树的查找和插入都很简单,但是删除操作就要复杂一些,此时要删除的结点有三种情况:

  1. 叶子结点;
  2. 仅有左或右子树的结点;
  3. 左右子树都有的结点;

前两种情况都很简单,第一种只需删除该结点不需要做其他操作;第二种删除后需让被删除结点的直接后继接替它的位置;复杂就复杂在第三种,此时我们需要遍历得到被删除结点的直接前驱或者直接后继来接替它的位置,然后再删除

 二、平衡二叉树(AVL树)

参考:平衡二叉树详解 通俗易懂-CSDN博客

B树(m叉平衡树)

1.概念:

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

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

相关文章

ARM Cortex-M核的内核态,用户态

首先&#xff0c;用户态和内核态是从操作系统层面上来划分的&#xff0c;如果没有操作系统&#xff0c;我可以直接运行在特权模式下&#xff0c;并使用特权指令。在这种情况下&#xff0c;我将负责管理和控制系统资源&#xff0c;执行关键操作&#xff0c;以及确保系统的安全性…

OSG编程指南<十三>:OSG渲染状态

1、前言 在 OSG 中存在两棵树&#xff0c;即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树&#xff0c;它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态&#xff0c;并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisito…

正则表达式回溯陷阱

一、匹配场景 判断一个句子是不是正规英文句子 text "I am a student" 一个正常的英文句子如上&#xff0c;英文单词 空格隔开 英文单词 多个英文字符 [a-zA-Z] 空格用 \s 表示 那么一个句子就是单词 空格&#xff08;一个或者多个&#xff0c;最后那个单词…

java学习part21枚举

117-面向对象(高级)-枚举类的两种定义方式及练习_哔哩哔哩_bilibili 1.概念 2.enum关键字 枚举早期是用class内放n个public static final类变量供调用。 后来有了enum关键字&#xff0c;enum里的枚举变量都是public static final&#xff0c;但是必须都省略不写 正确方法 &…

【Java】7. 类型转换和类型判断

7. 类型转换 7.1 基本类型转换 顺箭头&#xff1a;隐式转换&#xff08;自动&#xff09; 逆箭头&#xff1a;强制转换&#xff08;可能造成精度丢失&#xff09; byte a 10; int b a; int c 1000; byte d (byte) c; System.out.println(d); // -24 7.2 包装类型与基…

Vue 双向数据绑定

之前通过v-bind来完成的数据绑定&#xff0c;属性值和表达式进行绑定&#xff0c;表达式的值发生变化了属性值也跟着发生变化。 单向数据绑定&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</titl…

C语言错误处理之“非局部跳转<setjmp.h>头文件”

目录 前言 setjmp宏 longjmp函数 使用方法&#xff1a; 实例&#xff1a;测试setjmp与longjmp的使用 前言 通常情况下&#xff0c;函数会返回到它被调用的位置&#xff0c;我们无法使用goto语句改变它的返回的方向&#xff0c;因为goto语句只能跳转到同一函数内的某个标号…

文件服务器迁移

文件服务器迁移还是比较简单的 win server加域 导出配额文件 选中所有项&#xff0c;点击导出 导出共享文件夹权限列表 导出文件夹的权限表&#xff0c;留作备用。需要用到“icacls” icacls c:\windows\* /save aclfile /t # C:\Windows 目录及其子目录中所有文件的 DAC…

pandas教程:USDA Food Database USDA食品数据库

文章目录 14.4 USDA Food Database&#xff08;美国农业部食品数据库&#xff09; 14.4 USDA Food Database&#xff08;美国农业部食品数据库&#xff09; 这个数据是关于食物营养成分的。存储格式是JSON&#xff0c;看起来像这样&#xff1a; {"id": 21441, &quo…

简单认识泛型【java】

目录 1.什么是泛型 2.引出泛型 2.1语法 3. 泛型类的使用 3.1 语法 4 泛型如何编译的 4.1 擦除机制 5.泛型的上下界 5.1 语法 6.注意 1.什么是泛型 一般的类和方法&#xff0c;只能使用具体的类型: 要么是基本类型&#xff0c;要么是自定义的类。如果要编写可以应用于…

2023第十四届蓝桥杯Java B组个人题解

&#x1f48e;蓝桥杯系列文章 欢迎大家阅读蓝桥杯文章专栏&#x1f344;&#x1f344; &#x1f525;2023第十四届蓝桥杯模拟赛第二期个人题解&#xff08;Java实现&#xff09; &#x1f525;2023第十四届蓝桥杯模拟赛第三期个人题解&#xff08;Java实现&#xff09; &#…

【Unity3D】MAX聚合广告SDK——Pangle广告接入(成了!成了!)

Pangle, App Monetization Simplified 注册 登录 创建应用 创建广告单元 将其应用ID和广告ID关联到MAX广告。 下载Pangle Unity Plugin包&#xff0c;新建一个空工程&#xff08;很重要&#xff09; Unity版本2019.4.0f1 gradle plugin 4.2.0 gradle版本6.7.1 build_tools 34.…

有没有不含亚硫酸盐的葡萄酒?

没有完全不含亚硫酸盐的葡萄酒&#xff0c;有机葡萄酒和生物动力葡萄酒中也会含有少量天然 亚硫酸盐。因为它是在发酵过程中产生的一种化合物&#xff0c;所以不可能酿造无亚硫酸盐的葡萄酒。 在大多数葡萄酒国家都有葡萄酒法律规定&#xff0c;如果葡萄酒超过特定的亚硫酸盐水…

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…

TDA4VM LInux SDK编译

文章目录 前言编译步骤前言 上篇TDA4VM EVM开发板调试笔记我们尝试把EVM开发板跑起来了,本篇主要记录,Linux SDK 的编译过程。 编译步骤 安装依赖: $ sudo apt-get update $ # Install packages required for builds $ sudo apt-get -f -y install \

【微服务专题】微服务架构演进

目录 前言阅读对象阅读导航前置知识笔记正文一、系统架构的演变1.1 单体架构1.2 单体水平架构1.3 垂直架构1.4 SOA架构1.5 微服务架构 二、如何实现微服务架构2.1 微服务架构下的技术挑战2.2 微服务技术栈选型2.3 什么是Spring Cloud全家桶2.4 Spring Cloud Alibaba版本选择 学…

慢 SQL 分析及优化

目录 分析慢 SQL SQL 优化 单表优化 多表优化 慢 SQL&#xff1a;指 MySQL 中执行比较慢的 SQL排查慢 SQL 最常用的方法&#xff1a;通过慢查询日志来查找慢 SQL MySQL 的慢查询日志是 MySQL 提供的一种日志记录&#xff0c;它用来记录在 MySQL 中响应时间超过阈值的语句&…

AI模型训练——入门篇(一)

前言 一文了解NLP&#xff0c;并搭建一个简单的Transformers模型&#xff08;含环境配置&#xff09; 一、HuggingFace 与NLP 自从ChatGPT3 问世以来的普及性使用&#xff0c;大家或许才真正觉察AI离我们已经越来越近了&#xff0c;自那之后大家也渐渐的开始接触stable diff…

esp32 esp-idf V5.1.1版本看门狗配置

idf.py menuconfig打开配置窗口 选择Component config选项

智慧城市交通大屏|助力解决城市交通问题

2017年起&#xff0c;数字孪生连续三年被Gartner列入“未来科技十大趋势”&#xff0c;由此可见数字孪生技术正屹立在数字化发展的风口之中。 数字孪生作为物理世界的数字映射&#xff0c;将流程、物体的信息利用数字技术实时映射到系统中&#xff0c;可以对某个设备、某个企业…