对数函数的时间复杂度

时间:2015-04-21 11:38:38

标签: algorithm data-structures time-complexity

程序的最坏情况或平均情况如何依赖于日志功能?日志的基础如何发挥作用?

1 个答案:

答案 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)是常量。