查找算法:二分查找、插值查找、斐波那契查找
二分查找
查找的前提是数组有序
思路分析
代码实现
# 二分查找(递归法实现)
# 找到一个相等的值就返回该值的下标
def binary_search(arr: list, find_val: int, left: int, right: int):mid = (left + right) // 2 # 寻找数组中间位置的下标if left > right: # 找不到元素,返回-1return -1if find_val == arr[mid]: # 找到了元素,返回元素在数组中的下标return midelif find_val < arr[mid]: # 要找的元素比数组中间元素小,则继续在 mid 的左边寻找return binary_search(arr, find_val, left, mid - 1)else: # 要找的元素比数组中间元素大,则继续在 mid 的右边寻找return binary_search(arr, find_val, mid + 1, right)arr = [4, 8, 9, 10, 12, 14, 15]
res = binary_search(arr, 0, 0, len(arr) - 1)
print(res)# 二分查找(递归法实现)
# 如果数组中有多个值和要查找的值相等,则把它们的下标都返回
def binary_search2(arr: list, find_val: int, left: int, right: int):mid = (left + right) // 2 # 寻找数组中间位置的下标if left > right: # 找不到元素,返回-1return []if find_val == arr[mid]: # 找到了元素,返回元素在数组中的下标# 找到了元素,先把当前的下标放入到一个列表中# 再依次从该位置开始向左和向右查找,还有没有其他相等的值index_pos = []index_pos.append(mid)temp = mid - 1while True: # 向左查找if temp < left or arr[temp] != find_val:breakindex_pos.append(temp)temp -= 1 # temp 左移temp = mid + 1while True: # 向右查找if temp > right or arr[temp] != find_val:breakindex_pos.append(temp)temp += 1 # temp 右移return index_poselif find_val < arr[mid]: # 要找的元素比数组中间元素小,则继续在 mid 的左边寻找return binary_search2(arr, find_val, left, mid - 1)else: # 要找的元素比数组中间元素大,则继续在 mid 的右边寻找return binary_search2(arr, find_val, mid + 1, right)arr = [4, 8, 9, 10,10, 12, 14, 15]
res = binary_search2(arr, 0, 0, len(arr) - 1)
print(res)
插值查找
查找的前提是数组有序
思路分析
当数组为[1, 2, 3, 4, 5, ..., 100] 时,加入此时要查找1,那么二分查找的方法会进行多次递归才能找到,效率较低,所以有了插值查找方法。插值查找适用于数据比较连续的情况下。
代码实现
# 插值查找
def insert_value_search(arr: list, find_val: int, left: int, right: int):# 找不到元素,返回-1# 条件 find_val < arr[left] or find_val > arr[right] 要有,否则mid可能会越界if left > right or find_val < arr[left] or find_val > arr[right]: return -1# 寻找数组中间位置的下标mid = left + (right - left) * (find_val - arr[left]) // (arr[right] - arr[left])mid_val = arr[mid]if find_val == mid_val: # 找到了元素,返回元素在数组中的下标return midelif find_val < mid_val: # 要找的元素比数组中间元素小,则继续在 mid 的左边寻找return binary_search(arr, find_val, left, mid - 1)else: # 要找的元素比数组中间元素大,则继续在 mid 的右边寻找return binary_search(arr, find_val, mid + 1, right)arr = []
for i in range(100):arr.append(i + 1)
res = insert_value_search(arr, 3, 0, len(arr) - 1)
print(res)
斐波那契查找
查找的前提是数组有序
思路分析
代码实现
import copy
# 斐波那契查找
# 因为算法中需要用到斐波那契数列,所以此处用非递归的方法构造一个斐波那契数列
def fib(size: int) -> list:f = []f.append(1)f.append(2)i = 2while i < size:f.insert(i, f[i - 1] + f[i - 2])i += 1return f# 非递归方式实现斐波那契查找算法
def fibonacci_search(arr, key):low = 0high = len(arr) - 1k = 0 # 表示斐波那契分割数值的下标mid = 0 # 存放 mid 值f = fib(20) # 获取斐波那契数列# 获取斐波那契分割数值的下标while high > f[k] - 1:k += 1# 因为f[k]的值可能大于arr的长度,因此需要对数组进行扩容(新构造一个数组)# 让数组的长度等于f[k],新增加的长度的下标用arr数组最后的数填充# 如:arr=[1,8,10,89,1000,1234] f[k] = 8# 扩容后:temp=[1,8,10,89,1000,1234,1234,1234]temp = copy.deepcopy(arr)i = high + 1while i < f[k]:temp.append(arr[high])i += 1# 使用 while 来循环处理,找到要查找的keywhile low <= high: # 只要条件满足就可以继续查找mid = low + f[k - 1] - 1if key < temp[mid]: # 应该继续向数组的前面查找(左边)high = mid - 1"""k -= 1 说明:数组全部元素 = 前面(左边)的元素 + 后面(右边)的元素斐波那契数列:f[k] = f[k - 1] + f[k - 2]因为前面有f[k - 1]个元素,所以可以继续拆分:f[k - 1] = f[k - 2] + f[k - 3]即在f[k - 1] 的前面继续查找,即下次循环 mid = f[k - 1 - 1] - 1 """k -= 1elif key > temp[mid]: # 应该继续向数组的后面查找(右边)low = mid + 1"""k -= 2 说明:数组全部元素 = 前面(左边)的元素 + 后面(右边)的元素斐波那契数列:f[k] = f[k - 1] + f[k - 2]因为后面有f[k - 2]个元素,所以可以继续拆分:f[k - 2] = f[k - 3] + f[k - 4]即在f[k - 2] 的前面继续查找 k-=2,即下次循环 mid = f[k - 1 - 2] - 1 """k -= 2else: # 找到# 确定返回的是哪个下标if mid <= high:return midreturn high# 找不到,返回-1return -1arr=[1,8,10,89,1000,1234]
res = fibonacci_search(arr, 8)
print(res)
相关文章:
查找算法:二分查找、插值查找、斐波那契查找
二分查找 查找的前提是数组有序 思路分析 代码实现 # 二分查找(递归法实现) # 找到一个相等的值就返回该值的下标 def binary_search(arr: list, find_val: int, left: int, right: int):mid (left right) // 2 # 寻找数组中间位置的下标if left &…...
python+django高校教室资源预约管理系统lqg8u
技术栈 后端:pythondjango 前端:vueCSSJavaScriptjQueryelementui 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyChar…...
Potato靶机
信息搜集 设备发现 扫描端口 综合扫描 开放了80端口的HTTP服务和7120端口的SSH服务 目录扫描 扫描目录 看看这个info.php,发现只有php的版本信息,没有可以利用的注入点 SSH突破 hydra 爆破 考虑到 7120 端口是 ssh 服务,尝试利用 hydra …...
【环境搭建】linux docker-compose安装gitlab和redis
gitlab需要redis,一起安装了 新建gitlab和redis挂载目录 mkdir -p /data/docker/redis/data mkdir -p /data/docker/redis/logs mkdir -p /data/docker/redis/confmkdir -p /data/docker/gitlab/data mkdir -p /data/docker/gitlab/logs mkdir -p /data/docker/gi…...
JAVAEE初阶相关内容第十三弹--文件操作 IO
写在前 终于完成了!!!!内容不多就是本人太拖拉! 这里主要介绍文件input,output操作。File类,流对象(分为字节流、字符流) 需要掌握每个流对象的使用方式:打…...
POI报表的高级应用
POI报表的高级应用 掌握基于模板打印的POI报表导出理解自定义工具类的执行流程 熟练使用SXSSFWorkbook完成百万数据报表打印理解基于事件驱动的POI报表导入 模板打印 概述 自定义生成Excel报表文件还是有很多不尽如意的地方,特别是针对复杂报表头,单…...
【计算机毕设选题推荐】超市管理系统SpringBoot+SSM+Vue
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的超市管理系统 技术栈 SpringBootVueMySQLMaven 文章目录 一、超市管理系统…...
【算法1-4】递推与递归-P1002 [NOIP2002 普及组] 过河卒
## 题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#…...
浅谈压力测试的作用是什么
随着现代应用程序变得越来越复杂,用户的期望也在不断提高,对性能和可靠性的要求变得更加苛刻。在应用程序开发和维护的过程中,压力测试是一项至关重要的活动,它可以帮助发现潜在的问题、评估系统的性能极限,以及确保在…...
互联网Java工程师面试题·Java 总结篇·第一弹
目录 1、面向对象的特征有哪些方面? 2、访问修饰符 public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f3.4;是否正确? 5、short s1 1; s1 s1 1;有错吗…...
Anylogic 读取和写入Excel文件
1、选择面板-连接-Excel文件,拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后,在你需要读取的地方进行写代码, //定义开始读取的行数 //这里设为2,是因为第一行是数据名称 int row12; //读取excel文件信…...
茶百道全链路可观测实战
作者:山猎 茶百道是四川成都的本土茶饮连锁品牌,创立于 2008 年 。经过 15 年的发展,茶百道已成为餐饮标杆品牌,全国门店超 7000 家,遍布全国 31 个省市,实现中国大陆所有省份及各线级城市的全覆盖。2021 …...
Java-JDBC
JDBC JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API 根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底…...
【ROS】Nav2源码之nav2_planner详解
【ROS】郭老二博文之:ROS目录 1、简述 nav2_planner是路径规划器,把起始位置、姿势的信息输入nav2_planner模块,将会生成可行路径。 nav2_planner路径规划器和nav2_controller控制器相似,也使用插件的形式加载不同的路径规划器。 常用的路径规划器插件有: 1)NavFn Plan…...
mysql报SQLSTATE[22007]的错误的一个原因
最近在修改一个程序,打算将$video这个参数保存到数据库。修改的过程中出现错误。导致该程序不能发布新文章。在程序的一个db.php程序文件里使用var_dump($input, $stmt) ; 语句看到了错误信息,并找到了错误原因。信息里包含的错误代码是: SQ…...
Python —— UI自动化之 三大等待与三大切换
1、三大等待 1、硬性等待 1、概述 硬性等待也可以称之为强制等待,写法如下: time.sleep() 优点:使用简单 缺点:等待时间把握不准,容易造成时间浪费或者等待时间不足 2、实战 from time import sleep from sele…...
初识容器Docker
目前使用 Docker 基本上有两个选择:Docker Desktop和Docker Engine。Docker Desktop 是专门针对个人使用而设计的,支持 Mac 和 Windows 快速安装,具有直观的图形界面,还集成了许多周边工具,方便易用。 不是太推荐使用D…...
pikachu靶场搭建及通关
一、靶场搭建 下载工具:phpstudy Pikachu靶机下载地址: https://github.com/zhuifengshaonianhanlu/pikachu 下载后解压缩并放入如下文件夹(网站根目录) 建议修改文件名称为 pikachu 修改配置文件(mysql 用户名&…...
选择排序(学习笔记)
选择排序 选择排序的基本思想是冒泡排序,记录当前位置i和最小值k的位置,使用一个变量j往后寻找。 每一轮找到最小值后与第一个元素进行交换,以此类推。 不使用辅助变量交换两个元素的值方法 package com.company.sort;import java.util.Ra…...
PCL 生成球形点云
目录 一、算法原理二、代码实现三、结果展示四、参考链接一、算法原理 生成球体点云的方法有很多种,Marsaglia于1972年提出了一个简单易行的实现方法,它从(-1,1)上的独立均匀分布中选取 x 1 x_1 x...
Flutter 剪裁(Clip)
🔥 ClipOval 🔥 子组件为正方形时剪裁成内贴圆形;为矩形时,剪裁成内贴椭圆 裁剪纯色背景 ClipOval(child: Container(width: 300.w,height: 300.w,decoration: const BoxDecoration(color: Colors.red),),), 裁剪背景图片 裁剪前…...
嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记
目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”:语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明:section 七、属性声明:aligned 一、C语言标准和编译器 C语言标准的发展过程: ●…...
密码学二: md5 网站服务器与用户通信过程 ca原理 签名原理 Flame 病毒原理
md5被破解? MD5(Message Digest Algorithm 5)是一个较早的哈希函数,但由于其弱点和漏洞,它已经被认为不再适合用于安全性要求较高的应用。MD5的一些安全性问题包括: 碰撞攻击: MD5已经被证明容易受到碰撞攻…...
Zend Framework 3.1.3 gadget chain
前言 在推特上的PT SWARM账号发布了一条消息。 一个名为Zend Framework的php框架出现了新的gadget chain,可导致RCE。笔者尝试复现,但失败了。所幸,我基于此链,发现在这个框架的最新版本中的另一条链。 复现过程 这里使用vscod…...
互联网Java工程师面试题·Java 并发编程篇·第四弹
目录 39、volatile 有什么用?能否用一句话说明下 volatile 的应用场景? 40、为什么代码会重排序? 41、在 java 中 wait 和 sleep 方法的不同? 42、用 Java 实现阻塞队列 43、一个线程运行时发生异常会怎样? 44、…...
3、Linux下安装
以下操作仅限于rh系列:支持rpm/yum安装方式,不支持deb/apt安装方式。 以下操作仅限于rh系列:支持rpm/yum安装方式,不支持 deb/apt安装方式。 1、在线下载安装包: wget https://downloads.mysql.com/archives/get/p/23/file/ m…...
Zookeeper【Curator客户端Java版】从0到1——万字学习笔记
目录 初识Zookeeper Zookeeper作用 维护配置信息 分布式锁服务 集群管理 生产分布式唯一ID Zookeeper的设计目标 Zookeeper 工作机制 数据模型 ZooKeeper 命令操作 服务端常用命令 客户端常用命令 ZooKeeper JavaAPI操作 Curator 介绍 Curator API 常用操作 导入依赖 建立连接 …...
生物标志物发现中的无偏数据分析策略
目录 0. 导论基本概念 1. 生物标志物发现的注意事项2. 数据预处理2.1 高质量原始数据和缺失值处理2.2 数据过滤2.3 数据归一化 3. 数据质量评估3.1 混杂因素3.2 类别分离3.3 功效分析3.4 批次效应 4. 生物标志物发现4.1 策略4.2 数据分析工具4.3 模型优化策略 0. 导论 组学技术…...
华为校招机试题- 机器人活动区域-2023年
题目描述: 现有一个机器人,可放置于 M N的网格中任意位置,每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可在网格间移动 问题:求机器人可活动的最大范围对应的网格点数目。 说明: 1)网格左上角坐标为 (0, 0),右下角坐标为 (m-…...
半屏小程序
准备工作 tip 管理后台配置 设置-》第三方设置-》半屏小程序管理-》我调用的 添加小程序 有些手机会唤起失败,直接唤起了全屏的小程序,所以我们为了兼容,需要在app.config.ts加上 {"embeddedAppIdList": ["wxxxxxxxx"]/…...
餐饮公司 网站建设/上海seo网站推广
指针数组做main()函数的形参 以前的程序中,main函数的第一行一般写成 下面的形式: void main(void) 实际上,main()函数可以有参数,例如: void main(int argc, char *argv[]) argc是命令行总的参数个数; arg…...
网站免费建站http/网络热词2021流行语
对于切词确实是一个复杂的功能,足以写上好几篇论文,但是如果仅仅想对一个句子、一个段落、一篇文章进行切词,可以利用中国自然语言开源组织中各位大牛写好的工具。已经打包成jar包,可以直接调用了,无须自己再考虑复杂的…...
合肥网站制作公司排名/汕头seo外包机构
目录: 1、需求 2、代码步鄹 3、代码展现 4、pom.xml文件 5、结果展现 ——————————————————————————————————– 1、需求 前提:将org.apache.spark.streaming.kafka.KafkaCluster这个类抽出来变成KafkaClusterHelper * 需…...
.net网站开发实例/企业管理培训班
本文翻译自:Whats the difference between map() and flatMap() methods in Java 8? 在Java 8中, Stream.map()和Stream.flatMap()方法之间有什么区别? #1楼 参考:https://stackoom.com/question/1nxsA/Java-中的map-和flatMap-方…...
南阳阿里巴巴网站推广/可以打广告的平台
1. 从json数组 返回一个数组。 let _Row responseObject.map((key)>{ return (key.id); }),//返回数组。[29, 28, 26, 2, 3] 2. 返回一个新 json数组 let _Row2 responseObject.map((key)>{ return ({id: key.id, name: key.value}); })...
罗湖中心区做网站/网站建设报价单模板
下面是自己封装的,存在一定问题,node接触不久,promise的用法尚未理解,我想实现的是执行多条sql后,如果sql均正常执行,则返回一个定义的对象,如果某一sql出问题,直接rollback…...