一、请问如何评估一个算法的性能?什么是大O表示法?
答:评估算法性能,主要评估问题的输入规模n与元素访问次数f(n)的次数。
大O符号,忽略非主体部分,如常数项、低阶项。O(g(n)),g(n)表示渐进上界。
二、请说出以下程序的时间复杂度?
for(int i=1;i<=n;i++){k=k+5;} O(n)线性复杂度
for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) k=k+i+j;} O(n^2)平方复杂度
for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++) k=k+i+j;} 1+2+3+..+n= n(n+1)/2 O(n^2) 平方复杂度
for(int i=1;i<=n;i++){ for(int k=1;k<=n;k++) { for(int k=1;k<=n;k++) k=k+i+j;} } O(n^3) 立方复杂度
int count=1; while(count<n){count=count*2;} 2^x=N=O(lg2N) 对数复杂度
三、这世界存在常数阶的算法吗?
答:常数阶的算法就是无论n怎么增长,消耗的时间都相同。即O(1),比如数学小王子对1到100的计算?
1+2+3+4+...+100=(1+100)*50
三、请说一下常见函数的复杂度计算?
答:算法复杂度/1s可处理的数据
lgn/2^10的八次方; n/100000000;n^2/10000;n^3/500;2^n/27;
假设n的规模为10的八次方,复杂度/所花时间
lgn/27/10^8s; n/1s;n^2/100000000s;n^3/10^16s;2^n/巨大的数字s;
四、请你根据大O表示法,对算法性能进行排序?
答:O(1)常量算法>O(sqrt(n))>O(n)线性算法>O(lg(n))二分查找>O(nlg(n))二分查找,归并,快排>O(n^2)冒泡排序,直接插入排序,选择排序>O(n^3)>O(2^n)