【问题标题】:Upper bound vs lower bound for worst case running time of an algorithm算法最坏情况运行时间的上限与下限
【发布时间】:2011-11-29 13:11:02
【问题描述】:

我正在学习算法分析。我理解算法的最坏情况运行时间的概念。

但是,算法的最坏情况运行时间的上限和下限是多少?

一个例子,一个算法的最坏情况运行时间的上限不同于同一算法最坏情况运行时间的下限算法?

【问题讨论】:

    标签: algorithm complexity-theory


    【解决方案1】:

    对于函数f(n)g(n)上限 (big O),如果对于“足够大的 n”,f(n)<=c*g(n),对于常量 c。 [g 支配 f]
    g(n) 是下界 (big Omega),如果对于“足够大的 n”,f(n) >= c*g(n),对于常量 c。 [f支配g]

    如果g(n) 既是f(n) 的上限又是下限[具有不同的c],我们说g(n) 是f(n) [Big theta] 的一个紧界

    用例子代替紧界:有时,很难找到紧界,例如fibonacci 递归算法。所以我们很容易找到 O(2^n) 的简单上界。更多信息可在此post 的答案中找到。

    它与最坏/基本/...情况有什么关系?(根据 cmets 的要求):

    最坏情况/平均情况(或任何其他情况)会影响复杂度函数,但 big-O、big-Omega 和 big-Theta 可以应用于这些情况。

    例如,HashTable 插入是Θ(1) 平均情况插入,Θ(n) 最坏情况插入。也是O(n)平均情况插入(绑定不紧),Ω(1)最坏情况插入。

    【讨论】:

    • 我理解你的回答,它们是我遇到的定义,但它与算法的“最坏情况”运行时间有什么关系?
    • @AmulyaKhare:它没有,有一个下限 [big Omega]、上限 [big O] 和紧界 [big theta] 来分析:最坏情况/平均情况/。 .. 这些术语指的是函数,它描述了最坏情况/最佳情况/...行为。
    • 那么,如果发现最坏情况的运行时间是f(n),那么我们可以像你上面说的那样找到上界和下界吗?
    • @AmulyaKhare:正确。但通常你找不到这个f(n) [如果我们可以,生活将太容易],所以你找到一个g(n),这是算法的上限,你将你的算法表示为O(g(n))
    • @amit 在答案中添加澄清评论可能很有用。目前尚不清楚(仅从答案中)上限和下限与最坏情况的关系。
    【解决方案2】:

    首先,让我们谈谈案例。 算法输入案例问题实例相关联.对于排序问题(我们想找到一个集合按特定顺序的排列),我可以看一个像数字集合 {1, 5, 4, 2, 6} 的实例。这组数字将成为旨在解决排序问题的排序算法的输入,例如选择排序或other sorting algorithms 之一。

    可以将相同的输入集提供给任何想要解决问题的算法。不管我使用什么排序算法,输入的集合总是相同的(因为根据定义,它们都是同一个问题的实例)。但是,对于给定的算法,给定的情况可能更好或更糟。无论输入是什么,有些算法总是执行相同的操作,但有些算法可能在某些输入上表现更差。然而,这意味着每个算法都有一些最好的情况和一些最坏的情况;我们有时也会谈论平均案例(通过取所有案例的平均值)或预期案例(当我们有理由预期一个案例会比其他案例更常见时)。

    算法案例示例

    “找到未排序列表的最小值”的问题对于每个可能的输入总是相同的。不管你写什么聪明的算法,你都必须检查每一个元素。如果您有一个零列表或一个随机数列表或第一个元素是最小值的列表,那么您直到最后才知道。该算法的每种情况都是相同的,因此最好的情况是最坏的情况,平均情况和预期情况也是如此。如果列表被排序,我们可以做得更好,但这是一个不同的问题。

    “在列表中查找给定元素”的问题是不同的。假设您使用的算法在列表中进行线性遍历,则可能会发现给定元素是列表的第一个元素,并且您立即完成。但是,它也可能是列表的最后一个元素,在这种情况下,您必须在找到它之前遍历整个元素。所以你有一个最好的情况和一个最坏的情况。

    算法作为输入大小的函数

    当我们想要分析算法时,我们算法学家会考虑我们可以向算法抛出的所有可能情况。通常,两个最有趣的情况是最好的情况和最坏的情况。如果您将算法运行时间视为其输入的函数,那么最好的情况是最小化函数的输入,最坏的情况是最大化函数的输入。我在这里使用代数数学意义上的“函数”:绘制一条线的一系列 x/y 对(输入/输出对,或在本例中为“输入大小/执行步骤数”)。

    由于算法的运行时间是其输入的函数,因此对于每种可能的输入大小,我们都有不同的最佳情况(和最坏情况)。所以有时我们将最好的情况视为单个输入,但它实际上是一组输入(每个输入大小一个)。对于给定的算法,最好的情况和最坏的情况是非常具体的事情。

    界限

    现在边界呢?边界是我们用来与给定算法的函数进行比较的函数。我们可以考虑无数个边界函数。您可以在图表上绘制多少种可能的线?这就是边界函数的数量。大多数算法学家通常只对几个特定函数感兴趣:常数函数、线性函数、对数函数、指数函数等。

    上限是位于另一个函数之上的函数。下限是位于另一个函数之下的函数。当我们谈论 Big O 和 Big Omega 时,我们并不关心边界是否总是高于或低于另一个函数,只是在某个点之后它们总是如此(因为有时算法对于小输入大小会变得很奇怪)。

    任何给定函数都有无限个可能的上限,而任何给定函数都有无限个可能的下限。但这是我们谈论不同大小的无穷大的奇怪时期之一。要成为上界,该函数不能低于另一个函数,因此我们排除了另一个函数下面的无限个函数(因此它小于所有可能函数的集合)。

    当然,仅仅因为有无限的上限,并不意味着它们都是有用的。函数 f(∞) 是每个函数的上限,但这就像说“我拥有的美元少于无限数量”——对于确定我是身无分文还是百万富翁并不是特别有用。所以我们经常对“紧”的上界(也称为“最小上界”或“上界”)感兴趣,对此没有更好的上界。

    最佳/最坏情况 + 下限/上限

    我们有代表算法运行时函数的上层和下层函数的最佳/最坏情况。我们有上限和下限来表示其他函数,这些函数可能位于任何其他函数的顶部或下方(分别)。它们可以结合起来阐明关于算法的关键思想。

    Worst Case Lower Bound:该函数是算法运行时函数下方的边界,当该算法被给予最大化算法运行时间的输入时。

    Worst Case Upper Bound:该函数是算法运行时函数之上的边界,当该算法被赋予最大化算法运行时间的输入时。

    Best Case Lower Bound:一个函数是算法运行时函数之下的边界,当该算法被赋予最小化算法运行时间的输入时。

    Best Case Upper Bound:该函数是算法运行时函数之上的边界,当该算法被赋予最小化算法运行时间的输入时。

    案例界限示例

    让我们给出具体的例子来说明我们什么时候会关心这些:

    最坏情况下限:这里的经典示例是基于比较的排序,众所周知,在最坏情况下为 Ω(n log(n))。无论您设计什么算法,我都可以选择一组最坏情况的输入,其中最严格的下界函数是对数线性的。你不能做出一个能在最坏情况下超越界限的算法,你不应该费心去尝试。这是分类的地下室。当然,最坏情况有很多下限:常数、线性和次线性都是下限。但它们不是有用的下限,因为那里的对数线性下限是最严格的。

    最佳情况下限Insertion Sort 的工作原理是遍历列表,并将遇到的任何乱序插入到正确的位置。如果列表已排序,则只需遍历列表一次,无需进行任何插入。这意味着最佳情况的最严格下限是 Ω(n)。在不牺牲正确性的情况下,您不能做得比这更好,因为您仍然需要能够遍历列表(线性时间)。但是,最好情况的下限要好于最坏情况的下限!

    Worst Case Upper Bound:我们经常对在最坏情况下找到一个严格的上限感兴趣,因为这样我们就知道我们的算法在最坏的情况下运行得有多差。插入排序最坏的情况是一个完全乱序的列表(即完全颠倒了它的正确顺序)。每次我们看到一个新项目,我们都必须将它移动到列表的开头,将所有后续项目向前推(这是一个线性时间操作,并且执行线性次数会导致二次行为)。但是,我们仍然知道,在最坏的情况下,这种插入行为将是 O(n2),作为最坏情况的严格上限。这不是很好,但它比指数或阶乘的上限要好!当然,对于最坏的情况,这些是有效的上限,但同样,这不如知道二次是一个严格的上限那么有用。

    Best Case Upper Bound:我们的算法在最好的时候能做的最坏的事情是什么?在之前在列表中查找元素的示例中,第一个元素是我们想要的元素,上限是 O(1)。在最坏的情况下它是线性的,但在最好的情况下,可能发生的最坏情况是它仍然是恒定的。在我看来,这个特定的想法通常不如 Worst Case Upper Bound 重要,因为我们通常更关心处理最坏的情况,而不是最好的情况。

    其中一些示例实际上是Ө,而不仅仅是 O 和 Ω。在其他情况下,我可以选择不紧的下​​限或上限函数,但仍然足够近似以供使用(请记住,如果我们不紧,我可以从中汲取无限的井!)。请注意,可能很难找到不同大小写/绑定组合的引人注目的示例,因为这些组合具有不同的效用。

    误解和术语

    您会经常看到people with misconceptions 关于这些定义的信息。事实上,许多非常优秀的计算机科学家会松散地交替使用这些术语。但是,案例和界限的概念是不同的,您最好确保您理解它们。这是否意味着差异会出现在您的日常生活中?不,但是当您在几种不同的算法之间进行选择时,您需要阅读有关案例和界限的细则。有人告诉你他们的算法有一个 O(1) 的最佳情况上限,这可能是想把羊毛扯到你的眼睛上——一定要问他们最坏情况上限是什么!

    【讨论】:

      【解决方案3】:

      让我通过一个例子来说明这一点:

      快速排序的最坏情况运行时间是Theta(n^2)。所以一个有效的下限是Omega(n),一个上限是O(n^3)。这表示在最坏的情况下,快速排序将花费至少线性时间和最多立方时间。

      现在这不是一个非常精确的陈述,但对于更复杂的算法,这样的陈述是我们能做的最好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 2018-04-27
        • 2015-03-09
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多