三路集合不相交(Three-Way Set Disjointness)算法分析

Posted jeffrey-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三路集合不相交(Three-Way Set Disjointness)算法分析相关的知识,希望对你有一定的参考价值。

概念介绍

实际上,无论是三路,还是多路,原理是类似的。三路集合不相交,指存在3个由一系列数字组成的集合,在任意集合中,不存在相同的元素。且同时满足:对于任意的x,不存在x $ in $ A,x $ in $ B,且x $ in $ C。

实现一

def disjoint1(A, B, C):
    """Return True if there is no element common to all three lists"""
    for a in A:
        for b in B:
            for c in C:
                if a == b == c:
                    return False   # we found a common vale
    return True                    # if we reach this, sets are disjoint

很显然,三层嵌套,对于集合长度都为n的A,B,C来说,总的时间复杂度为O($ n^3 $)。

实现二

def disjoint2(A, B, C):
    """Return True if there is no element common to all three lists"""
    for a in A:
        for b in B:
            if a == b:                    # only check C if we found match from A and B
                for c in C:
                    if a == C:            # (and thus a == b == c)
                        return False      # we found a common value
    return True                           # if we reach this, sets are disjoint

为了计算总的时间复杂度,需要逐层分析。

  • 首先,外层循环A为O(n),内层循环B为O($ n^2 $)。

  • 对于if a== b来说,总共会执行O($ n^2 $)次判断。

  • 剩下的时间取决于(a, b)相等的次数。由于集合的互异性,那么a和b相等的次数为n。因为一旦a == b成立,则a不等于在B中除b以外的元素。

  • 由于a == b的次数为n,则对于最内层循环及其循环体,其时间复杂度为O($ n^2 $)。

综上,总的时间复杂度仍为O($ n^2 $)。

总结

通过不同的算法时间,可以减少程序执行的时间复杂度,进而对程序进行优化以提高效率。

以上是关于三路集合不相交(Three-Way Set Disjointness)算法分析的主要内容,如果未能解决你的问题,请参考以下文章

在 immutable.js 中相交两个以上集合的最佳方法是啥?

有界线集合相交的高效算法

set的特性和基本用法——python3.6

Segment set

HDOJ4343 Interval query

并查集