Python学习算法系列(1):算法基础与复杂度分析

Python学习算法系列(1):算法基础与复杂度分析

1. 引言

在计算机科学中,算法(Algorithm) 是解决问题的一组有限有序的指令。掌握算法不仅能提高编程能力,还能优化代码性能,提升面试通过率。

本系列的第一篇文章将介绍:

  • 什么是算法
  • 如何衡量算法的优劣
  • 时间复杂度与空间复杂度
  • Python 中的基本性能测试

2. 什么是算法?

算法(Algorithm) 是一组清晰的指令,用于解决特定问题。例如,如何在一组数中找到最大值:

def find_max(arr):
    max_value = arr[0]
    for num in arr:
        if num > max_value:
            max_value = num
    return max_value

print(find_max([3, 1, 7, 5, 9, 2]))  # 输出 9

📌 解释

  • 遍历数组,每次更新最大值
  • 时间复杂度O(n)(遍历 n 个元素)

3. 如何衡量算法的优劣?

衡量算法的标准:

  1. 正确性:能否正确解决问题?
  2. 时间复杂度:算法运行所需时间
  3. 空间复杂度:算法占用的额外存储空间
  4. 可读性:代码是否易读易维护?

4. 时间复杂度(Time Complexity)

时间复杂度 代表输入规模 n 增大时,算法运行时间的增长趋势,常见复杂度如下:

复杂度示例描述
O(1)直接访问数组元素常数时间
O(log n)二分查找对数时间
O(n)遍历数组线性时间
O(n log n)归并排序线性对数时间
O(n²)嵌套循环平方时间

📌 示例:O(n) VS O(n²)

# O(n) - 线性复杂度
def linear_search(arr, target):
    for num in arr:
        if num == target:
            return True
    return False

# O(n²) - 二重循环
def find_duplicates(arr):
    duplicates = []
    for i in range(len(arr)):
        for j in range(i + 1, len(arr)):
            if arr[i] == arr[j]:
                duplicates.append(arr[i])
    return duplicates

linear_search() 运行时间与 n 成正比
find_duplicates() 运行时间随着 增长


5. 空间复杂度(Space Complexity)

空间复杂度 衡量算法使用的额外空间。例如:

📌 示例

# O(1) - 只使用一个变量
def sum_numbers(n):
    total = 0
    for i in range(1, n + 1):
        total += i
    return total

# O(n) - 使用额外数组
def generate_list(n):
    return [i for i in range(n)]

sum_numbers() 只用了 total 变量,空间复杂度 O(1)
generate_list() 生成了 n 长度的数组,空间复杂度 O(n)


6. Python 代码性能测试

使用 timeit 测试算法运行时间

import timeit

code_to_test = """
def find_max(arr):
    max_value = arr[0]
    for num in arr:
        if num > max_value:
            max_value = num
    return max_value

find_max([3, 1, 7, 5, 9, 2])
"""
execution_time = timeit.timeit(code_to_test, number=100000)
print(f"执行时间:{execution_time} 秒")

可以用 timeit 评估不同算法的性能


7. 总结

算法衡量标准

  • 时间复杂度 影响运行速度
  • 空间复杂度 影响存储需求

Python 性能测试

  • timeit 测试代码执行时间
  • 选择合适的算法,优化程序性能

📢 下一篇 Python学习算法系列(2):Python 递归算法,敬请期待!🚀

💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值