繁体   English   中英

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

[英]How do you test speed of sorting algorithm?

我想对排序算法的速度进行实证测试。 最初,我是随机生成的数据,但这似乎不公平,并弄乱了一些算法。 例如,对于快速排序,枢轴选择很重要,而选择枢轴的一种方法是始终选择第一个,而另一种方法则是选择第一个,最后一个和中间元素的中位数。 但是,如果数组已经是随机的,则选择哪个枢轴都没有关系,因此从这个意义上讲,这是不公平的。 您如何解决这个问题?

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

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

虽然某些算法平均而言要比其他算法好得多,但它们在解决方案中各有其独特的目的。

尽管没有数值数据,但我正在描述的过程可以在sorting-algorithms.com上的有趣动画中看到

您的大多数问题已经回答,所以我将回答您的最后一个问题,即排序算法如何利用给定数据进行部分排序这一事实。 一个很好的例子是修改的合并排序,其中首先扫描数据以识别部分排序的数据的所有子数组,然后从较短的子数组开始将这些子数组合并在一起。 与不使用部分分类信息的其他算法相比,此方法可以显着提高速度。

您想对排序算法进行经验比较。 很好,结果通常具有教育意义。

但是,经验测试的工作方式是,您决定一堆您认为值得衡量的事情,然后运行实验并对其进行衡量。

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

如果您决定关心最坏的情况,则必须做更多的工作。 有N! 生成长度为N的排列的方法,当N大时,太多了。 因此,您必须分析算法以找出哪种数据会引发最坏的情况,并编写生成此类数据的生成器。

通常,您这样做是因为您关心给定的排序算法在特定用例中的执行情况。 因此,您会生成大量针对您的用例的典型数据,并通过各种分类算法将其输入。 然后,以适合您的设置的方式处理数字。

特别是对于排序,您始终可以在将数据提供给排序算法之前对其进行随机打乱。 (这些天来,您需要以一种对缓存友好的方式对其进行加扰,但这并不是那么棘手。)因此,平均运行时间可能是一个合理的衡量标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM