这种递归算法的复杂性是什么?

时间:2017-08-17 22:55:41

标签: python algorithm time-complexity

以下算法是否具有O(nlogn)的复杂度?

令我困惑的是这个算法分为两次,而不是一次作为常规的O(nlogn)算法,每次都做O(n)工作。

def equivalent(a, b):

    if isEqual(a, b):
        return True

    half = int(len(a) / 2)
    if 2*half != len(a):
        return False

    if (equivalent(a[:half], b[:half]) and equivalent(a[half:], b[half:])):
        return True

    if (equivalent(a[:half], b[half:]) and equivalent(a[half:], b[:half])):
        return True

    return False

2 个答案:

答案 0 :(得分:7)

equivalent的4次递归调用中的每次调用都会将输入数据量减少2倍。因此,假设ab具有相同的长度,isEqual 1}}具有线性时间复杂度,我们可以为整体复杂性构建递归关系

enter image description here

C有些不变。我们可以通过反复替换和发现模式来解决这种关系:

enter image description here

求和的上限是mlen(a) 奇数时会发生停止条件。这可能是N1之间的任何位置,具体取决于N prime分解。在更糟糕的情况下,N是2的幂,因此函数会递归到len(a) = 1,即

enter image description here

答案 1 :(得分:2)

为了增强上述答案,可以使用“主方法”直接计算。主方法仅适用于以下类型的重复。

T(n) = aT(n/b) + f(n) where a >= 1 and b > 1

我们根据f(n)有三种情况,如下所示:

  1. 如果f(n)=Θ(n c ),其中c b a然后T(n)=Θ(n Log b a

  2. 如果f(n)=Θ(n c ),其中c = Log b a,那么T(n)=Θ(n c 记录n)

  3. 如果f(n)=Θ(n c ),其中c>记录 b a然后T(n)=Θ(f(n))=Θ(n c

  4. 在你的情况下,

    我们有a = 4,b = 2,c = 1且c <1。记录 b a

    即。 1&lt; log 2 4

    因此=&gt;案例1

    因此: T(n)=Θ(n Log b a

    T(n)=Θ(n Log 2 4

    T(n)=Θ(n 2

    有关示例的更多详细信息,请参阅wiki

    希望它有所帮助!