Python-VBA编程500例-028(入门级)

经典二分查找算法(Classic Binary Search Algorithm)(也称为折半查找算法),是一种在有序数组中查找某一特定元素的搜索算法。它要求序列必须有序,然后通过每次比较数组中间元素与目标值,将搜索范围缩小一半,直到找到目标元素或搜索范围为空。二分查找的时间复杂度是O(logn),这意味着即使在非常大的数据集中,查找效率也非常高。

1、字典查找:在计算机科学中,二分查找常用于字典查找。例如,如果你有一个按字母顺序排列的单词列表,并且你想找到一个特定的单词,你可以使用二分查找来快速找到它。

2、电话簿查找:如果你想在一个按姓氏排序的电话簿中找到一个特定的人,你也可以使用二分查找。

3、文件查找:在文件系统中,二分查找可以用于查找具有特定名称或属性的文件。

4、数据库查询优化:在数据库中,二分查找可以用于优化查询操作。例如,如果你想在一个大型数据库中找到一个特定的记录,你可以使用二分查找来快速找到它。

5、排序和搜索问题:在排序和搜索问题中,二分查找被广泛使用。例如,在归并排序算法中,二分查找用于将数组分成两半。

6、近似匹配:在某些情况下,可能需要找到一个近似匹配而不是精确匹配。在这种情况下,可以使用变体的二分查找,例如,斐波那契查找。

7、机器学习:在机器学习中,二分查找可以用于优化算法,例如,在线学习算法。

8、编译器和解释器:在编译器和解释器中,二分查找可以用于符号表查找和词法分析。

9、数值计算:在数值计算中,二分查找可以用于求解方程和优化算法。

1、经典二分查找:
1-1、Python:
# 1.问题描述:
# 在一个排序整型数组中找目标整数,若存在,则返回目标整数在排序整型数组中的位置;反之,则返回-1.
# 2.问题示例:
# 输入排序整型数组int_arr = [3, 5, 6, 8, 10, 10, 11, 24]和目标整数target_int = 10,输出5;
# 输入排序整型数组int_arr = [3, 5, 6, 8, 10, 10, 11, 24]和目标整数target_int = 18,输出-1.
# 3.代码实现:
class Solution:
    # 定义一个名为find_position的方法,该方法接受一个整型数组int_arr和一个整型目标值target_int作为参数
    def find_position(self, int_arr, target_int):
        # 如果整型数组int_arr的长度为0,即数组为空,直接返回-1表示目标值不存在于数组中
        if len(int_arr) == 0:
            return -1
        # 初始化搜索的起始位置为数组的第一个元素索引0
        start = 0
        # 初始化搜索的结束位置为数组的最后一个元素索引,即数组长度减1
        end = len(int_arr) - 1
        # 当起始位置小于等于结束位置时,说明搜索区间内还有元素,继续搜索
        # 注意,此处兼容了排序整型数组中只有一个元素的情况
        while start <= end:
            # 计算数组中间位置的索引
            mid = start + (end - start) // 2
            # 如果中间位置上的元素等于目标值,返回该中间位置索引
            if int_arr[mid] == target_int:
                return mid
            # 如果中间位置上的元素小于目标值,说明目标值在右侧,更新起始位置为中间位置的下一个索引
            elif int_arr[mid] < target_int:
                start = mid + 1
            # 如果中间位置上的元素大于目标值,说明目标值在左侧,更新结束位置为中间位置的前一个索引
            else:
                end = mid - 1
        # 如果循环结束仍未找到目标值,返回-1表示目标值不存在于数组中
        return -1
# 主函数
if __name__ == '__main__':
    # 初始化一个排序整型数组
    int_arr = [3, 5, 6, 8, 10, 10, 11, 24]
    # 设置要查找的目标值
    target_int = 10
    # 创建Solution类的实例
    solution = Solution()
    # 打印输入的数组
    print("输入:", int_arr)
    # 调用find_position方法查找目标值在数组中的位置,并打印结果
    print("输出:", solution.find_position(int_arr, target_int))
