P(x,y,z){
print x
if(y!=x) print y
if(z!=x && z!=y) print z
}
此处的普通算法,值x
,y
,z
是从{1,...r}
随r >= 1
随机选择的。
我正在尝试确定此算法的平均大小写复杂度,并根据打印语句的数量来衡量复杂性。
这里最好的情况是T(n)= 1或O(1),当x=y=z
时,概率是1/3。
这里最坏的情况仍是T(n)= 3或当x!=y!=z
时仍为O(1)且概率为2/3。
但是,从数学上推导出平均情况:
样本空间是n个可能的输入,样本空间上的概率是1 / n几率
那么,我该如何计算平均案例复杂度呢? (这是我画空白的地方..)
答案 0 :(得分:1)
您的算法有三种情况:
因此,平均情况可以计算为:
1/r + 1/r * (1/(r - 1)) + 1/r * (1/(r - 1))*(1/(r - 2)) * 3 == O(1)
编辑:上面的表达式是 O(1),因为整个表达式都是由常量组成的。
答案 1 :(得分:0)
平均情况介于最佳和最差情况之间;对于这个特殊问题,这就是你所需要的(至少就大O而言)。
答案 2 :(得分:0)
1)你能否至少对一般情况进行编程?写下(伪)代码并对其进行分析,这可能很明显。实际上,您可能会将其编程为次优,并且可能存在更好的解决方案。这是非常典型的,它是计算机科学数学终端解谜的一部分,例如:如果你只想尝试编码,很难自己发现快速排序。
2)如果可以,则运行蒙特卡罗模拟并绘制结果图。即,对于N = 1,5,10,20,......,100,1000或任何样本是现实的,运行10000次试验并绘制平均时间。如果你很幸运X =样本大小,Y =平均。在该样本量下10000次运行的时间将绘制出一条漂亮的线,或抛物线,或一些易于模型的曲线。
所以我不确定你是否需要帮助(1)查找或编码算法或(2)分析它,你可能想修改你的问题来指定它。
答案 3 :(得分:0)
P(x,y,z){
1.print x
2.if(y!=x)
3. print y
4.if(z!=x && z!=y)
5. print z
}
第1行:持续时间 c1 (c1:print x)
第2行:持续时间 c2 (c2:条件测试)
第3行:持续时间 c3 (c3:打印y)
第3行:持续时间 c4 (c4:条件测试)
第4行:持续时间 c5 (c5:print z)
分析:
除非你的函数P(x,y,z)不依赖于输入大小“r”,程序将花费一定的时间来运行,因为时间:T(c1)+ T(c2 + c3)+ T(c4 + c5) ..累计函数P(x,y,z)的大O是 O(1)其中1是常数并且表示自T(c1),T(c2),... T(c5)以来的恒定时间量都需要恒定的时间..并且说函数P(x,y,z)是否从1迭代到r ...然后您的代码段的复杂性会发生变化,并且会根据输入大小而变化,即“r”
最佳案例:O(1)
平均情况:O(1)
最坏情况:O(1)