《软件技术基础》之《算法复杂度分析》
算法复杂性是算法运行所需要的计算机资源的量,需要时间资源的量称为时间复杂性,需要空间资源的量称为空间复杂性。这个量应该只依赖于算法要解的问题的规模、算法的输入和算法本身的函数。如果分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。一般把时间复杂性和空间复杂性分开,并分别用T和S来表示,则有:T=T(N,I)和S=S(N,I)。
通常让A隐含在复杂性函数名当中
规定输入:
程序的算法分析方法
抛开软件和硬件因素,只和问题规模有关。编写程序前预先估计算法优劣,改进或者选择最佳编程实现。
一个算法用程序设计语言表示后,算法就是由一组语句构成,算法的执行效率就由各语句执行的次数所决定。
一个算法花费的时间与算法中语句执行次数成正比例 ,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数 (计算步)称为语句频度或时间频度,记为 T(n) 。
一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=f(n)。随着模块n的增大,算法执行时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率高。
示例1:求线性序列元素之和
示例2:顺序存储结构中实现插入运算
算法实现:
Status List_Insert(ListPtr L,int pos,ElemType elem)
{
Status status=range_error;
int len=L->length,i;
if(len == MAXSIZE) status=overflow;
else if(1<=pos && pos<=len+1)
{
for(i=len;i>=pos;i--) L->elem[i+1]=L->elem[i]; // 数据后移一个位置
L->elem[pos]=elem;
L->length++;
status=success;
}
return status;
}
示例3:选择排序
void swap(int *a,int *b) //交换2个数
{
int temp = *a;
*a = *b;
*b = temp;
}
void select_sort(int arr[], int len)
{
int i,j;
for (i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (j = i + 1; j < len; j++) //走访未排序的元素
if (arr[j] < arr[min]) //找到目前最小值
min = j; //记录最小值
swap(&arr[min], &arr[i]); //做交换
}
}
Q:为什么是3?
A:交换2个数的swap函数有3条语句。
其他参考博客:
算法复杂度分析
算法的时间复杂度和空间复杂度-总结