【发布时间】:2021-09-21 06:32:36
【问题描述】:
我对算法的渐近分析有些困惑。
我一直在尝试理解这个上限情况,看过几个 youtube 视频。在其中一个中,有一个这个等式的例子
我们必须找到方程2n+3 的上界。因此,通过查看这个,可以说它将是O(n).
我的第一个问题:
在算法复杂性中,我们已经学会了丢弃常数并找到主导项,那么这种渐近分析是否可以证明该理论?还是有其他意义?否则,当它始终是等式中最大的n 时,此分析的意义何在?例如,如果它是n+n^2+3,那么对于某些c,上限将始终为n^2 和n0.
我的第二个问题:
根据规则,渐近分析中的上限公式必须满足此条件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= 5 和n=1,对吧?那么,为什么在视频中的大多数情况下,演示者正在更改 n 而不是 c 的值以满足条件?有规律吗,还是随机的?我可以更改c 或n(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),这在技术上是错误的,因为存在三个因素bound,bound 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 bound 的best/average/worst 情况。在上述声明中,case 缺失。
我认为我们可以考虑,在没有指明的情况下,大 O 表示法通常描述了最坏情况时间复杂度的渐近上界。 否则,也可以用它来表示渐近上界平均或最佳情况下的时间复杂度
【问题讨论】:
标签: algorithm data-structures big-o computer-science complexity-theory