【问题标题】:How to know if algorithm is big O or big theta如何知道算法是大 O 还是大 theta
【发布时间】:2019-03-21 23:03:14
【问题描述】:

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

【问题讨论】:

标签: algorithm big-o computer-science


【解决方案1】:

我认为区分boundscases非常重要。

Big O、Big Ω 和 Big Θ 都与边界有关。它们是定义算法行为的方法,并且随着 n(输入的数量)变得越来越大,它们提供有关操作数量增长的信息。

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

正如您提到的,仅当 Big O 为 O(f(x)) 且 Big Ω 为 Ω(f(x)) 时才存在 Θ(f(x))。在问题标题中,您询问如何确定算法是大 O 还是大 Θ。答案是算法可以是 Θ(f(x)) O(f(x))。在存在 Big Θ 的情况下,下界是某个正常数 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 Θ 符号只是提供更多信息,因为它提供了关于上限和下限的信息。 Big O 仅提供有关上限的信息。 当 Big O 和 Big Ω 的边界函数不同时(即 Big O 为 O(g(x)) 且 Big Ω 为 Ω(h(x)),其中 g(x) 不等于 h(x)),那么大Θ不存在。在这些情况下,如果要保证算法的上限,则必须使用大 O 表示法。

最重要的是,您必须区分界限和案例。当 n 变得非常大时,边界可以保证算法的行为。案例更多是基于个人的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 合并排序的最佳情况仍然是n*log(n)。冒泡排序可能是一个更好的例子
    • sort it by using Merge Sort. This algorithm has a best case complexity of Ω(n)
    • 是检查给定输入是否被排序的算法。这个检查需要 n 次操作,是最好的情况,因此给算法一个 O(n) 的最佳情况复杂度。如果它已经排序,算法将不会使用 Mergesort。
    • 为什么最好的情况复杂度不是 Θ(n)?那么对于同样的算法,平均时间复杂度和最坏情况时间复杂度是多少?
    猜你喜欢
    • 2010-10-19
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多