数据结构与算法之美(复杂度分析1)

本文介绍了数据结构和算法在优化计算机性能中的作用,通过时间复杂度和空间复杂度来衡量算法效率。大O表示法用于描述代码执行时间随数据规模增长的趋势,而非实际执行时间。文章强调了复杂度分析的重要性,并提供了时间复杂度分析方法,如关注最耗时代码段、加法和乘法法则。最后,列举了不同时间复杂度的实例,如O(1)、O(logn)、O(m+n)和O(m*n),并建议通过练习来提升复杂度分析能力。
摘要由CSDN通过智能技术生成

补充

  1. 数据结构和算法解决的是“如何让计算机更快时间、更省空间的解决问题”。
  2. 需从执行时间和占用空间两个维度来评估数据结构和算法的性能
  3. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度
  4. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系

一、为什么要进行复杂度分析(事后统计法)?

测试结果非常依赖测试环境、测试结果受数据规模的影响很大

二、大O表示法

  1. 由来
    我们通过对一段代码的总执行时间的计算,我们可以得到一个非常重要的规律:所有代码的执行时间T(n)与每行代码的执行次数n成正比。


    T(n)表示代码执行的时间;n表示数据规模的大小;f(n)表示每行代码执行的次数总和。因为这是一个公式,所以用f(n)来表示。公式中的O,表示代码的执行时间T(n)与f(n)表达式成正比

  2. 表示法
    大O时间复杂度表示法实际上并不具体表示代码真正执行时间,而是表示代码执行时间随数据规模增长的变化趋势(低阶、常量、系数这三部分并部左右增长趋势)。

三、时间复杂度分析

  1. 如何分析一段代码的时间复杂度?
    • 只关注循环执行次数最多的一段代码
    • 加法法则:总复杂度等于量级最大的那段代码的复杂度
    • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

四、几种常见时间复杂度实例分析


我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2^n)和O(n!)。

  1. O(1)
    只要代码的执行时间不随n的增大而增大,这样代码的时间复杂度我们记作O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1) 。
  2. O(logn)、O(nlogn)
  i=1; 
   while (i <= n)  {
   	i = i * 2; 
   }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p5ciceDG-1618285983378)(http://calf1998.yongkj.cn/img/1618226248(1)].png)

  1. O(m+n)、O(m*n)
int cal(int m, int n) {
       	int sum_1 = 0;  
       	int i = 1;  
       	for (; i < m; ++i) {
           	sum_1 = sum_1 + i;
            }  
            int sum_2 = 0;  
            int j = 1;  
            for (; j < n; ++j) {    
            	sum_2 = sum_2 + j;  
            	}  
            	return sum_1 + s;
            }

从代码中可以看出,m和n是表示两个数据规模。我们无法事先评估m和n谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。所以,上面代码的时间复杂度就是O(m+n)。

五、如何掌握复杂度

关键在于多练,所谓熟能生巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值