如何知道算法是大O还是大theta

时间:2019-03-21 23:03:15

标签: algorithm big-o computer-science

有人可以简短地解释一下为什么算法是O(f(n))而不是Θ(f(n)。我得到的是Θf(n))它必须是O(f(n))和Ω (f(n)),但是您怎么知道特定算法是Θf(n))还是O(f(n))。我认为很难不将大O视为最坏的情况。我知道这只是一个界限,但是界限是如何确定的。就像我可以看到,如果元素位于根目录中,则二叉搜索树中的搜索将在恒定时间内运行,但是我认为这与大O无关。

2 个答案:

答案 0 :(得分:2)

我认为区分界限情况非常重要。

大O,大Ω和大Θ都与边界有关。它们是定义算法行为的方式,并且随着n(输入数)的增长,它们给出有关操作数增长的信息。

在课堂上经常讨论最坏情况的大O,并且我有时会感到困惑,因为它将渐进行为的概念与单个最坏情况混为一谈。当n接近无穷大时,大O与行为有关,而不是单数情况。大O(f(x))是一个上限。可以保证无论输入什么,该算法的运行时间都不会比某个正常数乘以f(x)差。

正如您提到的,仅当Big O为O(f(x))并且BigΩ为Ω(f(x))时,Θ(f(x))存在。在问题标题中,您询问了如何确定算法是Big O还是BigΘ。答案是该算法可以是Θ(f(x)) O(f(x))。在存在大Θ的情况下,下限是某个正常数A乘以f(x),上限是一些正常数C乘以f(x)。这意味着,当存在Θ(f(x))时,该算法不会执行比C * f(x)差的更差的,也不会执行比A * f(x)更好的 ,无论任何输入。当存在Θ(f(x))时,无论您输入哪种输入,都将保证算法的行为方式。 当存在Θ(f(x))时,O(f(x))也是如此。在这些情况下,声明算法的运行时间为O(f(x))或算法的运行时间为Θ(f(x))是有效的。它们都是真实的陈述。给出BigΘ表示法只是提供更多信息,因为它可以提供有关上限和下限的信息。大O仅提供上限信息。 当大O和大Ω的边界具有不同的函数时(即,当大O为O(g(x))而大Ω为Ω(h(x))时,其中g(x)不等于h(x)),则大Θ不存在。在这种情况下,如果要保证算法的上限,则必须使用Big O表示法。

首先,必须区分大小写和大小写。当n变得非常大时,边界为算法的行为提供了保证。案件更多是基于个人情况。

答案 1 :(得分:-1)

在这里举个例子。想象一下BestSort算法,该算法首先检查数字列表是否排序,如果不是,则使用MergeSort对其排序。此算法BestSort的最佳情况复杂度为Ω(n),因为它可能会发现排序列表,并且它的最坏情况复杂度为O(n log(n)),它是从Mergesort继承的。因此,该算法没有Theta复杂度。将此与纯Mergesort进行比较,即使列表已经排序,它也始终是Θ(n log(n))

希望这对您有所帮助。

编辑

由于有些混乱,我将提供某种伪代码:

BestSort(A) {
If (A is sorted)  // this check has a complexity of O(n)
   return A;
else
   return mergesort(A); // mergesort has a complexity of Θ(n log(n))
}