目录
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³ | 1ms | 0.01ms |
| 10⁶ | 1s | 0.02ms |
| 10⁹ | 15分钟 | 0.03ms |
大O表示法:
-
O(1):常数时间(哈希表查找)
-
O(n):线性时间(遍历操作)
-
O(n²):平方时间(嵌套循环)
-
O(log n):对数时间(二分搜索)
9.3 本章小结
核心要点:
-
算法选择原则
-
数据量 < 1000 → 线性搜索
-
数据量 ≥ 1000且有序 → 二分搜索
-
频繁查找 → 预处理为字典/集合(O(1)查找)
-
-
性能优化策略
-
优先使用内置函数(底层C实现)
-
避免多层嵌套循环
-
空间换时间(缓存计算结果)
-
-
测试规范
-
使用
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向量化操作替代循环)

被折叠的 条评论
为什么被折叠?



