查找算法简记

一、简单查找(顺序查找)

最基本的查找,相当于遍历,从头到尾一个一个找。


二、二分查找


1、简述
二分查找的输入是一个有序的元素列表。
如果要查找的元素包含在列表中,二分查找返回其位置;
否则返回null。

2、特点
对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步。
在 N 个键的有序数组中进行二分查找最多需要( lgN+1)次比较(无论是否成功)。
向大小为 N 的有序数组中插入一个新的元素在最坏情况下需要访问∼ 2N 次数组,因此向一个空符号表中插入 N 个元素在最坏情况下需要访问∼ N2 次数组。

三、符号表(字典)


1、简述
符号表是一种存储键值对的数据结构,支持两种操作:
插入(put),即将一组新的键值 对存入表中;
查找(get),即根据给定的键得到相应的值。

2、操作与结果
一般来说,在符号表中查找一个键可能得到两种结果。
如果含有该键的结点存在于表中,我们的查找就命中了,然后返回相应的值。
否则查找未命中(并返回 null)

3、目的
符号表最主要的目的就是将一个键和一个值联系起来。
用户能够将一个键值对插入符号表,并在之后能够从符号表的所有键值对中按照键直接找到相对应的值

4、规则
每个键只对应着一个值(表中不允许存在重复的键);
当用例代码向表中存入的键值对和表中已有的键(及关联的值)冲突时,新的值会替代旧的值
键不能为空, 不允许有空值

四、二叉树


二叉树的内容非常多,先简单记录一些基本概念

1、二叉搜索树
二叉搜索树就是使用每个结点含有两个链接(链表中每个结点只含有一个链接)的二叉查找树来高效地实现符号表。
在二叉查找树中,每个结点还包含了一个键和一个值,键之间也有顺序之分以支持高效的查找。
二叉搜索树是一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现。

2、平衡搜索树
理想情况下我们希望能够保持二分查找树的平衡性,这可以稳定提升查找的效率,处于这个目的,二叉树概念下衍生出了2-3树,并进而衍生出了红黑树。

3、2-3树
我们将一棵标准的二叉查找树中的结点称为 2- 结点(含有一个键和两条链接),而现在我们引入 3- 结点,它含有两个键和三条链接。 2- 结点和 3- 结点中的每条链接都对应着其中保存的键所分割产生的一个区间
一棵 2-3 查找树或为一棵空树,或由以下结点组成:
(1) 2- 结点,含有一个键(及其对应的值)和两条链接,左链接指向的 2-3 树中的键都小于该结点,右链接指向的 2-3 树中的键都大于该结点。
(2) 3- 结点,含有两个键(及其对应的值)和三条链接,左链接指向的 2-3 树中的键都小于该结点,中链接指向的 2-3 树中的键都位于该结点的两个键之间,右链接指向的 2-3树中的键都大于该结点。

4、红黑树
红黑二叉查找树背后的基本思想是用标准的二叉查找树(完全由 2- 结点构成)和一些额外的信息(替换3- 结点)来表示 2-3树。我们将树中的链接分为两种类型: 
红链接将两个 2- 结点连接起来构成一个 3- 结点,
黑链接是 2-3 树中的普通链接。
可以理解为将 3- 结点表示为由一条左斜的红色链接(两个 2-结点其中之一是另一个的左子结点)相连的两个 2- 结点

5、二叉树的基本查找操作
在二叉查找树中查找一个键的递归算法:
如果树是空的,则查找未命中;
如果被查找的键和根结点的键相等,查找命中,
否则我们就(递归地)在适当的子树中继续查找。
如果被查找的键较小就选择左子树,较大则选择右子树
 

五、散列表(hashtable 哈希表)


1、概念
散列表可以认为是普通数组概念的推广, 是实现字典操作的一种有效数据结构, 也被称为散列映射、映射、字典和关联数组,是一种包含额外逻辑的数据结构

2、散列函数
散列函数的计算过程会将键转化为数组的索引。
如果我们有一个能够保存M个键值对的数组,那么我们就需要一个能够将任意键转化为该数组范围内的索引( [0,M-1] 范围内的整数) 的散列函数。
散列函数和键的类型有关。
严格地说, 对于每种类型的键都我们都需要一个与之对应的散列函数。
散列最主要的目的在于均匀地将键散布开来,因此在计算散列后键的顺序信息就丢失了。
散列函数是构造散列表的关键,一般来说,散列函数应该有以下特点:
(1)一致性 同样的输入返回的结果是一致的,同样的,不同的输入返回的结果一般也不同
(2)有效性 散列函数只返回有效结果

3、查找操作
使用散列的查找算法分为两步。
第一步是用散列函数将被查找的键转化为数组的一个索引。
理想情况下,不同的键都能转化为不同的索引值。
非理想情况,需要处理两个或者多个键都会散列到相同的索引值的情况。
散列查找的第二步就是处理这种碰撞冲突的过程。
有两种常用的解决碰撞的方法: 拉链法和线性探测法。


4、拉链法
将大小为 M 的数组中的每个元素指向一条链表,链表中的每个结点都存储了散列值为该元素的索引的键值对。
因为发生冲突的元素都被存储在链表中,这种方法被称为拉链法。

5、线性探测法
实现散列表的另一种方式就是用大小为 M 的数组保存 N 个键值对,其中 M>N。依靠数组中的空位解决碰撞冲突。
这种统称为开放地址散列表。
开放地址散列表中最简单的方法叫做线性探测法
当碰撞发生时(一个键的散列值已经被另一个不同的键占用),我们直接检查散列表中的下一个位置(将索引值加 1)。
这样的线性探测可能会产生三种结果
(1) 命中,该位置的键和被查找的键相同;
(2) 未命中,键为空(该位置没有键);
(3) 继续查找,该位置的键和被查找的键不同。
我们用散列函数找到键在数组中的索引,检查其中的键和被查找的键是否相同。
如果不同则继续查找(将索引增大,到达数组结尾时折回数组的开头),直到找到该键或者遇到一个空元素。

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

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

