程序的最坏情况或平均情况如何依赖于日志功能?日志的基础如何发挥作用?
答案 0 :(得分:5)
当您将问题拆分为k
部分,每个部分大小为n/k
,然后对其中某些部分进行“递归”(或模仿递归)时,会显示对数因子。
一个简单的例子是以下循环:
foo(n):
while n > 0:
n = n/2
print n
上面会打印n, n/2, n/4, .... , 1
- 并且有O(logn)
个这样的值。
上述程序的复杂程度为O(logn)
,因为每次打印都需要不间断的时间,n
O(logn)
的数量{}}
如果您正在寻找“真实生活”示例,请在快速排序中(为简单起见,我们假设分成两半),您将大小为n
的数组拆分为两个大小为n/2
的子数组,然后你对它们进行递归 - 并在每一半上调用算法。
这使得复杂功能:
T(n) = 2T(n/2) + O(n)
来自master theorem,这是Theta(nlogn)
。
类似地,在二进制搜索上 - 您将问题分成两部分,并仅在其中一部分上进行递归:
T(n) = T(n/2) + 1
这将在Theta(logn)
基础不是大O复杂性的因素,因为
log_k(n) = log_2(n)/log_2(k)
对于任何常量k
,和log_2(k)是常量。