在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)
。
我有两个问题:
O(n*log(n))
和Omega(n*log(n))
。在"算法导论"通过计算每个语句的执行次数和成本来确定插入排序的Theta
时间。 O
和Omega
是否有类似的方法?O(n*log(n))
,还有O(n^2)
?答案 0 :(得分:1)
首先,您问题中的链接并未指出已接受的答案。它指出了最受欢迎的答案。
现在,逐一回答你的问题......
如何确定最坏的情况是O(nLog(n))和Ω(nLog(n))。在“算法简介”中,您可以通过计算每个语句的执行次数和执行成本来确定插入排序的Theta时间。 O和Omega有类似的方法吗?
为了让这个答案对每个人都有用,我再次提到与Merge Sort相关的重点。
采取最简单的案例。如果在该案例中运行合并排序,您会触摸多少个元素 † ?借助下图可以轻松实现可视化。每个级别触及的元素是 cn ,总共有 lg n 级别。因此,即使在最简单的情况下,触及的总元素是 cnLog(n)。
因此,合并排序总是具有最小复杂度≈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)?
这很简单,但就像之前的回答一样,我将从基本定义开始,以便答案对每个人都有用。
我喜欢下面的图片来理解这些术语。
注意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。