Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中生成器表达式的时间复杂性_Python_Time Complexity - Fatal编程技术网

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”,迭代就会停止。谢谢你的回答。