我是一名从未正式学习过算法的程序员,并且一直想填补我学习中的空白。我目前正在阅读一些书籍和在线资料,我从概念上理解大 O,即它的用途,以及不同类别的性能,例如常数、线性、二次等。我可以编写问题并直观地理解不同方法的性能影响。
但是,我一直坚持的事情是算法证明的符号,我不确定在哪里可以找到这部分。我看过的所有书籍都假定这种知识水平。
例如,Skiena's Algorithm Design Manual中的这句话让我很难过:
f(n) = O(g(n)) 表示 c * g(n) 是 f(n) 的上限。
因此存在某个常数 c,使得 f(n) 总是 ≤ c * g(n),对于足够大的 n(即,对于某个常数 n0,n ≥ n0)。
这是读者应该完成的推论练习:
3n^2 − 100n + 6 = O(n^2),因为我选择c = 3 且3n^2 > 3n^2− 100n + 6;
我可以理解这两种说法,并且可以从逻辑上看出第二种说法是正确的。我也理解上限的概念,即这是最坏的情况。
但是我被困在简单的事情上,比如上面的内容是什么?
g(n)
对于某个常数 n0,n ≥ n0
总的来说,我无法将各个部分拼凑在一起来理解整个证明。
谁能帮我用简单的英语解析上述陈述,并以对非技术人员有意义的方式展示它们与练习的关系