假设有两个元素列表A和B。我想检查A是否包含了B的所有元素。具体来说,这些元素必须按照相同的顺序出现,它们不需要是连续的。如果是这种情况,我们称B是A的一个子序列。
以下是一些例子:
以下是一些例子:
A = [4, 2, 8, 2, 7, 0, 1, 5, 3]
B = [2, 2, 1, 3]
is_subsequence(A, B) # True
A = [4, 2, 8, 2, 7, 0, 1, 5, 3]
B = [2, 8, 2]
is_subsequence(A, B) # True
A = [4, 2, 8, 2, 7, 0, 1, 5, 3]
B = [2, 1, 6]
is_subsequence(A, B) # False
A = [4, 2, 8, 2, 7, 0, 1, 5, 3]
B = [2, 7, 2]
is_subsequence(A, B) # False
我发现一种很优雅的方法来解决这个问题(参见这个答案):
def is_subsequence(A, B):
it = iter(A)
return all(x in it for x in B)
我现在想知道这个解决方案在可能有非常非常大的输入时的表现。比方说,我的列表包含数十亿个数字。
- 上述代码的复杂度是什么?它的最坏情况是什么?我已经试过用非常大的随机输入进行测试,但它的速度大多取决于自动生成的输入。
- 更重要的是,是否有更有效的解决方案?这些解决方案为什么比这个更有效?
all(x in it for x in B)
方法本质上是Blinkenlight算法的更紧凑形式。 - Martijn Pieters