Python含zip(a,b)的代码片段时间复杂度分析及优化咨询
问题1:原有代码的时间复杂度分析纠正
你的分析中存在一处核心错误:
- 你认为
[a * b for a, b in zip(edit_vecs[i], v)]这行的时间复杂度是O((s-1)²),这个结论不对。 - 实际逻辑是:
zip创建迭代器确实是O(1),列表推导式遍历两个长度为s-1的序列,每轮迭代做一次乘法,总共只需要执行s-1次操作,耗时是O(s-1)。赋值操作只是把变量名指向新生成的列表,属于O(1)的指针修改,不需要额外拷贝内容,不会增加线性耗时。 - 所以这行的总耗时是O(s-1),不是平方级。
由此可以算出原有代码的总时间复杂度:
- 初始化
edit_vecs的耗时是O(L*(s-1)) - 循环部分:每次迭代
pop()是O(1),列表推导是O(s-1),L次迭代总耗时O(L*(s-1)) - 整体总复杂度是O(L*s),和你优化后的版本处于同一复杂度级别。
不过原有代码存在很多无意义的冗余操作:初始化全1列表、逐元素乘1的操作完全是多余的,还会原地修改orig_vecs的原始内容(pop()是原地操作),实际运行效率会比优化版本低很多,还有额外的副作用。
问题2:优化版本的复杂度确认
你对edit_vecs = [vec[:-1] for vec in orig_vecs]的复杂度分析是完全正确的,就是O(Ls)。
切片操作vec[:-1]需要拷贝原列表除了最后一个元素之外的所有内容,每个向量的拷贝耗时是O(s-1),L个向量总耗时就是O(L(s-1)),忽略常数项后就是O(Ls)。
这个复杂度已经是理论最优了:你的需求是生成L×(s-1)的新列表,必然需要处理L(s-1)个元素,不可能有比线性更低的时间复杂度。
内容的提问来源于stack exchange,提问作者fcrp
相关产品推荐
相关产品推荐

