首页 > 编程语言 >python-查找算法

python-查找算法

时间:2024-07-15 15:55:23浏览次数:10  
标签:python list mid 索引 算法 查找 low data

查找算法

1. 线性查找

"""
线性查找:
    对于被查找的序列没有顺序要求,可以是有序的,也可以是无序的,
    查找时从线性表的起始位置按照顺序匹配,找到元素时,返回该元素在原始字符串的下标
    若匹配完整个序列未找到匹配元素,则查找失败,返回-1
时间复杂度 O(n)
"""


def lineSearch(data_list, value):
    count = 1
    # 遍历所有下标
    for i in range(len(data_list)):
        print(f'第{count}次查找')
        count += 1
        # 若值匹配
        if data_list[i] == value:
            # 返回下标
            return i
    # 若遍历完未找到匹配元素 返回-1
    return -1

if __name__ == '__main__':
    data_list = [10, 20, 30, 45, 55, 67, 69, 73, 89, 92, 100]
    print('*' * 30)
    print('成功匹配' if lineSearch(data_list, 100) > 0 else '未找到')
    print('成功匹配' if lineSearch(data_list, -1) > 0 else '未找到')

控制台输出

******************************
第1次查找
第2次查找
第3次查找
第4次查找
第5次查找
第6次查找
第7次查找
第8次查找
第9次查找
第10次查找
第11次查找
成功匹配
第1次查找
第2次查找
第3次查找
第4次查找
第5次查找
第6次查找
第7次查找
第8次查找
第9次查找
第10次查找
第11次查找
未找到

2. 二分查找

"""
二分查找:
    要求被查找的序列必须是有序的,如果无序需要先进行排序再查找
    查找时先对比目标序列的中间元素和目标值的大小,若中间元素等于目标值则查找成功
    否则根据中间元素对比目标值的大小,结合目标序列的排列方式决定查找由中间元素分隔出来的左区间或右区间
"""

def binarySearch(data_list, value):
    # 初始化 最小值对应的索引 最大值对应的索引
    low, high = 0, len(data_list) - 1
    # 计算中间索引
    mid = len(data_list) // 2
    count = 1
    while low < high:
        print(f'第{count}次查找')
        count += 1
        # 如果相同,返回下标值
        if data_list[mid] == value:
            return mid
        # 中间元素大于目标值,搜索左边
        elif data_list[mid] > value:
            high = mid - 1
        # 中间元素小于目标值,搜索右边
        else:
            low = mid + 1
        mid = (high - low) // 2 + low

if __name__ == '__main__':
    data_list = [10, 20, 30, 45, 55, 67, 69, 73, 89, 92, 100]
    print('*' * 30)
    print('成功匹配' if binarySearch(data_list, 100) else '未找到')
    print('成功匹配' if binarySearch(data_list, -1) else '未找到')

控制台输出

******************************
第1次查找
第2次查找
第3次查找
未找到
第1次查找
第2次查找
第3次查找
未找到

3. 插值查找

"""
插值查找:
    二分查找的改进
    首先找到目标值所在的范围
    它等于 
        当前最小值的索引      -- 索引的值
        加上 
        (目标值 -  当前最小值) -- 真实值 - 索引对应的真实值
        除以 
        (当前最大索引对应的值-当前最小索引对应的值) -- 索引对应的真实值 - 索引对应的真实值 
        乘以
        (当前最大索引的值-当前最小索引的值) -- 索引值 - 索引值 
        得到 
        一个索引值           --得到接近 查找的值 的位置
    如果这个估算的位置恰好存在于数组中,则返回该位置
    如果不存在, 则比较估算位置的实际值与目标值
    如果小于目标值则在右侧继续估算, 反之则在左侧
"""

def insertSearch(data_list, value):
    # 初始化 最小值对应的索引 最大值对应的索引
    low, high = 0, len(data_list) - 1
    # 中间索引
    mid = low + int((value - data_list[low]) / (data_list[high] - data_list[low]) * (high - low))
    count = 1
    while low < high:
        print(f'第{count}次查找')
        count += 1
        # 如果相同,返回下标值
        if data_list[mid] == value:
            return mid
        # 中间元素大于目标值,搜索左边
        elif data_list[mid] > value:
            high = mid - 1
        # 中间元素小于目标值,搜索右边
        else:
            low = mid + 1
        mid = low + int((value - data_list[low]) / (data_list[high] - data_list[low]) * (high - low))

if __name__ == '__main__':
    data_list = [10, 20, 30, 45, 55, 67, 69, 73, 89, 92, 100]
    print('*' * 30)
    print('成功匹配' if insertSearch(data_list, 100) else '未找到')
    print('成功匹配' if insertSearch(data_list, -1) else '未找到')

控制台输出

******************************
第1次查找
成功匹配
第1次查找
未找到

4. 斐波那契查找

"""
斐波那契查找:
    斐波那契数列: F={1,1,2,3,5,8,13,21...}
    表达式: F(i) = F(i-1) + F(i-2) (i>1)
    二分查找的一种改进, 由于随着数字的增大,前一项和后一项的比值越来越接近黄金分隔比值是0.618
    因此也成为黄金分割比例
流程:
    斐波那契查找改变了mid的计算方式, mid = low + F(block-1) -1
    block是斐波那契数列区间,F是斐波那契函数,用于获取斐波那契数列的第n个数
    若目标值等于mid指向的数据,则返回mid值
    若目标值大于mid指向的元素,则向右查找并减小两个斐波那契区间
    若目标值小于mid指向的元素,则向左查找并减少一个斐波那契区间
    重复上述步骤直到找到目标元素或区间为0或赋值,查找结束
    
    
时间复杂度 O(log₂n)
"""

