Python列表赋值时间复杂度疑问:SparseVector初始化为何是O(n)?
关于稀疏向量初始化时间复杂度的疑问解答
先看你提供的代码实现:
class SparseVector: def __init__(self, nums): self.array = nums def dotProduct(self, vec): result = 0 for num1, num2 in zip(self.array, vec.array): result += num1 * num2 return result
你判断的没错——就这段代码里的__init__方法来说,self.array = nums只是把传入的列表引用直接赋值给实例变量,本质上是引用的复制操作,时间复杂度确实是O(1),完全不需要遍历整个数组。
答案里提到初始化是O(n),大概率是两种原因:
- 它混淆了「稀疏向量的标准优化实现」和这段代码的简易实现:真正的稀疏向量为了节省存储空间,初始化时会遍历原数组,只保留非零元素的索引和对应值,这个遍历过程的时间复杂度是O(n);但你贴的代码是简化版,直接存储了整个原数组,没有利用稀疏性做优化。
- 或者答案默认初始化时需要拷贝整个数组(比如写成
self.array = nums.copy()),这种情况下时间复杂度才是O(n),但代码里并没有执行拷贝操作。
简单说:这段代码的__init__时间复杂度确实是O(1),答案的表述要么是针对通用的稀疏向量实现,要么是和当前代码不匹配的错误表述。
内容的提问来源于stack exchange,提问作者illuminato
相关产品推荐
相关产品推荐

