使用分而治之的数组的第二大元素

时间:2019-06-22 13:54:33

标签: c arrays recursion time-complexity divide-and-conquer

我编写了此函数来查找数组的第二大元素,但是我对其时间复杂度有些怀疑。 if条件是否具有θ(1)或增加了递归调用的时间复杂度?

从实验的角度出发,它不应大于具有划分和征服策略时间复杂度的最大最大值。

int secondmax(int arr[], int first , int last){
   if(first+1==last) return arr[first];
   int mid= first +(last-first)/2;
   int left = secondmax(arr, first, mid);
   int right = secondmax(arr, mid, last);
   if(  (left > right ? left : right) > max1){
      max2=max1;
      max1= left > right ? left : right;
   }

    else if((left > right ? left : right) > max2  &&     (left > right ? left : right) != max1){
       max2= left > right ? left : right;

   }
   return left > right ? left : right;
}

ps max1,max2是全局变量,可能我可以削减max1

1 个答案:

答案 0 :(得分:1)

就递归调用而言,

if在时间复杂度方面不是重要的贡献者。对于您的算法,最重要的是使用递归对时间复杂度的贡献进行数组拆分。对您的算法进行空运行可以使您看到您的算法将遵循以下递归方程: T(n)= 2T(n / 2)+θ(1)。请注意,此处的θ(1)表示您在2个递归函数调用之后编写的指令所消耗的恒定时间单位。 θ(1)与否相同。递归调用后,指令数不变。如果您使用的循环的运行时间取决于输入数组的长度,则可以代替图θ(1)而不是θ(n)。

那么,θ(1)和θ(n)如何影响算法的复杂度?只需在递归方程中使用旧的Master's Method即可确定。

对于θ(1),您的等式为:T(n)= 2T(n / 2)+θ(1),对于θ(n),它变为T(n)= 2T(n / 2) +θ(n)。 在两种情况下应用了大师定理后,您将获得最终时间复杂度,第一个为θ(log n),第二个为θ(n [log n])。因此,这是您需要记住的主要区别。