数据结构与算法第二节:衡量算法的执行效率(时间、空间复杂度分析)

数据结构与算法解决“快”, “省”问题, 即如何让程序更快, 让代码占用空间更少。

  • 事后统计法(我们常用的测试方法)

通过实际运行测试代码的执行时间和占用内存等大小来对算法进行评估的方法, 称其为事后统计法, 这种方法具有非常大的局限性。

具体体现为以下两点

(1). 测试结果非常依赖测环境: 如在不同性能的机器上具有不同的运行速率;

(2). 测试结果受数据规模的影响: 如同一个排序算法,待排序数据的有序度不一样,排序的执行时间就会有很大的差别;

而时间、空间复杂度分析不受具体环境和测试数据的影响,从理论出发可以粗略估计出算法的执行效率

1. 时间复杂度

分析时间复杂度的核心:
(1). 单独计算每一个循环的时间消耗,按照加法取'+', 乘法取'*'的原则叠加时间消耗 ;

(2). 分别计算每一行代码的运行时间,最后取最大量级

(3). 不管多少行代码,只要不跟n相关,那么它仍然是O(1)的时间复杂度

(4). 在实际中,我们只关注循坏执行次数最多的那一段代码

代码案例实际分析:

	int cal(int n) {
	   int sum_1 = 0;
	   int p = 1;
	   for (; p < 100; ++p) {
	     sum_1 = sum_1 + p;
	   }						// 第一段时间复杂度为: O(1)

	   int sum_2 = 0;
	   int q = 1;
	   for (; q < n; ++q) {
	     sum_2 = sum_2 + q;
	   }						// 第二段时间复杂度为: O(n)
	 
	   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;
	     }
	   }					       //第三段时间复杂度为: O(n^2)
	 
	   return sum_1 + sum_2 + sum_3;
	 }
	 
	 
	 i=1;
	 while (i <= n)  {
	   i = i * 3;
	 }			## O(logn) 

常见的时间复杂度: O(1)、O(n)、O(n2) 、O(logn) 、O(nlogn) 、O(z^n) 和 O(n!)

对于时间复杂度量级,可以粗略地分为两类: 多项式量级和非多项式量级,其中,非多项式量级只有两个: O(2^n) 和 O(n!).

我们把时间复杂度为非多项式量级的算法问题叫作 NP(Non-Deterministic Polynomial,非确定多项式)问题.

2. 空间复杂度

时间复杂度: 全称渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系;

空间复杂度: 全称渐进空间复杂度,表示算法的储存空间与数据规模之间的增长关系

代码案例实际分析:

	void print(int n) {
	  int i = 0;   // 申请了空间储存变量i, 但为常量阶.
	  int[] a = new int[n];   // 只有这一行代码中申请了空间储存为n的数量级.
	  for (i; i <n; ++i) {
	    a[i] = i * i;
	  }

	  for (i = n-1; i >= 0; --i) {
	    print out a[i]
	  }
	}			//空间复杂度为O(n)

常见的空间复杂度: O(1)、O(n)、O(n2)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱发呆de白菜头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值