def fibonacci(num):
    """
    生成斐波那契数列
    :param num:
    :return:
    """
    fib_list = [1, 1, 2]
    a, b, c = 1, 1, 2
    while c < num:
        a = b
        b = c
        c = a + b
        fib_list.append(c)
    return fib_list


def fibonacciSearch(data_list, value):
    # 初始化 最小值对应的索引 最大值对应的索引
    low, high = 0, len(data_list) - 1
    f = fibonacci(high)
    # 初始区间为 斐波那契最后一个区间
    block = len(f) - 1
    # 计算中间索引
    mid = low + f[block - 1] - 1
    count = 1
    while low <= high:
        print(f'第{count}次查找')
        count += 1
        # 如果相同,返回下标值
        if data_list[mid] == value:
            return mid
        # 中间元素大于目标值,搜索左边
        elif data_list[mid] > value:
            high = mid - 1
            block -= 1
        # 中间元素小于目标值,搜索右边
        else:
            low = mid + 1
            block -= 2
        mid = low + f[block - 1] - 1

if __name__ == '__main__':
    data_list = [10, 20, 30, 45, 55, 67, 69, 73, 89, 92, 100]
    print('*' * 30)
    print('成功匹配' if fibonacciSearch(data_list, 100) else '未找到')
    print('成功匹配' if fibonacciSearch(data_list, -1) else '未找到')

控制台输出

******************************
第1次查找
第2次查找
成功匹配
第1次查找
第2次查找
第3次查找
第4次查找
第5次查找
未找到

标签:python,list,mid,索引,算法,查找,low,data
From: https://blog.csdn.net/h15366059/article/details/140441243

相关文章

  • 二分查找模板
    二分查找主要难点在于边界判定,逻辑相对简单,下文以力扣704.二分查找为例分析二分查找的代码模板。题目描述给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。来源:力扣(LeetCode)原......
  • python 基础中requests 验证码
    验证码登录importrequests#古诗文网登录页面的URL地址url='https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTM......
  • Python 数据可视化与报告生成
    Python数据可视化与报告生成在当今的数据驱动世界中,数据可视化和报告生成是数据科学家、分析师和业务决策者不可或缺的工具。Python,作为一种强大且灵活的编程语言,通过其丰富的库和框架,为数据可视化和报告生成提供了广泛的支持。本文将深入探讨Python在数据可视化和报告生......
  • Python Web应用的部署与维护
    PythonWeb应用的部署与维护是一个涉及多个环节和技术的复杂过程,涵盖了从项目准备、服务器配置、代码部署到后期监控与维护的全方位工作。以下是对这一过程的详细阐述。一、Web应用的部署1.项目准备在部署之前,首先需要确保PythonWeb项目已经开发完成,并且经过了充分的测......
  • python 20行代码 无图 turtle 缺心眼(缺良心)还没治好 模拟太阳系天体运行系统
    短短12h赞就破10个了,没20个很好了,我可不想失去头发其实我不想做这个程序的但是今天是我参加完天文比赛的10分之57周年(我2024.5.12参加的)20行以下代码段为准本期新规矩:天王18步老规矩.先放代码importturtle,time;screen=turtle.Screen();screen.bgcolor('black');scr......
  • Day33.元类下的属性查找
    1.元类下的属性查找_对象.方法和类名.方法的查找经过#todo属性查找的原则:对象->类->父类#todo切记:父类不是元类classMymeta(type):n=444def__call__(self,*args,**kwargs):#self=<class'__main__.StanfordTeacher'>obj=self.__new......
  • Python 集合:深入理解与应用
    一、引言1.在Python编程中,集合(Set)是一种强大而有用的数据结构。它具有独特的特性,适用于解决各种问题,特别是在处理不重复元素和集合操作时。二、集合的创建#使用花括号创建集合set1={1,2,3,4,5}#使用set()函数创建集合set2=set([5,6,7,8,9])三、集合......
  • 《探索 Python 字典的奥秘》
    在Python中,字典(Dictionary)是一种非常强大和灵活的数据结构。它以键值对(Key-ValuePair)的形式存储数据,类似于现实生活中的字典,通过查找单词(键)来获取其释义(值)。一、字典的定义字典可以使用花括号 {} 来创建,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔,dict 作为......
  • python中逻辑运算符and 和 or 的优先级问题。
    python的说明文档以及教材上、网上都说明and的优先级大于or。但我经过实际操作,发现其中规律似乎并不简单,下面我列举一些代码,来提出我的疑问:有时候or的优先级高,有时候and优先级高,并且并不是从左至右运算。首先说明python当中的and和or运算逻辑如下(这里必须懂):    1......
  • SMOTE与SMOGN算法R语言代码
      本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。  在之前的文章SMOGN算法Python实现:解决回归分析中的数据不平衡中,我们介绍了基于Python语言中的smogn包,实现SMOGN算......