算法复杂度(description in C)

96
坏科学
2017.09.17 21:48* 字数 534

本篇博客的目的是总结算法复杂度的概念,分析了几种经典算法的复杂度。

时间复杂度:算法中基本操作重复执行的次数是问题规模n的某个函数用T(n)表示,如果可以找到函数f(n),使n趋向于无穷大时,T(n)/f(n)是某个不为0的常数,则称f(n)是T(n)的同数量级函数。数学上记做T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。

例1:给定一个整数n,以2的乘积的方式递增,需要计算多少次

image.png

计算次数x,2^x <= n,x = log2n,所以时间复杂度是O(log2n)

例2:冒泡排序

冒泡排序.png

计算次数T(n) = n * (n-1)/2,当n趋向于无穷大时,可以找到函数n2,(n*(n-1)/2)/(n2) = 0.5,所以时间复杂度是O(n2)

空间复杂度:类似于时间复杂度的讨论,空间复杂度定义算法所占用的存储空间是问题规模n的某个函数。算法占用的存储空间只考虑程序运行过程中为局部变量分配的存储空间的大小,包括参数表中形参占用的空间和函数体在运行过程中定义的局部变量空间。

如上冒泡排序法,除了算法本身占用的存储空间外,运行过程中额外增加了形参a和临时变量temp,且与问题规模n无关,所以空间复杂度是O(1)

例3:一个空间复杂度与问题规模n有关的算法,斐波那契数列递归实现

斐波那契数列.png

传入函数的参数从n开始递减,占用存储空间依次为(1 1 2 3 5...)* int类型占用的字节数,可以看到递归算法是相当吃内存的。

通项公式如下:
通项公式.png
算法与数据结构