目录
一、大O表示法
什么是程序?大家都知道,程序由数据结构和算法构成,想要写出好的的程序,首先得了解数据结构和算法。一切脱离数据结构和算法的程序设计都是耍流氓!
什么样的程序才是好的程序?好的程序设计无外乎两点,"快"和"省"。"快"指程序执行速度快,高效,"省"指占用更小的内存空间。这两点其实就对应"时间复杂度"和"空间复杂度"的问题。
怎样分析一个程序的时间复杂度和空间复杂度?接下来今天的主角就要登场了!"大O表示法"。"大O表示法"表示程序的执行时间或占用空间随数据规模的增长趋势。大O表示法就是将代码的所有步骤转换为关于数据规模n的公式项,然后排除不会对问题的整体复杂度产生较大影响的低阶系数项和常数项。乍一看这句话可能不好理解,接下来会详细介绍怎么用"大O法"来进行时间和空间复杂度分析。
1、一个算法所实施的操作数量或步骤数可作为独立于具体程序/机器的度量指标,就是说算法执行的操作的步骤数。
那么问题来了,这个操作选择什么比较好呢?因为这个操作可以是赋值语句,也可以是其它的。
其实主要就是用的赋值语句,为什么呢?原因主要有以下几点:
- 一条赋值语句同时包含了(表达式)计算和(变量)存储两个基本资源,而计算机主要干的事情就是计算和存储。
- 仔细观察程序设计语言特性,除了与计算资源无关的定义语句外,主要就是三种控制流语句和赋值语句,而控制流仅仅起了组织语句的作用,并不实施处理。
例如:
def sumofN(n):
Sum = 0 # 1
for i in range(n): # n
Sum += i # 1
return Sum
上面的代码中,我们称为问题的规模是 n ,赋值语句的数量是T(n) = n + 1,那么什么是问题规模呢?
问题规模其实就是:影响算法执行时间的主要因素。
在前n个整数累计求和的算法中, 需要累计的整数个数合适作为问题规模的指标,前100,000个整数求和对比前1,000个整数求和,算是同一问题的更大规模。
算法分析的目标是要找出问题规模会怎么影响一个算法的执行时间。
二、数量级函数 Order of Magnitude
- 基本操作数量函数T(n)的精确值并不是特别重要, 重要的是T(n)中起决定性因素的主导部分。用动态的眼光看,就是当问题规模增大的时候,T(n)中的一些部分会盖过其它部分的贡献。------>就是T(n)中起主要作用的部分。
- 数量级函数描述了T(n)中随着n增加而增加速度最快的主导部分,称作“大O”表示法,记作O(f(n)),其中f(n),表示T(n)中的主导部分
三、确定运行时间数量级大O的方法
例1: T(n)=1+n
当n增大时,常数1在最终结果中显得越来越无足轻重所以可以去掉1,保留n作为主要部分,运行时间数量级就是O(n)
例2: T(n)=5n^2+27n+1005
当n很小时,常数1005其决定性作用, 但当n越来越大, n^2项就越来越重要,其它两项对结果的影响则越来越小,
同样, n^2项中的系数5,对于n^2的增长速度来说也影响不大所以可以在数量级中去掉27n+1005,以及系数5的部分,确定为O(n^2)
四、代码分析确定执行时间数量级