面试题答案
一键面试设计思路
- 分块处理:将超大列表分成多个较小的块进行处理。这样每次只需要处理一小块数据,减少内存占用。
- 流式处理:不一次性将整个列表加载到内存中,而是逐个块或者逐个元素地处理。
数据结构选择
- 迭代器:Python 中的迭代器(如
iter
函数返回的对象)可以用于实现流式处理。迭代器在迭代时每次只返回一个元素,不会一次性加载所有元素到内存。 - 生成器:生成器是一种特殊的迭代器,通过
yield
关键字来实现。生成器函数在调用时不会立即执行函数体,而是返回一个生成器对象,在迭代该对象时才会逐步执行函数体并返回值。对于超大列表,可以使用生成器来逐块生成数据。
算法的时间和空间复杂度
- 时间复杂度:假设列表总长度为 $n$,分块大小为 $k$。那么需要遍历的次数为 $\frac{n}{k}$,每次遍历块内元素的时间复杂度为 $O(k)$,所以总的时间复杂度为 $O(n)$。
- 空间复杂度:由于每次只处理一个块的数据,块大小为 $k$,所以空间复杂度为 $O(k)$。
核心代码示例(Python)
def chunked_iterable(iterable, chunk_size):
"""将可迭代对象按块生成"""
for i in range(0, len(iterable), chunk_size):
yield iterable[i:i + chunk_size]
def count_large_list(large_list, chunk_size=1000):
count = 0
for chunk in chunked_iterable(large_list, chunk_size):
count += len(chunk)
return count
# 示例使用
large_list = list(range(1000000))
print(count_large_list(large_list))
上述代码中,chunked_iterable
函数将输入的可迭代对象按指定的块大小进行分块生成。count_large_list
函数通过迭代这些块并累加每个块的长度来计算超大列表的总长度。这样在处理超大列表时,每次只在内存中保留一个块的数据,从而减少内存占用。