Python编程:查找算法之顺序查找和二分查找

简介: Python编程:查找算法之顺序查找和二分查找

算法Algorithm

一个计算过程,解决问题的方法


递归:


调用自身

结束条件

时间复杂度:


用来估计算法运行时间的一个式子

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n2logn) < O(n^3)

一般来说,时间复杂度高的算法比复杂度低的算法慢


不常见的时间复杂度:

O(n!) O(2^n) O(n^n)


时间复杂度判断


循环减半的过程 -> O(logn)

几次循环就是n的几次方

空间复杂度:


用来评估算法内存占用大小的式子

空间换时间


列表查找

从列表中查找指定元素

输入:列表,待查元素

输出:元素下标或未查找到元素

顺序查找:


从列表第一个元素开始,顺序进行搜索,直到找到为止

二分查找:


从有序列表的候选区data[0: n]开始,通过对待查找的值与候选区中间的值比较,可以使候选区减少一半

代码实例

1、递归


#先打印再调用
def foo1(x):
    if x > 0:
        print(x)
        foo1(x-1)
foo1(5)
# 5 4 3 2 1
# 先调用再打印
def foo2(x):
    if x > 0:
        foo2(x-1)
        print(x)
foo2(5)
# 1 2 3 4 5

2、顺序查找与二分查找


# -*- coding: utf-8 -*-
import time
# 计时装饰器
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        ret = func(*args, **kwargs)
        end = time.time()
        print("time: %s"% (end-start))
        return ret
    return wrapper
# 顺序(线性)查找 O(n)
@timer
def line_search(lst, val):
    for index, value in enumerate(lst):
        if val == value:
            return index
    return None
# 二分查找(需要有序) O(logn)
@timer
def binary_search(lst, val):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = (high + low)//2
        if lst[mid] == val:
            return mid
        elif lst[mid] < val:
            low = mid + 1
        else:
            high = mid - 1
    return None
if __name__ == '__main__':
    lst = list(range(100000))
    ret = line_search(lst, 90000)
    print(ret)
    # time: 0.007
    # 90000
    ret = binary_search(lst, 90000)
    print(ret)
    # time: 0.000
    # 90000

3、二分查找实例


通过二分查找,输入id 查找学生完整信息

# -*- coding: utf-8 -*-
import random
from chinesename import chinesename  # pip install chinesename
# 二分查找函数
def binary_search(lst, uid):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = (low + high)//2
        if lst[mid]["uid"] == uid:
            return lst[mid]
        elif lst[mid]["uid"] < uid:
            low = mid + 1
        else:
            high = mid - 1
    return None
# 生成学生信息
def get_students(n):
    """
    @param n: 数量
    @return: {list}
    """
    cn = chinesename.ChineseName()
    uids = list(range(1001, 1001+n))
    lst = []
    for uid in uids:
        dct = {
            "uid": uid,
            "name": cn.getName(),
            "age": random.randint(18, 60)
        }
        lst.append(dct)
    return lst
if __name__ == '__main__':
    students = get_students(100000)
    ret = binary_search(students, 1005)
    print(ret)
    # {'uid': 1005, 'name': '相佃', 'age': 58}


相关文章
|
2天前
|
数据采集 算法 数据可视化
python实现时序平滑算法SG滤波器
python实现时序平滑算法SG滤波器
|
4天前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
19 5
|
7天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
7天前
|
算法 机器人 Python
Python实现教程:平面最短路径算法
Python实现教程:平面最短路径算法
13 1
|
7天前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。
10 0
|
8天前
|
测试技术 Python
Python模块化方式编程实践
Python模块化编程提升代码质量,包括:定义专注单一任务的模块;使用`import`导入模块;封装函数和类,明确命名便于重用;避免全局变量降低耦合;使用文档字符串增强可读性;为每个模块写单元测试确保正确性;重用模块作为库;定期维护更新以适应Python新版本。遵循这些实践,可提高代码可读性、重用性和可维护性。
33 2
|
13天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
13天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。
|
13天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
13天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】层次聚类算法的原理与应用
【4月更文挑战第30天】层次聚类是数据挖掘中的聚类技术,无需预设簇数量,能生成数据的层次结构。分为凝聚(自下而上)和分裂(自上而下)两类,常用凝聚层次聚类有最短/最长距离、群集平均和Ward方法。优点是自动确定簇数、提供层次结构,适合小到中型数据集;缺点是计算成本高、过程不可逆且对异常值敏感。在Python中可使用`scipy.cluster.hierarchy`进行实现。尽管有局限,层次聚类仍是各领域强大的分析工具。