你如何测试排序算法的速度?

时间:2014-08-13 20:12:50

标签: java algorithm sorting data-analysis

我想对排序算法的速度进行实证检验。最初我随机生成数据,但这似乎是不公平的,搞砸了一些算法。例如,对于快速排序,枢轴选择很重要,选择枢轴的一种方法是始终选择第一个,另一种方法是选择第一个,最后一个和中间元素的中位数。但是如果阵列已经是随机的那么选择哪个枢轴并不重要,所以从这个意义上来说它是不公平的。你是如何解决这个问题的?

我在哪里可以获得用于测试排序算法的真实世界样本?我在实际场景中听说过数据经常被部分排序,但这些信息如何在排序算法中使用?

3 个答案:

答案 0 :(得分:4)

为了测试排序算法的效率,通常使用多个数据集并单独计时。完全随机,部分排序,完全排序和排序但反向数据通过相同的算法运行,以在每个字段中得出合适的平均值。这创造了最公平的测试环境。

虽然有些算法平均比其他算法好得多,但它们在解决方案中都有其独特的用途。

虽然没有数字数据,但我所描述的过程可以在sorting-algorithms.com的有趣动画中看到。

答案 1 :(得分:1)

您的大部分问题已经得到解答,因此我将回答您的最后一个问题,即排序算法如何利用给定数据部分排序的事实。一个很好的例子是修改的合并排序,其中最初扫描数据以识别部分排序数据的所有子阵列,然后从较短的子阵列开始将这些子阵列合并在一起。与其他不使用部分排序信息的算法相比,此方法可以大大加快速度。

答案 2 :(得分:1)

您想要对排序算法进行实证比较。这很好,结果通常很有教育意义。

然而,经验测试的方法是,你决定了一些你认为值得衡量的事情,然后你运行实验并测量它们。

如果您决定关心排序算法的平均情况,则会生成一堆随机数据并计算运行时间的平均值。

如果您认为自己关心的是最糟糕的表现,那么您必须做更多的工作。有N!生成长度为N的排列的方法,当N很大时,这个排列太多了。因此,您必须分析算法,以确定哪种数据会引发最坏的情况,并编写生成此类数据的生成器。

通常你会这样做,因为你关心给定的排序算法在你的特定用例中的表现。因此,您可以为您的用例生成大量典型数据,并通过各种排序算法提供数据。然后以适合您设置的方式处理数字。

特别是对于排序,您可以随时对数据进行随机加扰,然后再将其提供给排序算法。 (现在你想要以对缓存友好的方式加扰它,但这并不太棘手。)因此平均运行时间可能是一个合理的测量方法。