这个函数被调用了多少次?

时间:2012-12-17 21:05:22

标签: algorithm complexity-theory

Algorithm(a-array, n-length):
      for(i=2;i<=n;i++)
         if(a[1]<a[i]) Swap(a,1,i);  
      for(i=n-1;i>=2;i--)
         if(a[n]<a[i]) Swap(a,n,i);

我有兴趣确定在最坏的情况下在上面的代码中调用Swap的次数,所以我有一些问题。

那里最糟糕的情况是什么?

  • 如果我只有第一个for循环,可以说这个算法的最坏情况是数组 a 已按升序排序,Swap将被称为n-1倍。
  • 如果我只有第二个循环,最坏的情况也是 a 已经排序,但这次,顺序会下降。这意味着如果我们考虑第一个最坏的情况,Swap将不会在第二个循环中被调用,反之亦然,即在每次迭代中都不能在两个循环中调用它。

我现在该怎么办?如何将那两个彼此相反的最坏情况结合起来? 最坏的情况意味着我希望尽可能多的交换调用。 :)

P.S。我看到复杂度是O(n),但我需要尽可能精确地估计Swap执行了多少次。

编辑1:Swap(a,i,j)交换元素a[i]a[j]

2 个答案:

答案 0 :(得分:1)

设s和r是原始数组中最大元素和次大元素的位置。在第一个循环结束时: -  最大的将来到第一位。  如果r <那么下一个最大的位置现在将是r。如果r>它仍然是r。 在第二个循环结束时,最大元素的下一个元素将在结尾处 对于第一个循环,固定s的最坏情况是当所有元素都是按升序排列时。互换的数量是s。 对于第二个循环,如果最大的下一个更接近数组的开头,则发生最坏的情况。当r

例如A = [1 2 5 7 3 4]这里最多为elemnt 7它是递增的并且在降序之后 掉期数= 5

答案 1 :(得分:0)

第一个循环的最坏情况是每个 a i 小于 a j ,1≤ i &lt; j n 。在这种情况下,每个 a j a 1 交换,以便在结束 a 1 是最大的数字。此交换最多只能发生 n -1次,例如:

[1,2,3,4,5] ⟶ [5,1,2,3,4]

同样,第二个循环的最坏情况是每个 a i 大于 a < sub> j ,其中2≤ i &lt; j n 。在这种情况下,每个 a i a n 交换以便最后 a n 是子数组的最大数量 a <子> 2 ,..., <子> 名词。此交换最多只能发生 n -2次,例如:

[x,4,3,2,1] ⟶ [x,3,2,1,4]

现在棘手的部分是结合两个条件,因为两个循环中Swap调用的条件是互斥的:对于任何一对 a i a j ,其中1≤ i &lt; j n a i &lt; a j ,第一个循环将调用Swap。但是对于任何这样的对,第二个循环不会调用Swap,因为它期望相反: a i &gt; <子> Ĵ

因此Swap次调用的最大数量为 n -1。