1. 从试除法到质因数分解:算法优化的本质
第一次接触质因数分解问题时,我和大多数人一样,直接暴力遍历每个可能的因数。当处理数字30时,程序从2开始逐个检查:2能整除30吗?能!记录下2,然后30除以2得到15;继续检查3能整除15吗?能!记录3,15除以3得到5;最后5本身是质数,记录完成。看起来很简单对吧?但当我尝试用这种方法处理一个接近20亿的数字时,程序直接卡死了。
这里的关键在于理解时间复杂度的差异。暴力算法的时间复杂度是O(n),意味着处理一个20亿的数字需要20亿次操作。而优化后的算法复杂度是O(√n),只需要大约44721次操作——这个数字是20亿的平方根。实际测试中,前者需要几分钟才能完成的计算,后者几乎瞬间就能给出结果。
质因数分解的核心在于认识到:任何合数的质因数都不会超过它的平方根。举个例子,数字36的平方根是6,它的质因数2和3都小于等于6。即使像17这样的质数,虽然它没有小于其平方根的因数,但我们只需要检查到⌊√17⌋=4就能确认它是质数。这个数学特性让我们能大幅减少需要检查的数字范围。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 试除法的优化实战:从O(n)到O(√n)
2.1 基础试除法的局限性
让我们先看一个最朴素的实现:
python复制def prime_factors_naive(n):
factors = []
i = 2
while i <= n:
if n % i == 0:
factors.append(i)
n = n // i
else:
i += 1
return factors
这个算法在处理数字98时会这样工作:
- 98÷2=49 → 记录2
- 49÷7=7 → 记录7
- 7÷7=1 → 记录7
最终得到[2,7,7]。但当n是很大的质数时(比如2147483647),它会愚蠢地检查每一个数字直到n本身。
2.2 平方根优化的关键突破
改进后的算法聪明得多:
python复制def prime_factors_optimized(n):
factors = []
i = 2
while i * i <=
