什么是时间复杂性以及如何找到它?

时间:2013-04-26 09:07:21

标签: java time-complexity

我已经阅读了这么多资源,但仍然难以理解时间复杂性。我读过的资源基于各种公式,我理解O(n)用于表达时间复杂度,但我不知道如何。请有人以一种可以理解的明确方式向我解释这个原则。

2 个答案:

答案 0 :(得分:27)

参考:How to Calculate Time complexity algorithm

我发现了一篇与如何计算任何算法或程序的时间复杂度相关的好文章

计算时间复杂度的最常用指标是Big O表示法。这消除了所有常数因子,因此当N接近无穷大时,可以相对于N估计运行时间。一般来说,你可以这样想:

statement;

不变。语句的运行时间不会因 N 而改变。

for ( i = 0; i < N; i++ )
     statement;

是线性的。循环的运行时间与N成正比。当N加倍时,运行时间也会增加。

for ( i = 0; i < N; i++ ) {
  for ( j = 0; j < N; j++ )
    statement;
}

是二次的。两个循环的运行时间与N的平方成正比。当N加倍时,运行时间增加 N * N.

while ( low <= high ) {
  mid = ( low + high ) / 2;
  if ( target < list[mid] )
    high = mid - 1;
  else if ( target > list[mid] )
    low = mid + 1;
  else break;
}

是对数。算法的运行时间与N除以2的次数成正比。这是因为算法将工作区域与每次迭代分成两半。

void quicksort ( int list[], int left, int right )
{
  int pivot = partition ( list, left, right );
  quicksort ( list, left, pivot - 1 );
  quicksort ( list, pivot + 1, right );
}

N * log(N)。运行时间由N个循环(迭代或递归)组成,这些循环是对数的,因此算法是线性和对数的组合。

一般来说,对一个维度中的每个项目执行某些操作是线性的,对二维中的每个项目执行某些操作是二次的,将工作区域分成两半是对数的。还有其他Big O指标,如立方,指数和平方根,但它们并不常见。 Big O表示法被描述为O(),其中是度量。快速排序算法将被描述为 O(N * log(N))。

请注意,这些都没有考虑到最佳,平均和最差情况的衡量标准。每个都有自己的Big O表示法。另请注意,这是一个非常简单的解释。 Big O是最常见的,但它也显示得更复杂。还有其他符号,如大欧米茄,小o和大theta。您可能不会在算法分析课程之外遇到它们。 ;)

修改

现在的问题是log n如何进入等式:

  1. 对于每个步骤,您将在第一个和第二个半部分递归调用算法。
  2. 因此 - 所需的步骤总数,如果您将问题的每一步分为2,则从n到1所需的次数。
  3. 等式为:n / 2 ^ k = 1.由于2 ^ logn = n,我们得到k = logn。因此算法所需的迭代次数是O(logn),这将使算法成为O(nlogn)

    此外,大O 符号使我们易于计算 - 平台无关近似算法将如何渐近地(在无穷大处)行为,这可以将算法的“族”划分为其复杂性的子集,让我们在它们之间轻松比较。

    您还可以查看此问题以获取更多信息:Time complexity of the program using recurrence equation

答案 1 :(得分:1)

您还应该阅读Amortized Analysis以完全理解时间复杂性的概念。通过考虑所有操作,摊销分析用于对算法性能进行最坏情况约束。

维基百科文章的链接如下:

http://en.wikipedia.org/wiki/Amortized_analysis