两个列表之间的子集算法 - 为什么在len(L1)= len(L2)时最坏的情况?

时间:2017-05-22 12:39:47

标签: python asymptotic-complexity

我有一个算法确定列表L1是否是列表L2的子集(即L1中的所有元素是否都在L2中):

def isSubset(L1, L2):
    for e1 in L1:
        matched = False
        for e2 in L2:
            if e1 == e2:
                matched = True
                break
        if not matched:
            return False
    return True

在我的课程笔记中,它说“最坏的情况发生在len(L1)= len(L2)”,但为什么会这样呢?

我的理由是:对于给定的L1和L2,最坏的情况发生在L1确实是L2的子集时(在这种情况下,对于每个L1,我们必须遍历L2中的每个元素来验证这一点。) / p>

如果是这种情况(即L1是L2的子集),则需要更长的时间来验证L1是否是[1,7,2,3,5,8,9, 20],而不是确认它是[2,5,3]的成员。

我的推理有什么问题?

1 个答案:

答案 0 :(得分:0)

基本上,当L1等于L2时,必须针对L1检查L2的所有元素。

另一方面,如果L1不等于L2,则它是它的一个子集,或者它不是。{/ p>

如果是,则需要更少的检查,因为L1中的元素数量会少于L1 L2的数量。

否则,只要在L2中发现了不属于L1的元素,就可以确定L1不能是L2的子集。

另一方面,如果len(L1) == len(L2)L1的第一个元素不在L2中,则执行只需要L2上的一个循环。

因此,最坏的情况=> len(L1) == len(L2),但反过来却不正确。