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

查找算法简记

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

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


二、二分查找


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) 继续查找,该位置的键和被查找的键不同。
我们用散列函数找到键在数组中的索引,检查其中的键和被查找的键是否相同。
如果不同则继续查找(将索引增大,到达数组结尾时折回数组的开头),直到找到该键或者遇到一个空元素。

相关文章:

查找算法简记

一、简单查找(顺序查找) 最基本的查找,相当于遍历,从头到尾一个一个找。 二、二分查找 1、简述 二分查找的输入是一个有序的元素列表。 如果要查找的元素包含在列表中,二分查找返回其位置; 否则返回null。…...

算法竞赛(Python)-状态间的奇妙转移(动态规划)

文章目录 一、初探动态规划1 拼图游戏(从搜索到动态规划)2 物流仓库——状态的转移 二、状态的巧妙定义1 不同的状态和转移2 流浪猫的家——状态压缩与状态剪枝 三 转移方式的神奇优化1 运输计划——在转移中剪枝2 会议安排——在决策中剪枝 三、经典的动…...

String.format() 用法详解

**String.format()详解示例:**import java.util.Date; /** String.format() 格式化 / public class format { /* 字符串占位符类型%s 字符串类型%c 字符类型%b 布尔类型%d 整数类型(十进制)%x 整数类型(十六进制)%o …...

es 常用命令(已亲测)

说明: elastic:1235 账号:密码 _isShare : 字段 1、 根据一个参数查询es curl -XGET -u elastic:1235 http://10.223.73.3:9200/catalog/_search \ -H Content-Type: application/json \ -d {"query":{"match":{"_isShar…...

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的,…...

HCIP-HarmonyOS Application Developer V1.0 笔记(二)

类Web开发范式自定义组件基本用法 自定义组件通过element引入到宿主页面。 Props自定义属性 自定义属性支持类型 String,Number,Boolean,Array,Object。 命名规范: 命名时禁止以on、、on:、grab:等保留关键字为开头…...

初体验鸿蒙 HarmonyOS NEXT开发

上个星期三就下载了鸿蒙 HarmonyOS NEXT,安装好了后测试了一下,感觉界面和功能设计与IntelliJ IDEA很像,对初学者非常友好,所见即所得。不知道什么原因,写了代码后测试起来很慢,简单测试后就没有再动。 今天…...

MySQL---主从复制和读写分离

文章目录 MySQL---主从复制和读写分离主从复制mysql主从复制的作用mysql主从复制的分类mysql主从复制原理mysql主从复制的配置步骤mysql主从复制的同步模式在什么情况下半同步复制会将为异步复制?mysql主从复制不一致问题如何解决?mysql主从复制延迟问题…...

Apache Kyuubi概述——网易数帆(网易杭州研究院)开源

Apache Kyuubi概述 一、Apache Kyuubi 历史 Kyuubi是网易数帆(网易杭州研究院)旗下易数大数据团队开源的一个企业级数据湖探索平台,建立在Apache Spark之上。(Kyuubi依赖Apache Spark提供高性能的数据查询能力,扩展了…...

前端代码注释

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言类注释属性注释函数注释函数参数注释解构 & 函数返回结果 注释Vue Props 注释注释建议注释内容要清晰简洁注释类型避免不必要的注释采用一致的风格版本与更…...

Linux线程安全(二)条件变量实现线程同步

目录 条件变量 条件变量初始化和唤醒 键盘触发条件变量唤醒线程demo 条件变量的等待 条件变量定时等待demo 条线变量实现多线程间的同步 条件变量 条件变量是为了控制多个线程的同步工作而设计的 比如说一个系统中有多个线程的存在但有且仅有一个线程在工作&#xff0c…...

Linux初阶——线程(Part2):互斥同步问题

一、互斥锁 1、CPU 运算过程 执行完整个语句后,才会把数据写入内存;如果执行时被中断,那么数据和上下文就会保存到线程的 TCB,但数据并不会被写入内存。 1.1. 当 CPU 执行完整个语句时 CPU 最终执行完整个语句的过程 就用上图举…...

力扣——二叉树的后序遍历(C语言)

1.题目: 给你一棵二叉树的根节点 root ,返回其节点值的后序遍历。 2.原理: 这里的遍历,是要存入到数组中,所以需要建立数组,这里传参有*returnSize,需要求节点个数,可以调用前面Tr…...

利用kimi编程助手从0到1开始搭建小程序!

电脑崩了,更新5次小程序,什么都不剩!(但是遗留下来了一些东西,开源的思维和不断地对于技术的使用和掌握“一个软件更多的哲学:(01)优秀的ui页面设计(02)更加细…...

WSL(Ubuntu20.04)编译和安装DPDK

编译和安装DPDK DPDK可以使用工具meson和ninja在您的系统上进行配置、构建和安装。 DPDK配置 要配置DPDK构建,请使用: meson setup build --prefix/home/xx/dpdk19.11xxxx:~/dpdk-stable-19.11.14/$ meson setup build Message:Content Skipped libs…...

HLS协议之nginx-hls-多码率测试环境搭建

运行环境:ubuntu 20.04 时间:2024年10月26日 环境更新 sudo apt-get update sudo apt-get install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl下载nginx wget http://nginx.org/download/nginx-1.19.2.tar.gz tar xvzf n…...

函数式接口与回调函数实践

函数式接口与回调函数实践 一、Java 的函数式接口 是指仅包含一个抽象方法的接口,通常用于 lambda 表达式或方法引用。Java 8 引入了很多内置的函数式接口,比如 Runnable、Callable、Predicate、Function、Consumer 等 演示,数据类型转换的函…...

Windows11系统如何使用自带的录音、录屏工具?

电脑录音和录屏作为现代办公的辅助工具,不仅极大地提升了工作效率,也保障了信息传递的准确性和完整性。通过合理利用这些工具,我们可以更好地保存和管理重要资料,为办公带来无与伦比的便利。 在会议记录、讲座学习、语音备忘等场景…...

使用 web (vue 和DRF))实现 模拟一个IDE 功能思路

采用文件系统和数据库相结合的方案,不仅可以实现基本的文件管理,还可以为未来的扩展提供灵活性。结合我们讨论的内容,以下是更完善的策略: 方案概述:文件系统与数据库结合 文件系统负责实际的文件存储和执行操作&…...

智航船舶租赁综合管理系统

1.产品介绍 产品介绍方案 产品名称: 智航船舶租赁综合管理系统 主要功能: 船舶信息管理租赁合同管理运营调度与优化财务分析与报告功能介绍: 1. 船舶信息管理 具体作用与使用方式:该功能模块允许用户录入、编辑和查询所有船舶的详细信息,包括但...

我跟踪了100位测试工程师的5年成长轨迹,发现成功者都踩准了这三个节点

五年,对于软件测试工程师而言,是一道清晰的分水岭。有人依然困在重复的手工用例里,薪资徘徊在行业均线以下;有人却完成了从执行者到架构者、从成本中心到价值中心的跃迁,成为团队里不可替代的角色。过去五年&#xff0…...

Elasticsearch管理利器:es-client全方位指南与实战技巧

Elasticsearch管理利器:es-client全方位指南与实战技巧 【免费下载链接】es-client elasticsearch客户端,issue请前往码云:https://gitee.com/qiaoshengda/es-client 项目地址: https://gitcode.com/gh_mirrors/es/es-client 你是否曾…...

第八部分-企业级实践——36. CI/CD 集成

36. CI/CD 集成 1. CI/CD 概述 CI/CD(持续集成/持续部署)与 Docker 结合,可以实现代码提交后自动构建镜像、测试、部署的完整流程,大幅提升开发效率和发布质量。 ┌──────────────────────────────…...

加拿大无人机产业:从感知到执行的自主化跃迁与BVLOS破局

1. 加拿大无人机产业的现状与挑战提起无人机,很多人脑海里首先蹦出来的可能是大疆,那个在全球消费级和部分商用市场占据绝对主导地位的中国品牌。这确实是一个不争的事实,也是加拿大本土无人机产业必须直面的现实。我接触过不少加拿大的初创公…...

Fujirebio宣布全自动Lumipulse® G pTau 217血浆检测试剂盒获得CE认证

H.U. Group Holdings Inc.及其全资子公司Fujirebio今日宣布,Fujirebio Europe N.V.已依据《欧盟(EU) 2017/746体外诊断医疗器械法规》(IVDR)取得Lumipulse G pTau 217血浆检测试剂盒的CE认证。该化学发光酶免疫分析(CLEIA)检测可对人体血浆(K2 EDTA)中的苏氨酸217磷…...

机器视觉在人工智能领域的应用

机器视觉在人工智能领域的应用 目录机器视觉在人工智能领域的应用一、图像处理与机器视觉的概念阐述1. 图像处理(Image Processing)2. 机器视觉(Machine Vision / Computer Vision)二、图像处理与机器视觉的区别与共同点区别共同点…...

终极网盘直链下载助手完整指南:快速免费获取8大网盘真实下载地址

终极网盘直链下载助手完整指南:快速免费获取8大网盘真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

learn claude code S11 自主 Agent 详解笔记

S11 自主 Agent 详解笔记基于 s11_autonomous_agents.py 源码逐行分析,配合 s11-autonomous-agents.md 设计思路。一、问题:队友需要有人持续指派任务 s09-s10 的 teammate 有一个尴尬的空白期:完成当前任务后进入 idle,然后呢&am…...

别让直觉带路:Infoseek视角下的噪音过滤与火情预警实战

在舆情的世界里,最可怕的不是对手太强大,而是自己吓自己。很多时候,企业之所以“翻车”,并非因为危机本身不可控,而是因为公关团队在面对网友吐槽时过度敏感,发布了不必要的声明或做出了过激反应&#xff0…...

人工智能的“意识”争论:它真的能理解吗,还是只是在模仿?—— 一个软件测试从业者的专业解构

2026年的今天,当你在测试环境中输入一条模糊的需求描述,大模型瞬间生成了逻辑严密、边界清晰的测试用例时,你是否曾在某一瞬间恍惚:它真的“懂”我在测什么吗?还是仅仅在进行一场华丽的概率模仿?关于人工智…...