时间复杂度和空间复杂度
算法参考:https://blog.csdn.net/m0_37907797/article/details/102661778
算法效率的度量方法:
事后统计:利用计算机计时器对不同算法编制的程序的运行时间进行比较,事后诸葛亮。
事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行估算。
一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
(1). 算法采用的策略、方法;(2). 编译产生的代码质量;(3). 问题的输入规模;(4). 机器执行指令的速度。
我们在分析一个算法的运行时间时,重要的是把基本操作的数量和输入模式关联起来。判断一个算法的效率时,函数中的常数和其他次要常数项常常可以忽略。
算法时间复杂度:
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
如何推导大O阶?
用常数1取代运行时间中的所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项存在且不是1,则去除与这个项相乘的常数。
得到的最后结果就是大O阶。
常数阶:O(1)
线性阶:一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对应计数次数呈线性增长
int i,n=100,sum=0; for(i=0;i<n;i++) { sum=sum+i; } 循环复杂度为O(n),代码需要执行n次
平方阶:两个n嵌套循环O(n^2),三个O(n^3),具体问题具体分析。
对数阶:
int i=1,n=100; while(i<n) { i=i*2; } 假设有x个2相乘后大于或等于n,则会退出循环。
由于2^x=n 所以x=log2(n)所以O(logn)