python中生成器表达式的时间复杂性
我在解决一个问题,给定两个字符串python中生成器表达式的时间复杂性,python,time-complexity,Python,Time Complexity,我在解决一个问题,给定两个字符串s和t,目的是找出s是否是t的子序列。 我发现了一个解决方案: def isSubsequence(s, t): t = iter(t) return all(c in t for c in s) 我想知道这个解决方案的时间复杂度是多少。 以下是我得出的结论: 首先,我们将t转化为一个迭代器,它的作用是在t中的c迭代迭代器,直到找到匹配的第一个位置。 其次,t中的c代表s中的c是一个生成器:它返回一个迭代器。 第三,all()将迭代器作为参数,并循环
s
和t
,目的是找出s
是否是t
的子序列。
我发现了一个解决方案:
def isSubsequence(s, t):
t = iter(t)
return all(c in t for c in s)
我想知道这个解决方案的时间复杂度是多少。
以下是我得出的结论:
首先,我们将t
转化为一个迭代器,它的作用是在t中的c迭代迭代器,直到找到匹配的第一个位置。
其次,t中的c代表s中的c
是一个生成器:它返回一个迭代器。
第三,all()
将迭代器作为参数,并循环查找第一个False
。如果找不到,则返回True
迭代s
的for循环具有O(s)复杂度,假设c
是t
中的最后一个字母,即O(t)复杂度。另外,因为这与嵌套for循环不同,所以复杂性不会是O(s*t)。
在这方面你能帮我吗。迭代器只能被遍历一次。比如说,
>>> t = iter([1,2,3])
>>> list(t)
[1, 2, 3]
>>> list(t)
[]
>>> list(t)
[]
该函数利用了这样一个事实,即t
中的c只会消耗尽可能多的迭代器来确定是否找到c
。当找到c
时,迭代将停止,直到下一次在t
中计算c时为止,此时您将从t
中的中断处开始计算。一旦到达t
的末尾,对t
中c的所有进一步调用将立即返回,因为迭代器不会自行重置。因此,all(c-in-t代表c-in-s)
将调用len(s)
到c-in-t
,但在这些调用过程中所做的累计比较次数只是len(t)
;您最多只能一次查看原始t
参数的每个元素。迭代器只能遍历一次。比如说,
>>> t = iter([1,2,3])
>>> list(t)
[1, 2, 3]
>>> list(t)
[]
>>> list(t)
[]
该函数利用了这样一个事实,即t
中的c只会消耗尽可能多的迭代器来确定是否找到c
。当找到c
时,迭代将停止,直到下一次在t
中计算c时为止,此时您将从t
中的中断处开始计算。一旦到达t
的末尾,对t
中c的所有进一步调用将立即返回,因为迭代器不会自行重置。因此,all(c-in-t代表c-in-s)
将调用len(s)
到c-in-t
,但在这些调用过程中所做的累计比较次数只是len(t)
;您最多只能看一次原始t
参数的每个元素。复杂性是O(s+t),因为您只经历了一次s和t。@DarrylG您能分享一些见解吗?复杂性是O(s+t),因为您只经历了一次s和t。@DarrylG您能分享一些见解吗?这解释了为什么时间复杂性是O(s+t),我忽略了一个事实,即一旦在's'中的'c'找到't'中的'c',迭代将停止。谢谢你的回答。这就解释了为什么时间复杂度将是O(s+t),我忽略了一个事实,即一旦在“t”中找到了“s”中的“c”,迭代就会停止。谢谢你的回答。