【问题标题】:What is time complexity and how to find it? [duplicate]什么是时间复杂度以及如何找到它? [复制]
【发布时间】:2013-04-20 09:40:16
【问题描述】:

我已经阅读了很多资源,但仍然无法理解什么是时间复杂度。我阅读的资源是基于各种公式的,我知道O(n) 用于表示时间复杂度,但我不知道如何。谁能以一种可以理解的清晰方式向我解释这个原则。

【问题讨论】:

标签: java time-complexity


【解决方案1】:

参考:How to Calculate Time complexity algorithm

我找到了一篇与如何计算任何算法或程序的时间复杂度

相关的好文章

计算时间复杂度的最常用指标是大 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除的次数成正比。这是因为算法在每次迭代时将工作区域分成两半。 p>

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个对数循环(迭代或递归)组成,因此该算法是线性和对数的结合。

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

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

编辑:

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

  1. 对于每个步骤,您在前半部分和后半部分递归调用算法。
  2. 因此 - 所需的总步数是如果您将问题每步除以 2 所需要的从 n 到 1 的次数。

等式是:n / 2^k = 1。由于 2^logn = n,我们得到 k = logn。所以算法需要的迭代次数是O(logn),这将使算法O(nlogn)

此外,big O 表示法使我们易于计算 - 与平台无关的近似算法将如何渐近(在无穷远处)表现,这可以将算法的“家族”划分为其复杂性的子集,让我们轻松比较它们。

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

【讨论】:

  • 快速排序仅平均 O(N * log ( N ))。最坏的情况是 O(N²)。例如。合并排序、堆排序有最坏情况O(N * log (N))。但在现实生活中快速排序仍然更快
  • 快速排序最坏情况的时间复杂度发生在当枢轴递归地产生两个区域一个大小为 1 的元素和另一个大小为 (n-1) 的元素时。而平均情况发生在枢轴选择两个区域使得两个区域生成的大小为 n/2。
  • Most time 计算算法的时间复杂度 意思是:最坏情况下的时间复杂度是多少。我只想指出 O(N * log ( N )) 并不是快速排序的最坏情况复杂度,但是存在具有这种最坏情况复杂度的排序算法。无法确保在快速排序中找到“好的”枢轴。
  • @MrSmith42 是的,你就在那儿
  • @Vinayak 所以说如果你有很多类似这样的代码的java应用程序:public String getName(int idx) { return NAME_LIST[idx];}是java新手,我认为这些将被视为简单语句?这次idx是数字,但我还是不明白如何应用公式并计算此类代码的时间复杂度?
【解决方案2】:

您还应该阅读Amortized Analysis 以完全理解时间复杂度的概念。摊销分析用于通过考虑所有操作来确定算法性能的最坏情况界限。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2014-03-30
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多