(一)大O是什么?
1.引入:"问题的规模变化"现象
我们拿到一个问题,就要通过思考,提出解决问题的方法。
< 1.>想了解大O是什么,先理解下面的文字:
"目的(问题)",往往是具有增长性的、问题的规模可能经常会升级,
在"问题规模升级"的过程,我们提出的算法,
不能仅仅是对某一规模下的特例情况,
往往要随着"问题规模的----增长、升级"过程中------仍有着不错的性能!!!
< 2.>提出问题:纸上产生4x4的16个方格如何产生?
这里选用两种算法:
1.暴力方案---绘制方格---1+1+1+1+1+1+1+1+1+1+1+1+1+1+1....16
2.其它方案---折叠一张纸-----2----4-----8-----16
< 3.>问题规模变化的假想:
问题的规模发生变化:需求的变化
纸上32个方格,纸上64个方格 纸上128个方格
甚至纸上256个方格...会怎么样?
2."问题规模变化"和"基本操作重复的次数"的关系
再次回看前面的两种算法:
1.暴力方案---绘制方格---1+1+1+1+1+1+1+1+1+1+1+1+1+1+1....64、
(1)基本操作:基本"操作"是"绘制一个方格"
(2)问题规模的要求N=64,自变量。
(3)截止到实现目的,基本操作的重复次数:基本操作重复之后增长了n=64次,因变量。
探讨"问题规模N和基本操作数n的重复次数的联系",结合数学的表达式:
n=64 ,N=64
这就是大O,描述N的变化过程中,和小n的联系!!!
为了方便表达出大O,写成O(n)!!!
2.其它方案---折叠一张纸-----2----4-----8-----16----32------64
(1)基本操作是"折叠一次纸"
(2)问题规模的要求N=64,自变量。
(3)截止到实现目的,基本操作的重复次数:基本操作重复之后增长了n=6次,因变量。
即大O.
问题规模N和基本操作数n的重复次数的联系,结合数学的表达式:
n=6 ,N=64
这就是大O,描述N的变化过程中,和小n的联系!!!
为了方便表达出大O,写成O(log2 N)!!!
注意:我们不要讨论"基本操作的内容",基本操作是怎样根本无所谓。
关键是抓住每次
(1)基本操作导致的结果变化+(2)基本操作引起n和N之间 产生的"联系表达式"
不论是,绘制...还是折叠....都是基本操作的内容,我们要完全忽略它们,
把眼光放在
《n和N的变化关系上》+《基本操作带来的结果(+1)与(2次幂)》
来写出表达式,才能得出某一算法的大O。
总结大O含义:
总结:大O即,问题规模N发生变化时候,基本操作数需要重复的次数n,随之的改变的关系表达式。
(二)、大O的量级:
大O的表达式不会注重加减法,大O的注重量级(n+n)也是O(n)
O(logN+1)也是O(logN)
常见的O量级:
O(logN) 对数级logN
O(N) N级
O(N的平方) N的平方级
O(N三次方) N的三次级
O(1) 常数级
(三)、大O的名称由来:“时间或空间复杂度”
算法在输入规模增加时,执行时间或所需空间的增长情况。