python - python中生成器表达式的时间复杂度
问题描述
我正在解决给定两个字符串的问题s
和t
,目的是找出是否s
是 的子序列t
。我遇到了一个解决方案:
def isSubsequence(s, t):
t = iter(t)
return all(c in t for c in s)
我想知道这个解决方案的时间复杂度是多少。这是我发现的:
首先,我们变成t
了一个迭代器,它的作用是c in t
遍历迭代器,直到它找到匹配的第一个位置。其次,c in t for c in s
是一个生成器:它返回一个迭代器。第三,all()
将迭代器作为参数并循环查找第一个False
. 如果找不到,则返回True
。
迭代的 for 循环s
具有 O(s) 复杂度,假设是O(t) 复杂度c
中的最后一个字母。t
此外,由于这与嵌套的 for 循环不同,因此复杂度不会是 O(s * t)。你能在这种情况下帮助我吗?
解决方案
一个迭代器只能被遍历一次。例如,
>>> t = iter([1,2,3])
>>> list(t)
[1, 2, 3]
>>> list(t)
[]
>>> list(t)
[]
该函数利用了这样一个事实,即c in t
只消耗必要的迭代器来确定c
是否找到。找到时c
,迭代会停止,直到您下一次评估c in t
,此时您从中断处继续t
。一旦到达末尾t
,所有进一步的调用c in t
都会立即返回,因为迭代器不会自行重置。因此,all(c in t for c in s)
将len(s)
调用c in t
,但在这些调用过程中累积len(t)
的比较次数为; 您t
最多只能查看原始参数的每个元素。
推荐阅读
- java - 来自 docker-compose 环境的 catalina.sh 系统变量
- javascript - 计算两次之间的差异并增加结果
- django - Django 模板的“扩展”标签不起作用
- typescript - Typescript 使用具有严格值的接口
- haskell - 堆栈无法解决安装 wx 的依赖项
- javascript - 如何使 vscode 显示来自另一个 .js 文件的导出函数的类型信息?
- delphi - 如何与 Delphi 中的类型库交互?
- java - ProGuard - 混淆资源文件中的类名
- webpack - PhpStorm 无法识别使用 webpack 别名导入的 Sass 文件
- hibernate - 从 HibernateCompositeUserType 查询字段时出现 IllegalArgumentException