- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何确定给定的 f(n) 和 g(n) 是在 theta、omega、big oh、little omega 还是 little oh 中?- 我认为一种方法是绘制函数 f(n) 和 g(n) 的图形。即使通过绘制图表,当 f(n) 在 theta、omega、大 oh、小 omega 或小 oh 中时,我们怎么说?我不清楚。有人可以提供更多详细信息吗?
我也不确定这是不是正确的方法。谁能告诉我是否还有其他更简单的方法可以做到这一点。举个例子:f(n) = sq root(n) and g(n) = n^sin n
最佳答案
您不能通过目测来确定渐近增长。每种类型的渐近增长关系都有正式定义,可以准确准确地解释它们的含义。您可以通过数学确定它们是否满足关系的正式定义来确定两个函数是否符合给定关系。
例如,Big-O 的几个等价形式定义之一如下:
f = O(g) if and only if lim [ n -> inf ] ( f(n) / g(n) ) < inf
因此,例如,如果 f(n) = n,并且 g(n) = n^2,您可以观察到极限为 n -> n/n^2 的无穷大 = 0,因此 f = O(g).
或者,如果 f(n) = n 且 g(n) = 2n,您可以观察到 n-> inf,n/2n -> 1/2 < inf,所以 f = O(g)。
但是,如果 f(n) = n 且 g(n) = sqrt(n),您可以观察到极限为 n -> n 的无穷大/sqrt(n) = 无穷大,因此 f != O( g).
您的示例 f 和 g 很棘手,因为随着 n 的增加,正弦在 -1 和 1 之间振荡。但是 Wolfram Alpha 告诉我所讨论的极限是无穷大,所以 sqrt(n) != O(n^(sin(n)).
每个其他渐近增长关系都有一个相似的正式定义,您可以测试两个函数是否相互满足它。
编辑:
您似乎在寻找经验法则。下面是确定相对简单的函数 f 和 g 的渐近阶的快速简便的方法。考虑每个函数中 n 的最高次幂:
当然,如果函数不是 n 的多项式,或者更复杂并且不容易确定最高次幂是多少(例如,您的示例使用正弦),您仍然必须恢复到正式定义。
一些永远正确的事情:
关于algorithm - 函数的渐近增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790337/
谁能证实这个算法的复杂度是 O(n^2)? a = 0 b = 0 c = n while (b <= c) { for (j = b; j<=c; j++) { a
问题(数据结构): 我们应该使用哪种表示来计算 O(|V|+|E|) 中图顶点的入度?这应该如何在 Khan 的算法中保持而不损害运行时间(渐近地)?证明您的主张。 我的尝试:我们应该使用矩阵表示来计
在某些情况下,对问题的蛮力方法具有复杂性,在性能方面不够好。 让我们举个例子西塔(n^2)。 使用递归方法可以将其改进为 Theta(nlogn)。 显然,渐近地人们会选择使用递归方法,因为对于越来越
我在 C++11 中使用 std::unordered_map。我在字符串键和复合数据类型之间做出决定(比如将两个 long 放在一个结构中以保存 UUID)。 当 hashmap 使用 std::s
它是 f(n)=theta(h(n)) 因为 theta 是可传递的。但是谁能解释为什么 h(n)=theta(f(n))。 最佳答案 通过定义扩展 Big-O 符号通常会使事情变得简单。 关于alg
我是一名优秀的程序员,十分优秀!