微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

渐近分析,上限

如何解决渐近分析,上限

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

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

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

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

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

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

我的第三个问题: 在同一个视频中,主持人提到的n(n0)(n不是)是步数。那是对的吗?我认为n0是图成为上限后的极限(在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/upperlower/best/average 情况下绑定 算法

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

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

例如,如果我们考虑函数O(log-n),人们会说该函数的算法时间复杂度是addToMySet2(n),这在技术上是错误的,因为有三个因素O(n),{ {1}}、(包含上限和严格上限)和 bound 涉及确定算法时间复杂度。

一个表示 bound type 时,它是从这个渐近分析 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 缺失。

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

解决方法

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

现在回答您的问题:

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

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

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

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

  1. 公式中的 c>0 是一个纯数学结构。对于n,它是函数fg 约束的n 值。由于 n0 可以表示任何内容(列表的大小、输入值等),因此 from flask import Flask app = Flask(__name__) @app.route("/") def hello(): assert False,"buggy code here" return "hello" def error_handler(exc_type,exc_val,exc_tb): send_email(exc_type,exc_tb) # This is the part I don't know # I want something along the lines of: app.config['ERROR_HOOK'] = error_handler
  2. 也是如此

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。