# 4.运行结果:
# 输入: [3, 5, 6, 8, 10, 10, 11, 24]
# 输出: 5
1-2、VBA:
Rem 自定义函数,功能:经典二分查找
Function FindPosition(int_arr As Variant, target_int As Integer) As Integer
    ' 定义变量
    Dim start As Integer
    Dim end_pos As Integer
    Dim mid As Integer
    Dim arrLength As Integer
      
    ' 检查数组是否为空
    If IsEmpty(int_arr) Then
        FindPosition = -1
        Exit Function
    End If
    ' 获取数组长度
    arrLength = UBound(int_arr) - LBound(int_arr) + 1
    ' 初始化搜索的起始和结束位置
    start = LBound(int_arr)
    end_pos = UBound(int_arr)
    ' 当起始位置小于等于结束位置时,继续搜索
    While start <= end_pos
        ' 计算中间位置
        mid = start + (end_pos - start) \ 2
        ' 如果找到目标值,返回其位置
        If int_arr(mid) = target_int Then
            FindPosition = mid
            Exit Function
        ' 如果中间值小于目标值,搜索右侧
        ElseIf int_arr(mid) < target_int Then
            start = mid + 1
        ' 如果中间值大于目标值,搜索左侧
        Else
            end_pos = mid - 1
        End If
    Wend
    ' 如果循环结束仍未找到目标值,返回-1
    FindPosition = -1
End Function
Rem 执行过程,功能:通过调用自定义函数FindPosition,实现经典二分查找,在立即窗口中输出结果
Sub TestRun()
    ' 定义变量
    Dim int_arr As Variant
    Dim target_int As Integer
    Dim position As Integer
      
    ' 初始化一个排序整型数组
    int_arr = Array(3, 5, 6, 8, 10, 10, 11, 24)
    ' 设置要查找的目标值
    target_int = 10
    ' 调用FindPosition函数查找目标值在数组中的位置
    position = FindPosition(int_arr, target_int)
    ' 打印结果
    Debug.Print "输入: [" & Join(int_arr, ", ") & "]"
    Debug.Print "输出: " & position
End Sub
'结果输出:
'输入: [3, 5, 6, 8, 10, 10, 11, 24]
'输出: 5

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,在立即窗口中输出结果。

2、相关文章:

2-1、Python-VBA编程500例-026(入门级) 

2-2、Python-VBA编程500例-027(入门级) 

Myelsa的Python算法之旅(高铁直达):Myelsa的Python算法之旅(高铁直达)-CSDN博客
欢迎访问个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传输大咖20|提升效率:优化文件服务器删除大文件夹过程的策略

引文&#xff5c; 文件服务器在删除大文件夹时&#xff0c;往往会比较耗时。如果在原有线程中同步等待删除结果&#xff0c;那么会阻塞原有线程的运行&#xff1b;如果在其它线程中异步删除文件夹&#xff0c;则虽不阻塞原有线程的运行&#xff0c;但对于那些关注删除结果的用户…

每日面经分享(pytest装饰器)

pytest装饰器 a. pytest.mark.parametrize&#xff1a;这个装饰器用于标记测试函数&#xff0c;并为其提供多组参数进行参数化测试。可以使用元组、列表、字典等形式来指定参数组合。 import pytestpytest.mark.parametrize("num1, num2, expected", [(2, 2, 4), (5…

力扣热门算法题 217. 存在重复元素,223. 矩形面积,225. 用队列实现栈

217. 存在重复元素&#xff0c;223. 矩形面积&#xff0c;225. 用队列实现栈&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.04.01 可通过leetcode所有测试用例。 目录 217. 存在重复元素 解题思路 完整代码 Java Python 223…

Discuz采集发布插件

Discuz&#xff08;简称DZ&#xff09;是一款知名的开源论坛系统&#xff0c;广泛应用于各类网站社区。对于许多站长来说&#xff0c;保持论坛内容的更新是一项挑战&#xff0c;特别是在内容量庞大的情况下。为了解决这个问题&#xff0c;有一类特殊的插件是用于在Discuz论坛中…

惟客数据《2024泛零售行业大会员经营实践与案例》正式发布

对于多业态、多品牌、多渠道经营的泛零售企业而言&#xff0c;如何改变过去会员经营过程中“各自为政”的状态&#xff1f; 如何让企业内不同业务之间的会员经营“瞄得准、看得穿、打得透、流得通、触得动”&#xff0c;充分发挥多业态、多品牌、多渠道优势&#xff0c;最大化挖…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了&#xff0c;为么子哇 如下图