相关文章

开发流程初学者指南——需求分析

目录 从零开始理解需求分析什么是需求分析?需求分析的目标需求分析的基本原则需求分析的各个阶段需求分析的常用方法和工具编写需求文档总结 从零开始理解需求分析 需求分析是软件开发过程中不可或缺的一环,它帮助我们明确用户的需求,确保最…

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢…

数据结构之链式结构二叉树的实现(进阶版)

本篇文章主要讲解链式二叉树的层序遍历以及判断是否为一棵完全二叉树 二者将会用到之前学过的队列知识,是将队列和二叉树的整合 一、如何将之前已经写好的文件加入当前的编译界面 如图所示,打开我们需要加入文件所在的文件夹,找到我们要加…

StructRAG简介

StructRAG是一种新型的框架,旨在提升大型语言模型(LLMs)在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制,根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…

Windows Server NTFS磁盘变RAM的处理过程

问题描述 客户服务器的磁盘数据爆满,需要将磁盘进行扩容,因为是虚拟机所以先在虚拟化平台上将原来的磁盘空间改大,再进入系统,在磁盘管理器上将需要扩容的磁盘进行扩展。扩展完后系统报文件系统有问题,扩容的磁盘容量…

LLaMA Factory 核心原理讲解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

如何让反向代购客户享受丝滑般的下单之旅?

想象一下,一键下单,轻松购物,仿佛穿越时空的魔法,让中国好货瞬间触手可及!从made in china的美妆神器到潮流服饰,从尖端数码产品到温馨家居用品,从令人垂涎的美食到贴心的母婴用品,这…

解决Selenium的3大痛点!这款工具让你的自动化测试效率翻倍!

相信使用过Selenium WebDriver的小伙伴对其最大的诟病有3点,一是浏览器的driver和版本对应问题,第二是Selenium的执行速度,最后一个槽点是对页面元素文本值的断言非常不便。 在我们长期维护大量UI自动化测试用例的过程中这些痛点会让我们耗费…

UI设计公司—兰亭妙微—提供优秀的医疗行业UI设计

医疗行业界面解决方案以医患使用者为中心,遵循行业使用习惯和表达方式,优化使用流程、设计简洁、人性化的操作界面,采用插画、三维动画、微动效的创作方法,让用户感受到愉悦易用美观的使用体验。蓝蓝设计与知名企业合作项目有&…

5G基础知识

什么是 FDD 频分双工(Frequency Division Duplexing),理解起来很简单,就是把上行和下行业务隔离在两个频段,互不干扰。 而 TDD 时分双工(Time-Division Duplexing),是指上行下业务完…

使用 Elastic Observability 监控 dbt 管道

作者:来自 Elastic Almudena Sanz Oliv•Tamara Dancheva 了解如何使用 Elastic 设置 dbt 监控系统,该系统可主动发出数据处理成本峰值、每张表的行数异常以及数据质量测试失败的警报。 在 Elastic 可观察性组织内的数据分析团队中,我们使用 …

网站攻击,XSS攻击的类型

XSS(跨站脚本)攻击是一种网络安全攻击方式,攻击者通过在网站页面中注入恶意脚本,使脚本在其他用户的浏览器中执行,从而窃取用户信息、篡改页面内容或操控用户账户。这类攻击通常利用网站对输入数据的过滤不严格&#x…

数据库 示例解析

描述: 找出顾客订单中所花运费比他所下订单平均运费的两倍都还贵的订单号,列出cOrderNo。运费属性名为mShippingCost,顾客号属性为cCustomerID。 代码示例: SELECT o.cOrderNo FROM orders o WHERE o.mShippingCost > (SELE…

2023年信息安全工程师摸底测试卷

目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务​编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …

大数据治理:确保数据价值与合规性的战略框架

大数据治理:确保数据价值与合规性的战略框架 引言 在信息技术迅猛发展的今天,数据已成为推动企业增长和创新的关键资源。根据统计,全球数据的生成量在每两年内翻一番,预计到2025年,全球数据总量将达到175ZB&#xff…

linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件, 我们可以为总线添加额外的信息和控制选项, 以便与设备和驱动进行交互。 简单就是,属性文件,可以完成用户空间和内核空间的数据交互, 比如在应用层快速修改g…

R向量运算数组矩阵

向量的运算 向量的加减乘除可以直接进运行,不用循环 向量之间的运算:分别对应计算,不用循环 两个运算的向量可以不是长度相等,但是一定长度要成整数倍。 每种运算都可以返回逻辑值T或F 取整函数 保留小数位用round: …

2024熵密杯初始题2

问题简要: 已知 counter 0x7501E6EA token 0xF4CE927C79B616E8E8F7223828794EEDF9B16591AE572172572D51E135E0D21A 伪造出另一个可以通过验证的counter和token。 给出token生成及验证代码如下: import binascii from gmssl import sm3# 读取HMAC ke…

Python入门之基础语法

第1关:行与缩进 任务描述 本关任务:改正代码中不正确的缩进,使其能够正常编译,并输出正确的结果。 相关知识 缩进 Python 与 C/C、Java 这些 C 类语言不同,Python 使用缩进来表示代码块,缩进的空格数量可…

WebSocket与Socket

一、定义与用途 Socket Socket(套接字)是一个抽象层,用于在网络上执行进程间的通信。它为应用程序提供了发送和接收数据的机制,通过IP和端口号来标识网络中唯一的位置。Socket可以使用TCP进行面向连接的可靠通信,也可以…