- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据我的研究:我被要求确定一个函数相对于另一个函数的复杂性。即给定 f(n)
和 g(n)
, 确定 O(f(n()
.在这种情况下,我替换值,比较它们并得出复杂度 - 使用 O(), Theta and Omega notations
.
但是,在 substitution method for solving recurrences
,每个标准文档都有以下几行:
• [Assume that T(1) = Θ(1).]
• Guess O(n3) . (Prove O and Ω separately.)
• Assume that T(k) ≤ ck3 for k < n .
• Prove T(n) ≤ cn3 by induction.
如果没有给出其他任何东西(除了 f(n)),我应该如何找到 O 和 Ω?我可能是错的(我绝对是错的),欢迎提供以上任何信息。
上面的一些假设是引用这个问题:T(n) = 4T(n/2) + n
,而步骤的基本轮廓是针对所有此类问题的。
最佳答案
这个特定的递归可以通过主定理解决,但您可以从替代方法中获得一些反馈。让我们试试你对 cn^3
的初步猜测.
T(n) = 4T(n/2) + n
<= 4c(n/2)^3 + n
= cn^3/2 + n
假设我们选择c
这样n <= cn^3/2
对于所有相关的n
,
T(n) <= cn^3/2 + n
<= cn^3/2 + cn^3/2
= cn^3,
所以 T
是O(n^3)
.这个推导的有趣部分是我们使用立方项来消除线性项。像这样的矫枉过正通常是我们可以猜测得更低的迹象。让我们试试 cn
.
T(n) = 4T(n/2) + n
<= 4cn/2 + n
= 2cn + n
这行不通。右侧和我们想要的边界之间的差距是 cn + n
,这是我们想要的边界的大 Theta。这通常意味着我们需要猜测得更高。让我们试试 cn^2
.
T(n) = 4T(n/2) + n
<= 4c(n/2)^2 + n
= cn^2 + n
起初这看起来也很失败。不像我们猜测的n
, 但是,赤字很少是界限本身。我们可以通过考虑 cn^2 - h(n)
形式的界限来关闭它。 , 其中h
是o(n^2)
.为什么要减法?如果我们使用 h
作为候选人,我们会出现赤字;通过减去 h
,我们有盈余。 h
的常见选择是低阶多项式或 log n
.让我们试试 cn^2 - n
.
T(n) = 4T(n/2) + n
<= 4(c(n/2)^2 - n/2) + n
= cn^2 - 2n + n
= cn^2 - n
这恰好是复发的确切解决方案,这对我来说相当幸运。如果我们猜到cn^2 - 2n
相反,我们会留下一点功劳。
T(n) = 4T(n/2) + n
<= 4(c(n/2)^2 - 2n/2) + n
= cn^2 - 4n + n
= cn^2 - 3n,
略小于cn^2 - 2n
.
关于algorithm - 渐近符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061157/
谁能证实这个算法的复杂度是 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
我是一名优秀的程序员,十分优秀!