算法的最坏情况时间复杂度

时间:2008-12-01 16:13:50

标签: algorithm language-agnostic complexity-theory big-o

什么是最坏情况时间复杂度t(n): - 我正在读这本关于算法的书,并作为一个例子 如何获得T(n)....就像选择排序算法


就像我正在处理selectionSort(A [0..n-1])

一样
//sorts a given array by selection sort
//input: An array A[0..n - 1] of orderable elements.
//output: Array A[0..n-1] sorted in ascending order

让我写一个伪代码

for i <----0 to n-2 do
  min<--i
for j<--i+1 to n-1 do
   ifA[j]<A[min] min <--j
swap A[i] and A[min]

--------我也会在C#中写它---------------

private int[] a = new int[100];

// number of elements in array
private int x;

// Selection Sort Algorithm
public void sortArray()
{
  int i, j;
  int min, temp;

  for( i = 0; i < x-1; i++ )
  {
    min = i;

    for( j = i+1; j < x; j++ )
    {
      if( a[j] < a[min] )
      {
        min = j;
      }
    }

    temp = a[i];
    a[i] = a[min];
    a[min] = temp;
  }
}

==================

现在如何获得t(n)或已知的最坏情况时间复杂度

6 个答案:

答案 0 :(得分:13)

那将是O(n ^ 2)。

原因是你有一个for循环嵌套在另一个for循环中。内部for循环的运行时间O(n)发生在外部for循环的每次迭代中,也是O(n)。这些中的每一个单独为O(n)的原因是因为它们在给定输入的大小的情况下花费线性时间量。输入越大,线性刻度所需的时间越长,n。

计算数学,在这种情况下是微不足道的,只需要通过外部循环的复杂性来复制内部循环的复杂性。 n * n = n ^ 2。因为记住,对于外循环中的每个n,你必须再次为内部做n。澄清:每个n次n次。

O(n * n)。

为O(n ^ 2)

答案 1 :(得分:3)

顺便说一句,你不应该混淆复杂性(用big-O表示)和T函数。 T函数是算法在给定输入时必须经过的步数。

因此,T(n)的值是实际的步数,而O(某物)表示复杂性。通过传统的符号滥用,T(n)= O(f(n))意味着函数T(n)与另一个函数f(n)具有至多相同的复杂度,这通常是最简单的函数其复杂性等级。

这很有用,因为它可以让我们专注于全局:我们现在可以通过查看它们“从长远来看”的执行方式,轻松地比较两种可能具有非常不同的T(n)函数的算法。 / p>

答案 2 :(得分:1)

@ sara jons The slide set that you've referenced - and the algorithm therein

正在测量for循环中每个原语/原子操作的复杂性

for(j=0 ; j<n ; j++)
{
    //...    
}

幻灯片将此循环评为2n + 2,原因如下:

  • 初始设定的j = 0(+1 op)
  • j的比较&lt; n(n ops)
  • j ++(n ops)的增量
  • 检查j&lt; n(+1 op)
  • 其次,for循环中的比较

    if(STudID == A[j])      
        return true;
    

    这被评为n ops。因此,如果加上+1 op,n ops,n ops,+ 1 op,n ops = 3n + 2复杂度,结果就是如此。所以T(n)= 3n + 2

    认识到T(n)与O(n)不同。

    答案 3 :(得分:1)

    这里有另一个博士学位闪回。

    首先,T函数只是算法执行任务所花费的时间量(通常在一些步骤中,其中更多是以下)。什么是“步骤”,在某种程度上由使用定义;例如,通常计算排序算法中的比较次数,但搜索算法中搜索的元素数量。

    当我们谈论算法的最坏情况时,我们通常用“big-O表示法”来表达。因此,例如,您听到冒泡排序需要O(n²)时间。当我们使用大O表示法时,我们真正说的是某些函数的增长 - 在这种情况下为T - 并不比其他函数的增长快一个常数。那是

    T(n)= O(n²)

    表示任何 n ,无论多大,都有一个 T(n)≤kn²的常数 k 。这里有点困惑的一点是我们以重载的方式使用“=”符号:它并不意味着数字意义上的两个相等,只是我们说的是< em> T(n) 以kn²为界。

    在扩展问题的示例中,看起来他们正在计算for循环和测试中的比较次数;能够看到他们正在回答的背景和问题是有帮助的。但无论如何,它表明了我们为什么喜欢big-O表示法: W(n)这里是 O(n)。 (证明:存在一个常数k,即5, W(n)≤k(3n)+2。它遵循 O(n)的定义。)

    如果您想了解更多相关信息,请参阅任何好的算法文本,例如,Introduction to Algorithms,Cormen 等。

    答案 4 :(得分:0)

    编写伪代码以从哈希表中搜索,插入和删除学生信息。计算最佳和最差情况时间复杂度

    答案 5 :(得分:0)

    就循环而言,

    3n + 2是正确的答案。在循环的每个步骤中,完成3个原子操作。 j ++实际上是两个操作,而不是一个。和j