算法实验运行时间与理论运行时间函数的比较

时间:2014-11-18 21:48:08

标签: java algorithm complexity-theory time-complexity

我正在编写简单的算法,用于比较整数的两个向量a1和a2是否为字谜(它们包含不同顺序的相同元素)。例如{2,3,1}和{3,2,1}是字谜,{1,2,2}和{2,1,1}不是。

这是我的算法(它非常简单):

1. for ( i = 1; i <= a1.length; i++ )
 1.1. j = i
 1.2. while ( a1[i] != a2[j] )
  1.2.1. if ( j >= a1.length )
   1.2.1.1. return false
  1.2.2. j++
 1.3. tmp = a2[j]
 1.4. a2[j] = a2[i]
 1.5. a2[i] = tmp
2. return true

比较两个字谜的表示: enter image description here

让我们考虑运行时间的函数取决于矢量大小T(n),当它们是两种情况下的字谜时:pesimistic和average。

  • 悲观

当向量没有重复元素且向量的顺序相反时发生。

enter image description here

c3,c4和c6的多重性是:

enter image description here

所以pesimistic运行时的最终函数是: enter image description here

等式(3)可以用更简单的形式编写: enter image description here

  • 平均

当向量没有重复元素且向量是随机顺序时发生。这里的关键假设是:平均而言,我们在a1中找到了相应的元素,其中一半没有排序a2(c3,c4和c6中的j / 2)。

enter image description here

c3,c4和c6的多重性是: enter image description here

平均运行时间的最终功能是: enter image description here

以更简单的形式书写: enter image description here


以下是我的最终结论和问题:

等式(8)中的b2比等式(4)中的a2小两倍 enter image description here

我是否正确(9)?

我认为在矢量大小函数中绘制算法的运行时间可以证明方程(9),但它不是: enter image description here

在图中我们可以看到比率a2 / b2是1.11,而不是像等式(9)那样是2.上图中的比率远离预测。 那是为什么?

2 个答案:

答案 0 :(得分:1)

我发现了我的问题!

这不是我在平均情况的假设中所考虑的:“我们从a1中找到相应的元素,一半没有排序a2(j / 2)”。它隐藏在悲观的情况下。

当向量a2与a1的顺序与第一个元素移位到结尾的顺序相同时,就会出现正确的悲观情景。例如:

a1 = {1,2,3,4,5}

a2 = {2,3,4,5,1}

我通过实验测量了我的算法的运行时间和悲观情况的新假设。结果如下:

enter image description here

a2 / b2的实验比率为:2.03 +/- 0.09

这证明了我的理论功能。

感谢大家和我在一起并试图解决我的琐碎错误!

答案 1 :(得分:0)

您不能假设两种情况下的相同说明将花费相同的时间。 特别是,在你的悲观情况下,分支将始终采用相同的方式,因此分支预测器将做得很好,你不会支付错误预测的惩罚(这可能相当高)​​。

在随机顺序的情况下,分支将更难预测,因此分支指令将花费更长的时间来执行。这可以很容易地解释你看到的差异