关于为什么要学习数据结构与算法的再思考以及对时间空间复杂度的分析

一、我理解的数据结构和算法
什么是数据结构,什么是算法?
从广义上来讲数据结构就是指一组数据的存储结构,而算法则操作数据的一组方法。
为什么市面上的书籍都是将数据结构和算法放在一起讲?
数据结构是为算法服务的,算法是要作用在特定的数据结构上。数据结构是静态的,他只是数据组织的一种方式,如果不在它的基础上构建和使用算法,孤立的数据结构是没有任何作用的。因此数据结构与算法是相辅相成的,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。
二、时间空间复杂度的分析。
为什么要进行实践复杂度的分析
虽然编译器会显示程序运行的时间,但这个数据并不是绝对的,会受到测试环境、测试数据的影响,有很大的局限性。所以我们需要一个不用具体的测试数据来测试,就可以粗略的指导算法的运行效率的方法。
如何求时间复杂度
先来一组最简单的代码

int fun(int n)
{
 int sum=0;
 int i=1;
 for(;i<=n;i++)
    sum=sum+i;
 return sum;
}

这段代码所实现的功能求1,2,·····,n的累加和,那么设每行代码所实现的时间都一样,为unit_time,那么总实现时间为(1+1+n+n)*unit_time,可以看出来所有代码执行的时间与每行代码所执行的次数成正比。
用一个公式表示就为T(n)=O(f(n)),f(n)表示每行代码运行时间的总和,T(n)表示代码执行时间。
这里O指的是一种数学符号,表示T(n)与f(n)表达式成正比,并且并不代表代码具体的执行时间,而是代表代码随数据模型的增长的变化趋势。所以当n最够大时,我们只需记录最大量就可以了,以本例为例的话
T(n)=O(n);(公式中低阶量、常量、系数并不能左右增长趋势,所以可以忽略)
而我们常见复杂级为常见时间
在这里插入图片描述
以上罗列的复杂度量级,我们一般分为两类:多项式量级和非多项式量级。其中指数阶和阶乘阶为非多项式量级。我们把非多项式量级的算法问题叫做NP(非确定多项式问题)。关于非多项式时间复杂度问题都是比较低效的算法,所以关于NP时间复杂度就很少有用到。
在这里插入图片描述
关于最好情况时间复杂度、最坏情况时间复杂度、平均时间复杂度、均摊时间复杂度。
例如在一个数组中,查找一个数,那么最好的情况下,我们要查的数就放在数组的第一位。那么这种情况就是最理想的情况,时间复杂度为O(1),这种情况下的复杂度就称为最好情况时间复杂度。那么最坏的尼,要查找的数在数组的最后一个地址内存储,或者根本不存在,那么我们要遍历一遍数组才可以确定,这时候时间复杂度为O(n),这种情况的复杂度就称为最坏情况时间复杂度。
以上都是比较极端的情况,而关于平均时间复杂度和均摊时间复杂度,个人感觉基本上时一个感念,但会有一些适用场景的差别:
平均时间复杂度在不同情况下复杂度出现不同量级差别,则用代码所有可能的情况下执行次数的加权平均值表示。
均摊时间复杂度满足两个条件下使用:一是代码在绝大数情况下都是低级别复杂度,只有极少数情况是高级别复杂度。二是低级别复杂度和高级别复杂度出现时序规律,比如说往数组插入一个数时规定当数组达到上限时将前N项累加求和并清空,当n<N时,时间复杂度是O(1)这样的复杂度出现N次后,而当n>=N时,需要将前N项求和,每次求和时将该项置0,那么这时的时间复杂度为O(N),之后又是出现N次的O(1),又紧接着是一次O(N),均摊结果一般都是等于低等级复杂度。
三、空间复杂度。
空间复杂度相对比较简单,表示存储空间与数据规模之间的增长关系。空间复杂度并不是指所有的数据所占用的空间,而是使用的辅助空间的大小,相对于时间复杂度,空间复杂度的分析要简单的多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值