平凡案例复杂性的简单算法

时间:2012-05-20 23:03:11

标签: algorithm big-o time-complexity average

P(x,y,z){
    print x
    if(y!=x) print y
    if(z!=x && z!=y) print z
}

此处的普通算法,值xyz是从{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几率 那么,我该如何计算平均案例复杂度呢? (这是我画空白的地方..)

4 个答案:

答案 0 :(得分:1)

您的算法有三种情况:

  1. 所有三个数字相等。这个概率是 1 / r ,因为 一旦选择 x y z 只有一个选择。成本 对于这种情况是1。
  2. x!= y ,但 x == z y == z 。这个概率是1 / r *(1 /(r - 1))* 1/2, 因为一旦你选择了x,你只有y为-1的选择,而z只能是 这两个选择之一。费用= 2.
  3. 所有三个数字都是截然不同的。这三者截然不同的可能性是 1 / r *(1 /(r - 1))*(1 /(r - 2))。费用= 3.
  4. 因此,平均情况可以计算为:

    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)