我需要使用求和/西格玛符号来预测算法相对于其输入大小的平均情况效率,以得出最终答案.许多资源使用求和来预测最坏情况,我找不到解释如何预测平均情况的人,所以逐步回答是值得赞赏的.
该算法包含一个嵌套的for循环,其中基本操作位于最内层循环内:
[代码编辑]
编辑:执行基本操作它将始终在第二个for循环内执行,如果已输入第二个for循环,并且没有break或return语句.但是:第一个for循环的结尾有一个return语句,它依赖于基本操作中产生的值,因此数组的内容确实会影响每次运行算法执行基本操作的总次数.
传递给算法的数组具有随机生成的内容
我认为预测的平均案例效率是(n ^ 2)/ 2,使其成为n ^ 2增长的顺序/ n ^ 2的大Theta,但我不知道如何使用求和在理论上证明这一点.
答案非常感谢!
最佳答案 TL; DR:如果“基本操作”复杂度为Θ(1)且没有返回,中断或转到运算符,则平均情况下的代码复杂度为Θ(n²).
说明:平均大小写复杂度只是在给定输入大小的情况下对代码中操作数的期望.
假设T(A,n)是您的代码在给定大小为n的数组A时执行的一些操作.很容易看出来
T(A, n) = 1 + // int k = ceil(size/2.0);
n * 2 + 1 + // for (int i = 0; i < size; i++){
n * (n * 2 + 1) + // for(int j = 0; j < size; j++){
n * n * X + // //Basic operation
1 // return (some int);
其中X是“基本操作”中的一些操作.正如我们所看到的,T(A,n)不依赖于数组A的实际内容.因此,给定数组大小的预期操作数(这只是所有T(A,n)的算术平均值)对于给定的n),可能的A恰好等于它们中的每一个:
T(n) = T(A, n) = 3 + n * 2 + n * n * (2 + X)
如果我们假设X =Θ(1),则该表达式为Θ(n 2).
即使没有这个假设,我们也可以得到一个估计:如果X =Θ(f(n)),那么你的代码复杂度就是T(n)=Θ(f(n)n²).例如,如果X是Θ(log n),则T(n)=Θ(n²logn)