我编写了此函数来查找数组的第二大元素,但是我对其时间复杂度有些怀疑。 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
答案 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])。因此,这是您需要记住的主要区别。