算法
例如 : 1+2+3+4+……+100
传统循环加法
int sum = 0 ; for(int i = 1; i < = 100 ; i++ ) { sum+= i ; } printf("%d",sum);
需要运行100次
用高斯算法:
int i ,sum = 0 , n = 100; sum =(1+n) * n / 2 ; printf("%d",sum);
只需要运行一次
度量算法效率
不计循环索引的递增,循环终止条件、变量声明、打印结果等操作。
判断一个算法的效率是,函数中的常数和其他次要项可以忽略,只需要关注最高项的阶数。
时间复杂度
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。
T(n)=O(f(n))表示问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
一般情况下,随着输入规模n的增大 ,T(n)增长最慢的算法为最优算法
分析一个算法的时间复杂度
用常数1取代运行时间中的所有加法常数
只保留最高阶像
将常数项置1
常数阶 O(1)
printf("Hello world!\n"); printf("Hello world!\n"); printf("Hello world!\n");
线性阶 O(n)
int sum =0 ,n = 100; for (int i=0;i<n;i++) sum+=i;
平方阶 O(n^2)
int n = 100; for(int i=0;i<n;i++) for(int j = 0; j<100;j++) printf("Hello world!\n");
对数阶 O(log n)
int i =1 ,n=100;
while (i<n)
i*=2;
函数调用的时间复杂度分析
for(int = i;i<n;i++) { function(i); } void function(i) { printf("i"); }
时间复杂度: O(n)
常用的时间复杂度所耗费的时间
O(1)<O(log n)<O(n)<O(nlog n) <O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现
算法的空间复杂度的计算公式 S(n)=O(f(n))