查找的介绍

news2024/11/15 18:50:57

目录

一、基本介绍

1、查找方法有:

2、在Python中,我们应当掌握两种常见的查找方法:

二、顺序查找

1、顺序查找案例

2、扩展:

三、二分查找

1、二分查找案例

2、二分查找的思路分析

3、代码实现


一、基本介绍

1、查找方法有:

顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找

2、在Python中,我们应当掌握两种常见的查找方法:

顺序查找、二分查找

二、顺序查找

1、顺序查找案例

有一个列表:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,猜名字游戏:从键盘中任意输入一个名称,判断列表中是否包含此名称[顺序查找] 要求:如果找到了,就提示找到,并给出下标值

# 如果只是完成查找功能,可以直接使用 list的方法 index
names_list = ["白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"]
find_name="金毛狮王"

# 使用 list.index 完成查找
res_index=names_list.index(find_name)
print(f"res_index:{res_index}")  # 1
# 顺序查找
# 定义列表
names_list = ["白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王"]
find_name="金毛狮王"

# 编写顺序查找函数
def seq_search(my_list,find_val):
    """
    功能:顺序查找指定的元素
    :param my_list: 传入的列表(即要查找的列表)
    :param find_val: 要查找的值/元素
    :return: 如果查找到则返回对应的索引下标,否则返回-1
    """
    """
        思路分析
        1、对列表进行遍历,如果找到返回对应的下标
        2、如果遍历结束,没有找到,则返回-1
    """
    find_index=-1
    # 遍历
    for i in range(len(my_list)):
        # 开始比较,如果当前的元素就是要查找的元素,则返回索引
        if my_list[i]==find_val:
            print(f"恭喜,找到对应的值{find_val} 下标是{i}")
            find_index=i
            break  # 退出for
    else:
        print(f"没有找到对应的值 {find_val}")
    return find_index

# 测试
res_index=seq_search(names_list, find_name)
print("res_index:", res_index)

2、扩展:

如果一个列表中有多个要查找的元素/值,比如前面的列表有两个金毛狮王,请思考,怎样才能把满足查询条件的元素下标,都返回

# 顺序查找扩展
# 定义列表
names_list = ["白眉鹰王", "金毛狮王", "紫衫龙王", "青翼蝠王", "金毛狮王"]
find_name="金毛狮王"

# 编写顺序查找函数
def seq_search(my_list, find_val):
    """
        思路分析:
        1、顺序查找列表,把满足查询条件的元素下标都返回
        2、定义一个空列表,保存查找到的索引下标,发现一个就动态的添加到列表
        3、最后返回列表
    """
    # 定义一个空列表
    find_index=[]
    # 遍历
    for i in range(len(my_list)):
        # 开始比较,如果当前的元素就是要查找的元素,就保存到 find_index
        if my_list[i]==find_val:
            # 将找到的下标,添加到 find_index
            find_index.append(i)
    # 返回列表
    return find_index

# 测试
res_index=seq_search(names_list, find_name)
print("res_index:", res_index)  # [1, 4]

三、二分查找

1、二分查找案例

请对一个列表(元素是从小到大的顺序的)进行二分查找[1,8,10,89,1000,1234],输入一个数,看看该列表中是否存在此数,并且求出下标,如果没有就返回-1

2、二分查找的思路分析

前提:该列表是一个排好序的列表(以从小到大为例)

1)找到列表的中间数 mid_val 和 find_val 比较

2)如果 find_val<mid_val,则到 mid_val 的左边查找

3)如果 find_val>mid_val,则到 mid_val 的右边查找

4)如果 find_val==mid_val,则找到,返回对应的下标即可

5)不断地重复 1-4 步骤,这里就是不断减半,使用while

6)如果while结束,都没有找到,说明find_val 没有在列表中

3、代码实现

# 要查找的列表
num_list = [1, 8, 10, 89, 1000, 1234]

