1、算法是指令的有穷序列。
5个特征:有穷性,确定性,可行性,输入,输出。
4个要求:正确性,可读性,健壮性,效率与低存储量。
算法评价:事后统计方法,事前分析估算(时间/空间复杂度)。
2、渐进时间复杂度
T(n)=O(f(n))
渐进时间复杂度衡量的是一个算法基本操作执行次数的数量级,而不是单纯地比较程序运行时间的长短。其真实意义应该是:是如果问题规模(n)趋向于无穷大,比较算法执行时间长短。因此,计算T(n),f(n)的系数是不起作用的,也不必比较单级基本操作执行次数的多少。
因此,渐进时间复杂度是一个理想运行时间的衡量,而不是一个具体运行时间的衡量。O的具体意义是:是用于描述函数渐进行为的数学符号。也就是说,O其实是使用另外一个函数来描述本来函数的渐进上界,这样可以简化问题。其意义类似于数学中的等价无穷小的概念。
因此,有定理:如果f(n)是一个多项式,最高次项的指数为m,那么其渐进时间复杂度是T(n)=O(n^m)。
常见渐进时间复杂度的比较:O(log2 n)<O(n)<O(nlog2 n)<O(n^2)<O(n^3)<O(2^n)<O(n!)
3、渐进空间复杂度
渐进空间复杂度不是衡量所有程序占用空间的大小,而是程序临时占用存储空间大小的度量。也就是说,计算的一般只有算法本身所占的存储空间,算法输入输出所占的空间以及算法临时占用的空间。
有的算法临时占用的空间是不随问题规模的大小而改变的,我们称其为“就地”进行的算法,是节省存储的算法。而有的算法所占用的空间随问题规模(n)的增大而增大,就需要使用O(f(n))的方式来衡量,才称为渐进空间复杂度,很多递归算法都属于这种算法。