使用以秒为单位的运行时间的排序算法的比较

时间:2014-03-23 06:31:51

标签: sorting time comparison iteration

我设计了一个测试,以便将排序算法的不同运行时间与插入排序,冒泡排序,快速排序,选择排序和shell排序进行比较。我使用本网站http://warp.povusers.org/SortComparison/index.html中的测试进行了测试,但我修改了测试。

我设置了一个生成数据的测试管理器程序服务器,测试管理器将它发送给运行不同算法的客户端,因此他们对相同的数据进行排序,没有偏见。

我注意到插入排序,冒泡排序和选择排序算法确实运行了很长时间(大约超过15分钟),只是为了对大小为100,000和1,000,000的一个给定数据进行排序。 所以我改变了这两种数据大小的每个测试用例的运行次数。我对100,000的原始运行量为500,但我将其减少到15,而1,000,000是100,我把它减少到3。

现在我的教授怀疑我为什么减少这么多的可信度,但正如我已经观察到排序特定数据分布的运行时间只有很小的百分比,这就是为什么我仍然发现即使我已经将它减少到那么多,我仍然可以近似该算法的特定测试用例的平均运行时间。

我现在的问题是,我的假设错了吗?机器是否有时会显着改变运行时间(> 50%的变化),例如,如果第一次运行会给它0.3毫秒,反复排序相同的数据,第二次运行会产生与运行时相同的差异1.5秒?因为根据我的观察,考虑到相同类型的测试分布(例如完全随机,完全分类,完全颠倒),运行时间不会发生很大变化。

3 个答案:

答案 0 :(得分:0)

绝对可以。您需要各种“随机”样本才能得出有关人口的正确结论。

以这种方式看待它。在美国调查10万人的政治立场需要很长时间。如果我们将样本量减少到100人以便更快地完成它,我们不仅会降低最终结果的精确度(小数点后2位而不是5位),我们还会提供样本成员具有特定值的更大机会。偏见(3xx,000,000中有100人认为同样的方式比同样的3xx,000,000中的10万人更有可能)。

答案 1 :(得分:0)

你的教授是对的,但他没有提供我在这里提到的一些细节:

  1. 采样问题:你生成一些随机数并将它们提供给你的排序方法是正确的,但是有一些测试用例确实你有偏见导致几乎所有的随机函数都偏向某些范围(特别是当前的机器状态或时间),因此您应该使用越来越多的测试用例来对随机性更加自信。
  2. 机器状态:假设您提供了完美的数据(完全代表均匀分布),计算机等机电装置的性能可能会因不同情况而有所不同,因此您应该尝试相当长的时间来平滑这些现象的影响。
  3. 注意:在高级技术报告中,您应该为通过统计分析得出的答案提供置信系数,并逐步证明,但如果您不需要更确切地说,只需增加这些:

    1. 数据的大小

    2. 测试次数

答案 2 :(得分:0)

您正在寻找的是一种衡量实验中错误的方法。我最喜欢的关于主题的书是泰勒的错误分析,第4章有你需要的内容,我将在这里总结。

您需要计算平均值或SDOM的标准误差。首先计算平均值和标准差(公式在维基百科上非常简单)。您的SDOM是标准偏差除以测量次数的平方根。假设您的时序具有正态分布(应该是),则SDOM值的两倍是指定+/-错误的常用方法。

例如,假设您运行排序算法5次并获得以下数字:5,6,7,4,5。然后平均值为5.4,标准差为1.1。因此SDOM是1.1 / sqrt(5)= 0.5。所以2 * SDOM = 1.现在你可以说算法朗姆酒时间是5.4±1。你教授可以确定这是否是测量中可接受的误差。请注意,当你读取更多读数时,你的SDOM,即正或负误差,与N的平方根成反比。两次SDOM间隔有95%的概率或置信度,即真值位于接受标准的区间内。

此外,您最有可能希望通过测量 CPU时间而不是简单计时器来衡量性能。现代CPU太复杂,具有各种缓存级别和流水线优化,如果您使用计时器,最终可能会得到不太准确的测量。有关CPU时间的更多信息,请参阅此答案:How can I measure CPU time and wall clock time on both Linux/Windows?