# 编写二分查找函数
def binary_search(my_list,find_val):
    """
    功能:完成二分查找
    :param my_list:要查找的列表(该列表是有序的)
    :param find_val: 要查找的元素/值
    :return: 如果找到返回对应的下标,如果找不到返回-1
    """
    # left_index:表示左边的索引
    # right_index:表示右边的索引
    left_index = 0
    right_index = len(my_list)-1
    # 定义找到数的下标
    find_index=-1
    # 使用while循环,不断的折半比较,比较的前提是 left_index<=right_index
    while left_index<=right_index:
        # 中间数的下标/索引
        mid_index=(left_index+right_index)//2
        # 如果 find_val<mid_val,则到 mid_val 的左边查找
        if find_val<my_list[mid_index]:
            right_index=mid_index-1
        # 如果 find_val>mid_val,则到 mid_val 的右边查找
        elif find_val>my_list[mid_index]:
            left_index=mid_index+1
        else:  #相等
            find_index=mid_index
            break

    return find_index

# 测试
res_index=binary_search(num_list, 1)
if res_index==-1:
    print("没有找到该数")
else:
    print(f"找到数,对应的下标 {res_index}")

4、 二分查找的注意事项和细节

1)二分查找的前提是该列表已经是一个排好序的列表(从小到大或从大到小)

2)排序的顺序是从小到大还是从大到小,会影响二分查找的代码逻辑

  • num_list=[1234,1000,89,10,8,1]  (从大到小)
  • 思路与从小到大相似,但查找方向会发生改变

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

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

相关文章

Pytorch框架之神经网络

