【问题标题】:How do you test speed of sorting algorithm?你如何测试排序算法的速度?
【发布时间】:2014-08-13 20:12:50
【问题描述】:

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

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

【问题讨论】:

  • 向算法抛出一堆数据,看看它是如何反应的。考虑随机和退化的情况。 (虽然询问 哪里 获取此类数据是要求异地资源..)
  • 将已排序的数据放入排序算法中始终是现实世界的可能性。
  • 1) 发布它。 2)对它的性能提出一些古怪的说法。 3) 收集整理所有的批评意见。
  • @HotLicks 对于第 2 步,不要忘记在这些声明中包含“网络规模”。古怪固然不错,但含糊其辞同样重要。
  • @Celeritas 根本不会使算法失效,也不公平。将随机数据假设为 一个 输入集是完全合理的。

标签: java algorithm sorting data-analysis


【解决方案1】:

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

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

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

【讨论】:

  • 应该生成并保存数据集,并且算法在相同的副本上运行; “随机”不应该意味着为每次运行生成不同的集合。
  • 如何对一个度量进行部分排序?如何实现它?
  • @Celeritas 通过创建部分排序的数据集。也许编写一个简短的脚本来交换排序数组中的几个单元格以创建一些混合就可以了。
  • @chrylis 感谢您的澄清。这就是我的意思,但我没有意识到这并不完全清楚。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    不过,经验测试的工作方式是,你决定一堆你认为值得衡量的东西,然后运行实验并衡量它们。

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

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

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

    特别是对于排序,您始终可以在将数据输入排序算法之前随机打乱数据。 (现在你会希望以一种对缓存友好的方式对其进行加扰,但这并不太棘手。)所以平均运行时间可能是一个合理的衡量标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多