【问题标题】:Asymptotic Notation渐近符号
【发布时间】:2012-02-18 12:17:17
【问题描述】:

这是 MIT OpenCourse Introduction to Algorithm 作业中关于Asymptotic Notation 的问题:
对于以下每个陈述,确定对于渐近非负函数 f总是为真、从不为真有时为真 /em> 和 g。如果它总是正确从不正确,请解释原因。如果它有时是真的,请给出一个正确的例子,以及一个错误的例子。

f(n) ≠ O(g(n)) and g(n) ≠ O(f(n))   (both are Big-O notes)

我认为它绝不是真的。这是我的证明:

   f(n) ≠ O(g(n))
=> f(n) = w(g(n))   (little-omega note)
=> g(n) = o(f(n))   (little-o note)
=> g(n) = O(f(n))   (big-O note)

结果与g(n) ≠ O(f(n)) (Big-O note) 矛盾。同样,

   g(n) ≠ O(f(n))
=> g(n) = w(f(n))   (little-omega note)
=> f(n) = o(g(n))   (little-o note)
=> f(n) = O(g(n))   (big-O note)

这与 f(n) ≠ O(g(n)) (Big-O note) 相矛盾。

解决方案说它有时是真的

For f(n) = 1 and g(n) = ||n*sin(n)|| it is true,  
while for any f(n) = O(g(n)), e.g. f(n) = g(n) = 1, it is not true.

我的证明哪里做错了?另外,我无法理解解决方案。 ||n*sin(n)|| 在我看来就像 vector norm

【问题讨论】:

  • 假设 ||n sin(n)||应该读为 |n sin(n)|并参考实数的绝对值(当然,这是 R^1 上的向量范数),反例是有道理的。可以选择 n*(1+(-1)^n) = 0, 0, 2, 0, 4, 0, 6, ... 代替。
  • 一个教学旁注:也许您希望 f=O(g) 成为函数集的偏序,因为对于实数 f、g,它感觉与 f≤g 非常相似。

标签: algorithm math asymptotic-complexity


【解决方案1】:

我认为n*sin(n) 只是表明它是一个函数,即使对于用于定义 Big O 的 常数乘数 的所有选择,对于 n 的后续值,它都会不断变得大于和小于 f(n) = 1并因此f(n) ≠ O(g(n)) and g(n) ≠ O(f(n))

g(n) = 2*sin(n) 这样天真的选择的函数在这里不会有好处。有人可能会认为这也会在 f(n) = 1 周围交替出现,但 g(n) = O(f(n)) : M*f(n) > g(n) for M = 3

【讨论】:

  • 是的,没错,像n*sin(n) 这样的函数就是这么漂亮
【解决方案2】:

第一个不是真的:从这个f(n) ≠ O(g(n)) 它不遵循这个:f(n) = w(g(n))。这两个功能可能会在某个点相交,然后拍打地方,另一个变得更大(如果我用简单的话)。

他们选择的函数就是这种情况:对于 n g(n) 并且存在 g(n) > f(n) 的 ns(例如 pi / 2)。

【讨论】: