第九章 算法基础

目录

9.1 搜索算法

线性搜索

二分搜索

9.2 算法计时与分析

性能测量方法

时间复杂度对比

9.3 本章小结


9.1 搜索算法

线性搜索

原理
遍历所有元素直到找到目标值
时间复杂度:O(n)
适用场景:无序数据、小规模数据

def linear_search(arr, target):
    for i, num in enumerate(arr):
        if num == target:
            return i
    return -1

# 示例
print(linear_search([3,1,4,2,5], 4))  # 输出索引2

二分搜索

原理
每次将搜索范围减半(要求数据有序)
时间复杂度:O(log n)
适用场景:有序数据、大规模数据

def binary_search(arr, target):
    low, high = 0, len(arr)-1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# 示例
sorted_data = sorted([5,3,7,1,9])
print(binary_search(sorted_data, 7))  # 输出索引3

9.2 算法计时与分析

性能测量方法

time模块

import time

start = time.perf_counter()  # 高精度计时器
binary_search(list(range(1000000)), 999999)
end = time.perf_counter()
print(f"耗时:{end-start:.6f}秒")

timeit模块(推荐):

import timeit

code = '''
def test():
    return binary_search(list(range(1000000)), 999999)
'''
print(timeit.timeit(stmt=code, number=100))  # 执行100次的平均时间

时间复杂度对比

数据规模线性搜索二分搜索
10³1ms0.01ms
10⁶1s0.02ms
10⁹15分钟0.03ms

大O表示法

  • O(1):常数时间(哈希表查找)

  • O(n):线性时间(遍历操作)

  • O(n²):平方时间(嵌套循环)

  • O(log n):对数时间(二分搜索)

9.3 本章小结

核心要点

  1. 算法选择原则

    • 数据量 < 1000 → 线性搜索

    • 数据量 ≥ 1000且有序 → 二分搜索

    • 频繁查找 → 预处理为字典/集合(O(1)查找)

  2. 性能优化策略

    • 优先使用内置函数(底层C实现)

    • 避免多层嵌套循环

    • 空间换时间(缓存计算结果)

  3. 测试规范

    • 使用timeit测量多次执行平均耗时

    • 测试不同规模的数据(10³/10⁶/10⁹)

    • 对比理论时间复杂度和实测结果

开发实践

# 综合案例:自动选择最优搜索算法
def smart_search(data, target):
    if len(data) < 1000 or not all(data[i] <= data[i+1] for i in range(len(data)-1)):
        return linear_search(data, target)
    return binary_search(data, target)

(提示:实际工程中优先使用bisect模块实现二分搜索,大数据处理考虑使用numpy向量化操作替代循环)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值