面试题答案
一键面试def fibonacci(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
性能优势
- 时间复杂度优化:原递归版本的时间复杂度是指数级别的,因为会有大量重复计算(例如
fibonacci(n - 1)
和fibonacci(n - 2)
中会有重叠的计算)。而使用while
循环改写后,时间复杂度降为线性,每次循环都在不断计算下一项的值,避免了重复计算。 - 空间复杂度优化:递归版本由于函数调用栈的存在,空间复杂度较高,与递归深度成正比。而
while
循环版本只需要几个固定的变量来保存中间结果,空间复杂度为常数级。
大数据量下性能瓶颈及解决方案
- 性能瓶颈:虽然
while
循环版本已经有很大优化,但在大数据量下,由于Python的整数对象是对象引用,每次加法操作都会创建新的整数对象,这会带来额外的内存开销和时间开销。 - 解决方案:
- 使用
numpy
库:numpy
库提供了高效的数值计算功能,其数组操作基于C语言实现,在处理大量数值计算时效率更高。可以使用numpy
的数组来存储斐波那契数列的值,利用其向量化操作来提高计算速度。 - 使用生成器:如果不需要一次性获取整个斐波那契数列,而是按需获取值,可以使用生成器。生成器在每次调用
next()
时才计算下一个值,节省内存空间。
- 使用
def fibonacci_generator():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
使用时可以通过next()
函数获取值,例如:
gen = fibonacci_generator()
for _ in range(10):
print(next(gen))