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

这个问题在这里已经有了答案:

  • 大O,你如何计算/估计它? 22个答案
  • 如何找到算法的时间复杂度10个答案

  • 参考:如何计算时间复杂度算法

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

    计算时间复杂度的最常用指标是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个循环(迭代或递归)组成,因此该算法是线性和对数的组合。

    一般来说,在一个维度上对每个项目做一些事情是线性的,对于每个维度来说,二维维度中的每个项目都是二次的,而将工作区域分成两半是对数的。 还有其他的大O措施,如立方体,指数和平方根,但它们几乎不常见。 大O符号被描述为O()其中是度量。 快排算法将被描述为O(N * log(N))。

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

    编辑:

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

  • 对于每一步,您都会在第一和第二半上递归地调用算法。
  • 因此 - 所需步骤的总数是如果将问题每步分解2次,则从n到1所需的次数。
  • 方程为:n / 2 ^ k = 1。由于2 ^ logn = n,我们得到k = logn。 所以算法需要的迭代次数是O(logn),这将使算法O(nlogn)

    此外, 大O符号使我们很容易计算 - 平台独立近似算法如何在渐近(无穷远)下运行,这可以将算法的“族”划分为复杂度的子集,并让我们在它们之间轻松进行比较。

    你也可以查看这个问题以获得更多的阅读:使用递推方程的程序的时间复杂度


    您还应该阅读关于Amortized Analysis以充分理解时间复杂性的概念。 通过考虑所有操作,摊销分析被用来对算法的性能产生最坏的界限。

    下面给出维基百科文章的链接,

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

    链接地址: http://www.djcxy.com/p/39343.html

    上一篇: What is time complexity and how to find it?

    下一篇: What is the time complexity of my function?