【问题标题】:Asymptotic analysis, Upper bound渐近分析,上限
【发布时间】:2021-09-21 06:32:36
【问题描述】:

我对算法的渐近分析有些困惑。

我一直在尝试理解这个上限情况,看过几个 youtube 视频。在其中一个中,有一个这个等式的例子 我们必须找到方程2n+3 的上界。因此,通过查看这个,可以说它将是O(n).

我的第一个问题: 在算法复杂性中,我们已经学会了丢弃常数并找到主导项,那么这种渐近分析是否可以证明该理论?还是有其他意义?否则,当它始终是等式中最大的n 时,此分析的意义何在?例如,如果它是n+n^2+3,那么对于某些c,上限将始终为n^2n0.

我的第二个问题: 根据规则,渐近分析中的上限公式必须满足此条件f(n) = O(g(n)) IFF f(n) < c.g(n) where n>n0,c>0, n0>=1

i) n 是输入数,对吧?还是n 代表我们执行的步骤数? f(n) 代表算法吗?

ii) 在following video 中证明方程2n+3 的上界可以是n^2,演示者认为c =1,这就是为什么满足方程n 必须是>= 3 而也可以选择c= 5n=1,对吧?那么,为什么在视频中的大多数情况下,演示者正在更改 n 而不是 c 的值以满足条件?有规律吗,还是随机的?我可以更改cn(n0) 以满足条件吗?

我的第三个问题: 在同一个视频中,主持人提到的n0(n 不是)是步数。那是对的吗?我认为n0是图形成为上限的极限(在n0之后,它满足n的所有值的条件);因此n0 也代表输入。

请您帮我理解一下,因为人们在不同的解释中提出了不同的想法,我想正确理解它们吗?

编辑


接受的答案澄清了除第一个问题之外的所有问题。我在网上浏览了很多文章,如果其他人有同样的问题,我在这里记录我的结论。这将对他们有所帮助。

我的第一个问题是

在算法复杂性中,我们学会了丢弃常数和 找到主导项,所以这个渐近分析证明 理论?

不,渐近分析描述了算法的复杂性,它是关于通过绘制数学表达式来理解或可视化一个函数或一组函数的渐近行为或尾部行为。 在计算机科学中,我们使用它来评估(注意:评估不是衡量)算法在输入大小方面的性能。

例如,这两个函数属于同一个组

mySet = set()
def addToMySet(n):
    for i in range(n):
        mySet.add(i*i)

mySet2 = set()
def addToMySet2(n):
    for i in range(n):
        for j in range(500):
            mySet2.add(i*j)

即使addToMySet2(n) 的执行时间总是> addToMySet(n) 的执行时间,这两个函数的尾部行为相对于最大的n 是相同的,如果将它们绘制在一个图,该图对于两个函数的趋势都是线性的,因此它们属于同一组。使用渐近分析,我们可以看到行为并将它们分组。

我假设上限代表最坏情况时犯了一个错误。实际上,任何算法的上限都与所有最好的、平均的和最坏的情况相关联。所以正确的说法是

upper/lower 绑定在best/average/worst 的情况下 算法

。 我们无法将算法的上限与最坏情况的时间复杂度联系起来,将下限与最佳情况的复杂度联系起来。但是,上限可能高于最坏情况,因为上限通常是已被证明成立的渐近公式。

我见过这样的问题,比如求某某算法的最坏情况时间复杂度,答案是O(n)O(n^2)O(log-n)等。

例如,如果我们考虑函数addToMySet2(n),有人会说该函数的算法时间复杂度是O(n),这在技术上是错误的,因为存在三个因素boundbound type,(包括上bound 和 strict upper bound) 和case 参与确定算法的时间复杂度。

当一个表示O(n) 时,它是从f(n) = O(g(n)) IFF for any c>0, there is a n0>0 from which f(n) < c.g(n) (for any n>n0) 这个渐近分析推导出来的,所以我们正在考虑upper boundbest/average/worst 情况。在上述声明中,case 缺失。

我认为我们可以考虑,在没有指明的情况下,大 O 表示法通常描述了最坏情况时间复杂度的渐近上界。 否则,也可以用它来表示渐近上界平均或最佳情况下的时间复杂度

【问题讨论】:

    标签: algorithm data-structures big-o computer-science complexity-theory


    【解决方案1】:

    渐近分析的重点是比较算法的性能缩放。例如,如果我编写相同算法的两个版本,一个具有O(n^2) 时间复杂度,另一个具有O(n*log(n)) 时间复杂度,我确信O(n*log(n)) 一个在n 为“大”时会更快。多大?这取决于。除非您对其进行基准测试,否则您实际上无法知道。你所知道的是,O(n*log(n)) 总会更好。

    现在有你的问题:

    1. n+n^2+3 中的“较低”n 被“丢弃”,因为与“主导”相比,当 n 向上扩展时,它可以忽略不计。这意味着n+n^2+3n^2 行为相同渐近。需要注意的是,即使 2 种算法具有相同的时间复杂度,但这并不意味着它们一样快。例如,一个总是比另一个快 100 倍,但具有完全相同的复杂性。

    2. (i) n 可以是任何东西。它可能是输入的大小(例如,对列表进行排序的算法),但也可能是输入本身(例如,给出第 n 个素数的算法)或迭代次数等

    3. (ii) 他可以选择任何c,他选择c=1 作为示例,因为他可以选择c=1.618。实际上正确的表述是:

    f(n) = O(g(n))IFF for any c>0, there is a n0>0 from which f(n) < c.g(n) (for any n>n0)

    1. 公式中的n0 是一个纯数学结构。对于c>0,它是n 值,函数fg 界定。因为n 可以表示任何东西(列表的大小、输入值等),所以n0 也一样

    【讨论】:

    • 感谢您的解释。一个小的困惑,据我了解0(n)Ω(n)θ(n) 可以相同,如果我们以2n+3 的相同示例为例,上限、下限和平均界限总是相同的到不同的cc1n0。对于其他所有方程,这不都是一样的吗?这太令人困惑了。
    • 如果我认为这个函数func(n){for i in 1..n{print (n)}} 不是上限,下限和平均界限将是n (0(n) , Ω(n) θ(n))?对于c1c2的某些值?
    • c 真的没有任何意义,它只是数学定义的一部分,就像你在f(x) 中说的x 一样。在您的函数中,执行时间是恒定的(总是 n 循环)。这并非总是如此。例如,快速排序算法的平均复杂度是 O(n*log(n)),但最坏的情况是 O(n^2)。当列表已经排序时会发生这种情况
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2016-10-28
    相关资源
    最近更新 更多