标签:审判 int 估算 ret 算法 long 数据结构 效率 灵魂
重大问题:
–如果两个算法都满足功能性需求,那工程中最关心的其他特性是什么?如何比较评判呢?
注: 性价比(效率)是工程中最关注的算法附加特性!
事后统计法
–比较不同算法对同一组输入数据的运行时间
–缺陷
· 为了获的不同算法的运行时间必须编写相应程序
· 运行时间严重依赖硬件以及运行时的环境因素
· 算法的测试数据的选取相当困难(相当于考试的结果要有效的区分考生的水平)
事前分析估算(重点)
–依据统计的方法对算法效率进行估算(可以直观的去看到,感受到,判断规模变大时,算法的表现是怎么的)
影响算法效率的主要因素
1.算法采用的策略和方法(主要因素)
2.问题的输入规模(某个算法,随着问题规模n的增大,它会越来越优于另一算法,或者越来越差于另一算法)
3.不同的编译器所产生的代码
4.计算机执行速度(现代和古代计算机)
程序分析估算执行次数
算法效率的简单估算一: (n为问题规模)
long sun1(int n) // n = 2n + 4
{
long ret = 0; //1
int* array = new int[n]; //1
for(int i=0; i<n; i++)
{
array[i] = i + 1; //n
}
for(int i=0; i<n; i++)
{
ret += array[i]; //n
}
delete[] array; //1
return ret; //1
}
算法效率的简单估算二:
long sun2(int i) // n = n+1
{
long ret = 0; //1
for(int i=1; i<=n; i++)
{
ret += i; //n
}
return ret; //1
}
算法效率的简单估算三:
long sun3(int i) // n =3
{
long ret = 0; // 1
if( n > 0 )
{
ret = (1 + n) * n / 2; // 1
}
return ret; // 1
}
程序效率估算练习:
#include <iostream>
using namespace std;
int func(int a[], int len) // ==> (n*n + 2)
{
int ret = 0; // 1
for(int i=0; i<len; i++)
{
for(int j=0; j<len; j++)
{
ret += a[i] * a[j]; // n * n
}
}
return ret; // 1
}
int main()
{
int array[] = {1, 2, 3, 4, 5};
cout << func(array, 5) << endl;
return 0;
}
启示:
–程序效率估算练习中的关键部分的操作数量为 n*n
–三种求和算法中关键部分的操作数量分别人2n,n,和1
–随着问题规模n的增大,他们操作数量的差异会越来越大,因此实际算法在效率上的差异也会变得非常明显!
(数学上的常规操作,想象一下基本函数图形)
小结:
–算法的度量事后统计法和事前分析估算法
–事后统计法不容易准确度量算法的效率
–事前分析估算法通过操作数量度量算法效率
–判断一个算法效率时只需要关注最高阶项就能得出结论
–某个算法,随着问题规模n的增大,它会越来越优于另一算法,或者越来越差于另一算法;
*
*
*
感谢关注,持续高速更新中······
标签:审判,int,估算,ret,算法,long,数据结构,效率,灵魂 来源: https://blog.csdn.net/dashuu/article/details/112318965
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。