一、全连接神经网络的整体结构 二、全连接神经网络的单元结构 找出一组w,b使得结果最优 三、常见激活函数 四、前向传播 学习率是指训练模型时每次迭代更新模型参数的步长。 五、梯度下降法 六、反向传播计算 七、总结 1、准备数据 2、搭建模型 3、开始训练(设置学习率、…

springboot高校计算机专业学习资料共享平台-计算机毕业设计源码24752

摘 要 在信息化、数字化的时代背景下&#xff0c;教育资源的共享与高效利用已成为推动教育现代化的关键。高校作为培养未来人才的重要基地&#xff0c;其计算机专业的学习资料共享显得尤为重要。这些资料不仅涵盖了基础理论知识&#xff0c;还涉及前沿技术、实践项目和行业经验…

Java --方法引用

方法引用 把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 1.什么是方法引用? 当做函数式接口中抽象方法的方法体把已经存在的方法拿过来用&#xff0c; 2.::是什么符号? 方法引用符 3.方法引用时要注意什么? 需要有函数式接口 被引用方法必须已经存在…

32单片机开发bootloader程序

一&#xff0c;单片机为什么要使用bootloader 1、使用bootloader的好处 1) 程序隔离&#xff1a;可以同时存在多个程序&#xff0c;只要flash空间够大&#xff0c;或者通过外挂flash&#xff0c;可以实现多个程序共存&#xff0c;在多个程序之间切换使用。 2&#xff09;方便程…

python-小李帮老师改错(赛氪OJ)

[题目描述] 老师给小理发了一封电子邮件&#xff0c;任务如下。 写一个程序&#xff0c;给你 n 个数&#xff0c;输出 X。Xnum1p1​​num2p2​​⋯numnpn​​。 num1​&#xff0c;num2​&#xff0c;⋯⋯&#xff0c;numn​ 都是整数&#x…

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼&#xff1a;watchdog库深度解析1. 引言&#xff1a;为何选择watchdog&#xff1f;2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

神奇的方法解决Navicat闪退

原因 打开Navicat操作上面的工具等就会闪退&#xff0c;原因竟然是屏幕划词&#xff01;&#xff01;&#xff01; 解决方法 看别人提到有道词典的划词功能的原因 我没有安装有道词典&#xff0c;但我安装豆包&#xff0c;它也有划词翻译的功能&#xff0c;关闭即可

【JAVA】记录一次前端无能造成的 线上bug

有一个需求是 当方式切换 垫资时 清空 当前所选细单商品 但是前端的奇葩 操作是&#xff0c;只是在页面上清空 细单。 不请求 后台删除 细单 让前端 必须 清空同时 请求后台 删除细单 但是 该前端 技术不行&#xff0c; 嫌麻烦 不做 只好 后台 判断该类型时 进行删除操作…

分省、地级市数字经济专利数据(1985-2022年)

数据年份&#xff1a;1985-2022年 参考文献&#xff1a;孙勇,张思慧,赵腾宇等.数字技术创新对产业结构升级的影响及其空间效应——以长江经济带为例[J].软科学,2022,36(10):9-16. 包含指标&#xff1a; 地级市数据&#xff1a;省份、地级市、会计年度、当年申请的数字经济相…

Java人力资源招聘社会校招类型招聘小程序

✨&#x1f4bc;【职场新风尚&#xff01;解锁人力资源招聘新神器&#xff1a;社会校招类型招聘小程序】✨ &#x1f393;【校招新体验&#xff0c;一键触达梦想企业】&#x1f393; 还在为错过校园宣讲会而懊恼&#xff1f;别怕&#xff0c;社会校招类型招聘小程序来救场&am…

懂个锤子Vue 项目工程化进阶⏫:

Vue项目工程化进阶⏫&#xff1a; 前言&#xff1a; 紧跟前文&#xff0c;目标学习Vue2.0——3.0&#xff1a; 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的技术栈… 当然既然学习框架的了&#xff0c;HTMLCSSJS三件套必须的就不说了&#xff1a; JavaScript 快速入门 …

最新EI期刊信息查询系统(如何查询EI期刊?这里已解决)

直接点击下面的链接 https://www.elsevier.com/products/engineering-village/databases/compendex 进入官网界面 这个列表就是EI索引的全部期刊列表

linux进程控制——进程创建、运行、exit终止——详解解析!

前言&#xff1a;本篇进入新章节——进程控制。 本章节和上一章节同样都是讲解进程&#xff0c; 但是内容上却比上一章内容好理解的多。上一章内容都是进程的概念性相关&#xff0c; 那个时候我们对于进程的理解还处于小白状态&#xff0c; 所以很多东西很抽象&#xff0c; 不好…

快速排序的优化--前后指针

前后指针思想 我们前面文章讲的核心思想是haroe的核心思想&#xff0c;将keyi另一边的指针先移动&#xff0c;找比keyi小的&#xff0c;然后不动&#xff0c;再让keyi这边的指针移动&#xff0c;找比keyi大的&#xff0c;但是这种方法的局限性就是需要让keyi另一边的指针先移动…

止损与趋势交易的艺术在昂首平台尽情绽放

在昂首平台上&#xff0c;我们认识到交易不仅仅是数字游戏&#xff0c;更是一门艺术&#xff0c;需要投资者智慧和策略。正如做生意一样。会以125的价格买入商品&#xff0c;然后再以250的价格卖出。没人会不切实际想着以0元的价格购买商品再以高价卖出。 交易同样需要合理的成…

云仓技术带来的物流变革影响

1、实时可视性&#xff1a; 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力&#xff0c;同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化&#xff1a; 云仓技术可以…

【管理咨询宝藏145】多元化经营大型集团组织架构优化提升方案

【管理咨询宝藏145】多元化经营大型集团组织架构优化提升方案 【格式】PDF版本 【关键词】组织架构、人力资源、组织管控 【核心观点】 - 随着多元业务的发展&#xff0c; 公司逐步由百亿级企业向干亿级企业转变&#xff0c; 人才布局将面临一系列挑战 - 挑战1 :为支撑公司多业…

前端工程化-vue项目开发流程

vue项目创建参考该文&#xff1a; 前端工程化-vue项目创建-CSDN博客 组件就是页面的意思&#xff1b; 默认的App.vue根组件如下图 我们可以修改为如下图所示&#xff0c;注意script的选择&#xff0c; <html>中的标签&#xff0c;此处是放在<template>中&#…

[php7系列]--php7里的返回类型声明和标量类型声明及不要用isset判断数组是否定义某个KEY-最好使用array_key_exists

一、[php7系列]--php7里的返回类型声明和标量类型声明 php7里增加了返回类型声明和标题类型声明&#xff0c;可以理解为对一个方法的输入输出进行了类型验证&#xff0c;在PHP7之前&#xff0c;方法里的数组、对象参数是有类型声明的&#xff0c;但其它的整数、字符串等类型声明…

Idea设置自动导包

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。 点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项&#xff0c;并确定&#xff0c;如下&#xff1a;