以下算法是否具有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
答案 0 :(得分:7)
对equivalent
的4次递归调用中的每次调用都会将输入数据量减少2倍。因此,假设a
和b
具有相同的长度,isEqual
1}}具有线性时间复杂度,我们可以为整体复杂性构建递归关系:
C
有些不变。我们可以通过反复替换和发现模式来解决这种关系:
求和的上限是m
? len(a)
奇数时会发生停止条件。这可能是N
和1
之间的任何位置,具体取决于N
的 prime分解。在更糟糕的情况下,N
是2的幂,因此函数会递归到len(a) = 1
,即
答案 1 :(得分:2)
为了增强上述答案,可以使用“主方法”直接计算。主方法仅适用于以下类型的重复。
T(n) = aT(n/b) + f(n) where a >= 1 and b > 1
我们根据f(n)有三种情况,如下所示:
如果f(n)=Θ(n c ),其中c
如果f(n)=Θ(n c ),其中c = Log b a,那么T(n)=Θ(n c 记录n)
如果f(n)=Θ(n c ),其中c>记录 b a然后T(n)=Θ(f(n))=Θ(n c )
在你的情况下,
我们有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。
希望它有所帮助!