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}


相关文章
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
290 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
314 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
261 103
|
3月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
193 82
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
179 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
435 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
265 3
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
265 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
82 0
|
3月前
|
存储 人工智能 算法
Python实现简易成语接龙小游戏:从零开始的趣味编程实践
本项目将中国传统文化与编程思维相结合,通过Python实现成语接龙游戏,涵盖数据结构、算法设计与简单AI逻辑,帮助学习者在趣味实践中掌握编程技能。
334 0