例如,我有一个程序的f(N)= 5N +3。我想知道这个函数的大(哦)是什么。我们说高阶项O(N)。
这是通过降低低阶条件和常数来找到任何程序的大(哦)的正确方法吗?
如果我们通过简单地查看复杂度函数5N + 3得到O(N)。那么,该式F(N)< = C * G(N)?
的目的是什么我知道,这个公式只是为了比较两个函数。我的问题是,
在该式中,F(N)<= C * G(N),i具有F(N)= 5N + 3,但该上限G(N)是多少?它来自哪里?从哪里来我们接受它?
答案 0 :(得分:1)
问:这是通过丢弃找到任何程序的大(哦)的正确方法 低阶条款和常数?
是的,大多数具有检查时间复杂性的经验的人都使用这种方法。
问:如果我们通过简单地查看复杂度函数5N + 3得到O(N)。 那么,该式F(N)&lt; = C * G(N)?
的目的是什么
要正式证明你正确估算了某些算法的大哦。想象一下,你有F(N) = 5N^2 + 10
并且(错误地)得出结论,这个例子的大复杂性是O(N)
。通过使用此公式,您可以快速看到这不是真的,因为不存在常量C
,以便N
的大值保持5N^2 + 10 <= C * N
。这意味着C >= 5N + 10/N
,但无论你选择多大的常数C
,总是N
大于此常数,因此这种不等式不成立。
Q:在这个公式中,F(N)<= C * G(N),我有F(N)= 5N + 3,但这是什么 上限G(N)?它来自哪里?从哪里来我们接受它?
它来自于检查F(N)
,特别是通过查找其最高阶词。你应该有一些数学知识来估计哪个函数比另一个函数增长得更快,开始检查这个useful link。有几类复杂性 - 常数,对数,多项式,指数。但是,在大多数情况下,很容易找到任何函数的最高阶项。如果您不确定,可以随时绘制函数图或正式证明一个函数比另一个函数增长得更快。例如,如果F(N) = log(N^3) + sqrt(N)
可能乍一看不清楚什么是最高阶项,但是如果你计算或绘制log(N^3)
的N = 1,10和1000以及sqrt(N)
值,很明显sqrt(N)
增长得更快,因此这个函数的大哦是O(sqrt(N))
。