简单说清楚什么是SQL Injection?

最近看完了《The Pragmatic Programmer: 20th Anniversary Edition, 2nd Edition: Your Journey to Mastery》&#xff0c;在第7章&#xff1a;While You Are Coding的footnotes中&#xff0c;提到了一幅漫画&#xff1a; 这不仅用简单的方式说清楚了什么是SQL Injection&#…

【御控物联】JSON结构数据转换在物联业务中应用(场景案例二)

文章目录 一、物联网业务场景现状二、物联网业务场景数据交互格式三、JSON格式数据转换案例四、JSON数据格式转换DEMO 一、物联网业务场景现状 目前&#xff0c;市场上多数物联网关与物联平台捆绑售卖&#xff0c;网关采集到设备数据只能按照指定的协议和规定的数据格式传输到…

蚂蚁测试可控制天气的“龙王”系统

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 所有伟大的发明&#xff0c;都来自最初不切实际的幻想。 4月1日&#xff0c;不少互联网大厂都发布一些新产品&#xff0c;例如&#xff1a;淘宝测试用火箭送快递&#xff0c;蚂蚁集团推出可以控制天气的技术系统畅…

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

MySQL 进阶-----索引使用规则

目录 前言 一、验证索引效率 二、最左前缀法则 三、范围查询 四、索引失效情况 1.索引列运算 2.字符串不加引号 3 .模糊查询 4.or连接条件 5 .数据分布影响 前言 本期我们学习MySQL索引的使用方法&#xff0c;在讲解索引的使用原则之前&#xff0c;先通过一个简单的…

【漏洞复现】通天星CMSV6弱口令漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

探索 Redis 数据库:一款高性能的内存键值存储系统

目录 引言 一、非关系型数据库 &#xff08;一&#xff09;什么是非关系型数据库 &#xff08;二&#xff09;非关系型数据库的主要特征 &#xff08;三&#xff09;关系数据库与非关系型数据库的区别 二、Redis 简介 &#xff08;一&#xff09;基本信息 &#xff08;…

哪一款个微管理助手比较好用?

私域流量兴起&#xff0c;社群运营成为热门&#xff0c;越来越多的行业进入社群的圈子。但是社群管理是个超麻烦、巨琐碎的活儿&#xff0c;方法不对&#xff0c;很容易无限陷入死循环。 此时&#xff0c;一个合适的管理工具可以帮我们高效管理&#xff0c;达到事半功倍的效果…

构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理

方案概述 现在绝大多数客户都有很多非结构化的数据存在 OSS 中&#xff0c;以图片&#xff0c;视频&#xff0c;音频居多。举一个图片处理的场景&#xff0c;现在各种终端种类繁多&#xff0c;不同的终端对图片的格式、分辨率要求也不同&#xff0c;所以一张图片往往会有很多张…

泰迪智能科技高职人工智能专业人才培养方案

人工智能专业坚持以立德树人为根本&#xff0c;立足社会经济发展&#xff0c;面向信息技术行业&#xff0c;培养德智体美劳全面发展的人工智能领域的高素质工程型专门人才。毕业生具备扎实的数学、自然科学、工程技术、人文社科的基本理论, 系统深入的人工智能专业知识和实践能…

云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权

方案概述 MSE 网关可以为后端服务提供转发路由能力&#xff0c;在此基础上&#xff0c;一些敏感的后端服务需要特定认证授权的用户才能够访问。MSE 云原生网关致力于提供给云上用户体系化的安全解决方案&#xff0c;其中 JWT 认证能力是在 Json Web Token 这种结构化令牌的基础…

递归究竟是什么?如何快速编写正确的递归代码? —— 力扣经典面试题详解

递归究竟是什么&#xff1f;如何快速编写正确的递归代码&#xff1f; —— 力扣经典面试题详解 一、递归1.1 什么是递归&#xff1f;1.2 为什么会用到递归&#xff1f;1.3 如何快速编写正确的递归代码&#xff1f; 二、力扣相关笔试题解析[面试题 08.06. 汉诺塔问题](https://l…

【C++】list介绍

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插…