【问题标题】:Linear time when running merge sort and quick sort运行合并排序和快速排序时的线性时间
【发布时间】:2014-08-26 11:48:11
【问题描述】:

据我从我的大学了解到,已证明对随机数据进行排序的基于比较的算法的下限是 Ω(nlogn)。我也知道 Heapsort 和 Quicksort 的平均情况是 O(nlgn)。

因此,我尝试绘制这些算法对一组随机数据进行排序所需的时间。

我使用了在 Roseta Code 上发布的算法:quicksortheapsort。当我尝试绘制每个人对多达 100 万个数字进行随机数据排序所需的时间时,我得到了以下看起来是线性的图表:

您还可以找到我从here 运行堆排序得到的结果。 另外你还可以找到我从here运行快速排序得到的结果

但是,在运行冒泡排序时,我确实得到了 O(n^2) 时间复杂度,如下图所示:

这是为什么?我可能在这里遗漏了什么?

【问题讨论】:

标签: algorithm sorting complexity-theory time-complexity


【解决方案1】:

在这种规模下,肉眼无法看到差异:

使用您的 HeapSort 结果(1000000 个条目需要 600 毫秒),这里有一个 O(n) 函数(绿色)和一个 O(n log n) 函数(红色): (来自http://fooplot.com/plot/gnbb0vdgno

这张图中的两个函数分别是:

  • y = 600/1000000 * x 绿色
  • y = 1/(10000 log(10)) * x*log(x) 红色

(请注意,这些函数具有非常不同的常数缩放因子,但当然这些在 Big-O 表示法中并不重要。)

但是,仅仅因为它们在图表中很难看到,并不意味着它们无法区分。

如 cmets 中所述,您的主要选择是更大的数据集或较慢的比较函数。大多数排序算法将允许您指定一个比较函数,在正常情况下,它不应该改变 O() 时间复杂度。 (但要注意非传递比较函数)

如果这是不可能的,并且您只想将算法作为黑盒进行线程化,您可以简单地重复实验并对结果进行平均,直到噪声低到足以区分这两条曲线。

要获得适当的“理想”n log n 曲线以与您的平均数据进行比较,您需要求解方程 y = a*x * log(x); y=MAXIMUM_TIME; x=MAXIMUM_INPUT_LENGTH;,例如使用 Wolfram Alpha


这里有一点很重要,即使这些曲线看起来很相似,但这并不意味着假设的线性排序算法的运行时间对于少于一百万个条目是不值得的。如果你设法想出一个与 n log n 算法具有相同常数因子的线性排序算法,曲线将如下所示:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2012-03-22
    • 1970-01-01
    • 2021-01-19
    • 2012-08-26
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多