如何合并排序有多个大值?

时间:2016-02-17 20:25:40

标签: algorithm big-o asymptotic-complexity big-theta

What exactly does big Ө notation represent?中,最受欢迎的答案包含以下声明:

  

例如,合并排序最差情况是O(n*log(n))Omega(n*log(n)) - 因此也是Ө(n*log(n)),但它也是O(n^2),因为n^2是渐近的"更大"比它。但是,它 Ө(n^2),因为算法不是Omega(n^2)

我有两个问题:

  1. 您如何确定最坏的情况是O(n*log(n))Omega(n*log(n))。在"算法导论"通过计算每个语句的执行次数和成本来确定插入排序的Theta时间。 OOmega是否有类似的方法?
  2. 如何合并排序的最差情况为O(n*log(n)),还有O(n^2)

3 个答案:

答案 0 :(得分:1)

首先,您问题中的链接并未指出已接受的答案。它指出了最受欢迎的答案。

现在,逐一回答你的问题......

  

如何确定最坏的情况是O(nLog(n))和Ω(nLog(n))。在“算法简介”中,您可以通过计算每个语句的执行次数和执行成本来确定插入排序的Theta时间。 O和Omega有类似的方法吗?

为了让这个答案对每个人都有用,我再次提到与Merge Sort相关的重点。

  • 合并排序是一种分而治之的算法。
  • 你接受一系列数字,你递归地将它分成两半,你分别对这两半进行排序,然后再次递归地合并这两半,从而产生一个排序的数字序列。

采取最简单的案例。如果在该案例中运行合并排序,您会触摸多少个元素 ?借助下图可以轻松实现可视化。每个级别触及的元素是 cn ,总共有 lg n 级别。因此,即使在最简单的情况下,触及的总元素是 cnLog(n)

enter image description here

Image Source

因此,合并排序总是具有最小复杂度≈cnLog(n),并且也写为 合并排序为Ω(nLog( n))的

确定。因此我们理解即使在最简单的算法运行中,我们也必须触摸序列的元素总共 cnLog(n)次。现在......

我们多少次触摸序列的元素?那么,无论如何,Merge Sort的递归树将与上面的完全相同。因此,事实证明,我们将始终将Merge Sort的运行时复杂度与 nLog(n)成比例!这意味着Merge Sort的上限和下限都是 cnLog(n)

因此, Merge Sort的运行时复杂度不仅是Ω(nLog(n))而且是O(nLog(n)) ,这意味着它是 Ө(n日志(N))。

您希望看到(也就是能够可视化)为Merge Sort完成的计算。我希望显示在树的每个级别完成的计算的图形说明是令人满意的。

  

如何合并排序的最坏情况是O(n * log(n))而且O(n ^ 2)?

这很简单,但就像之前的回答一样,我将从基本定义开始,以便答案对每个人都有用。

我喜欢下面的图片来理解这些术语。

enter image description here

Image Source

注意Big-O只强调上面的限制。它并没有打扰到多远。因此,算法具有无限的功能,因为它具有Big-O复杂性。其中最具信息性的是上面的那个,否则每个算法都是O( infinity )。

现在定义清楚,我们可以很容易地说Merge Sort是O(nLog(n))以及O(n 2 )。

在这个解释中,“触摸”一词等同于你在问题中写的“计数次数”。在算法运行期间,每次遇到一个数字时 - 我们都说这个数字被触及了。因此,我们有效地计算数字的触摸来确定算法的复杂性。

答案 1 :(得分:0)

回答第二个问题:

当我们说var group1 = new BsonDocument { { "_id", new BsonDocument{{"ManufacturerId", "$ManufacturerId"},{"DATA_MONTH", "$DATA_MONTH"} }}, { "Count", new BsonDocument { { "$sum", $Count } } } }; var group2 = new BsonDocument { { "_id", "$_id.ManufacturerId" }, { "Statistics ", new BsonDocument { { "$addToSet",new BsonDocument{{"Month", "$_id.DATA_MONTH"},{"Count","$Count"} } } }}, }; var result = database.GetCollection<BsonDocument>("Manufacturers").Aggregate() .Group(group1) .Group(group2) .ToList(); &#39;合并排序时这相当于说&#39; merge sort具有与最多 O(x)&#39;成比例的渐近运行时行为。换句话说:x代表上限。请注意,这与最坏情况和最佳情况无关。您也可以为最佳情况提供上限。

总结:算法可以同时拥有O(x)O(n log n)等,就像数字3同时小于5和10一样。

回答第一个问题:

theta的大多数证明实际上由两个单独的证明组成 - 一个用于下界O(n^2),另一个用于上界Omega(x)。下限度量应用于问题:您说明问题不能在O(x)(渐近)中解决。这通常需要一个不同于上限的证明策略,在那里你证明给定的算法实际上会解决问题并且不会超过x给出的时间(渐近)。

答案 2 :(得分:0)

  

如何合并排序的最差情况为O(n*log(n)),还有O(n^2)

因为符号 f(n) = O(g(n))表示f(n)渐近小于或等于g(n)。或许误导性较小的符号可能是f(n) <= O(g(n))。由于n ^ 2渐近大于或等于n * log n,因此上述不等式成立。

关于你的第一个问题:确定平均运行时间通常比确定最坏情况的上限更棘手,更复杂。无论如何,here's a nice explanation I've found for you