Big o 用简明英语解释算法证明
我是一个从未正式学习过算法的程序员,一直想填补我学习中的空白。我目前正在阅读一些书籍和在线材料,我理解大O的概念,即它的用途,以及不同类别的性能,例如常数、线性、二次型等。我可以编写问题代码,直观地理解不同方法的性能含义 然而,我一直被困在算法证明的符号上,我不确定从哪里找到这一部分。我看过的所有书都假定这一知识水平 例如,斯基纳算法设计手册中的这句话让我感到困惑: f(n)=O(g(n))表示c*g(n)是f(n)的上界。 因此存在一些常数c,使得f(n)总是≤ c*g(n),对于足够大的n(即n≥ n0表示某些常数n0)。 这是读者应该完成的必然练习: 3n^2− 100n+6=O(n^2),因为我选择c=3和3n^2>3n^2− 100n+6强> 我能理解这两种说法,并且从逻辑上看,第二种说法是正确的。我也理解上限的概念,即这是最坏的情况 但我一直停留在简单的事情上,比如,上面提到的是什么Big o 用简明英语解释算法证明,big-o,proof,formal-verification,induction,Big O,Proof,Formal Verification,Induction,我是一个从未正式学习过算法的程序员,一直想填补我学习中的空白。我目前正在阅读一些书籍和在线材料,我理解大O的概念,即它的用途,以及不同类别的性能,例如常数、线性、二次型等。我可以编写问题代码,直观地理解不同方法的性能含义 然而,我一直被困在算法证明的符号上,我不确定从哪里找到这一部分。我看过的所有书都假定这一知识水平 例如,斯基纳算法设计手册中的这句话让我感到困惑: f(n)=O(g(n))表示c*g(n)是f(n)的上界。 因此存在一些常数c,使得f(n)总是≤ c*g(n),对于足够大的n(
- g(n)
- n≥ 某些常数n0的n0
有谁能帮我用简单的英语解析上述陈述,并以一种对非技术人员有意义的方式展示它们与练习之间的关系吗 g(n)是您将实际运行时与之进行比较的函数。例如,您可以说冒泡排序是O(n^2),使g(n)=n^2。但是,直觉上,您的算法不会精确地采用n^2时间单位(无论您希望在此处插入什么时间单位);可能需要3n^2− 但是,100n+6(即f(n))时间单位 现在,Big Oh符号所做的是比较两个函数的增长速度;请注意,这是一个非常粗略的比较。例如,它不区分需要f(n)=n^2时间单位的算法和需要f(n)=5n^2的算法,也不区分具有f(n)=n^2的算法和具有f(n)=n^2+n的算法。这就是c发挥作用的地方——如果你能找到任何常数c,你可以用它乘以g(n),这样得到的函数每n返回一个大于f(n)的值,那么f(n)=O(g(n))
大Oh表示法也关注的是f(n)中增长最快的部分。假设您想将f(n)=n+100与g(n)=n进行比较。直观地说,f(n)=O(g(n)),但是没有c可以与g(n)相乘,因此它总是大于f(n);然而,n的增长速度明显快于根本没有增长的100。最后,这就是n0发挥作用的地方:如果a对于有限数量的n,c*g(n)不大于f(n),只要对于无限数量的n,大Oh符号“容忍”它。该有限数以n0给出,例如,对于所有n<1(这是一个有限量:正好是数字0),f(n)=n+100可以大于c*g(n)=c*n,只要对于所有其他n(无限量:所有数字=1,使n0=1)f(n)更小。这里的主要问题是你不习惯数学中使用的习惯用法 让我们一句一句地说: