数据结构与算法——复杂度(一)

写在前面:学习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 + 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值