写在前面:学习C挺久了,但是一直都没有往数据结构与算法这方面看,近期接触一些笔试和面试题,发些了自身的不足。自己也思考了一番,要做的深一些和走的更远一些,数据结构和算法是必需要熟悉的。这系列的文章为本人的学习总结,若有什么错误,请各位指出。
复杂度分析(一)
我们编程的初衷是都想设计出运行更快、占用内存更小的程序,因此程序的复杂度分析在编程语言学习过程中尤为重要。想起以前我学习的毛病就是不管程序占多大跑多快,我不关系,只要功能实现了就行,就不慢慢深究里面的东西了。后来渐渐的发现这种学习方式不太行(工作上的话就另说了),所以慢慢的了解框架之后,现在开始研究的更细了。扯远了,回归正题。
复杂度分析简单点说就是评价程序执行效率的方法,有时间复杂度和空间复杂度。常用大O表示法来表示。如:O(m+n),O(1)等。
时间复杂度含义
含义:代码执行时间随着数据规模增长的变化趋势,即T(n) = O(f(n))。简言之就是评价代码的执行时间(评价而非计算)。
介绍个示例更直接些:
代码块1
int cal_sum(int n)
{
int sum = 0;
int i = 0, j = 0;
for(i = 0; i< n; i++)
{
sum = i + j;
for( j = 0; j < n; j++)
{
sum = sum + i * j;
}
}
}
假设每一条语句执行的时间为单位t;上面的代码块1中,3、4两行总执行2t,第5、7行总执行了2nt,第8、10行总执行了2tnn,所以这段代码片1的总执行时间为T = (2+2n+n * n * 2)t,这是一个关于n的2次多项式,可见T与运行次数n成正比,当n很大时,T的大小主要由2次项 2nn所决定。因此当我们抛弃常数项和一次项,可得T~n * n,进一步T(n) = O(n*n)。如下代码块2,第5、7行循环次数最多为n,占用时间最长。所以T(n) = O(n),。
//代码块2
int cal_sum(int n)
{
int sum = 0;
int i = 0, j = 0;
for(i = 0; i< n; i++)
{
sum += i;
}
}
时间复杂度的分析方法
1. 集中关注循环次数最多的一段代码
在复杂度的分析过程中,我们通常会忽略系数、常数、低阶,只考虑最高阶对代码段的影响,也就是只关注循序次数最多的。如上面代码段1和2,就是从循环次数最多的角度去分析时间复杂度的。
2. 加法法则 :
加法法则:建立在方法1的基础上,寻找影响整段代码块最大的时间复杂度,这个复杂度即是整段代码的复杂度
这里贴一个别人写的代码块3:
int cal(int n) {
int sum_1 = 0;
int p = 1;
for (; p < 100; ++p) {
sum_1 = sum_1 + p;
}
int sum_2 = 0;
int q = 1;
for (; q < n; ++q) {
sum_2 = sum_2 + q;
}
int sum_3 = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum_3 = sum_3 + i * j;
}
}
return sum_1 +

最低0.47元/天 解锁文章
1346

被折叠的 条评论
为什么被折叠?



