前言
数据结构与算法是程序员必备技能,经过这段时间系统的学习,我对它也有了一些自己的理解,所以将这些理解做一个总结,写成《带你快速入门数据结构与算法》系列,也当作对自己汲取知识的质量的一次评估,表达能力的一次提升。如有错误,请尽管指出,有人帮助挑出错误才是最幸福的,在改正错误中成长、完善自己。
数据结构与算法
因为本篇是此系列的第一篇,所以先介绍一下数据结构与算法的概念吧。很多人每每提到数据结构与算法第一反应都是:头疼、不想学,其实它并没有那么复杂。下面我们开始一步一步地去理解它。
首先,何为数据?百度百科介绍为:
数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。 数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。 在计算机系统中,数据以二进制信息单元0,1的形式表示。
如它所述,数据可以是一些观察到的事物、原始的材料、数字或值等。数据无处不在,像名字、身高、位置、海拔、经纬度、最近很重要的人口迁移数等都是数据。
那什么是数据结构呢?百度百科介绍为:
数据结构是计算机存储、组织数据的方式。
也就是说,如果把数据比喻成羽毛球,数据结构就像是保存羽毛球的几个不同方式,比较常见的一个接一个连成串摆放保存、摆成树形保存、摆成一个圆环来保存,当然各自有各自的有点,要根据实际情况去选择。放个图片再感受一下下。
最后就剩算法了,我们还是先看一下百度百科的介绍:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
官方语言就是专业,其中最重要的就是“策略”两个字,算法就是解决问题的策略(怎么有点在做英语题的感觉)。一种算法能解决一类问题,也可以说是解决这类问题的方法。
到这里我已经把数据结构与算法的概念(以我的理解)解释了一下,不知道各位是否有所顿悟呢?
时间复杂度
如果理解了数据结构与算法的概念,就可以继续深(入)入(门)学习了。
在深入学习之前,我们还要知道如何衡量一个算法的效率,主要从CPU(时间)占用——时间复杂度和内存占用——空间复杂度两方面衡量,而一般以时间复杂度作为主要指标,所以我们接下来就来讨论讨论时间复杂度。
要谈时间复杂度,我们得先知道如何计算算法执行时间。首先,我们需要一个可独立于具体程序/机器的度量指标,那就是算法所实施的操作数量或步骤数。那这个步骤数怎么表示呢?它需要一种跟算法的具体实现无关,一种通用的基本操作——赋值语句。为什么是它呢?因为如果我们仔细观察程序语言特征,是不是里面只有三种语句:
- 定义语句 - 与计算资源无关
- 控制流语句 - 组织语句
- 赋值语句 - 兼顾计算和存储
我们可以看出一条赋值语句同时包含了(表达式)计算和(变量)存储两个基本资源,而其他语句都不占用计算资源,所以就它就当选喽。举个例子看一下:
function sumFn(n) {
let sum = 0; // <=== 1
for (let i = 1; i < n + 1; i++) { // <=== n
sum += i; // <=== 1(n)
}
return sum;
}
上面的代码为计算前n个整数的和,如果只看代码的话,只有三个赋值语句,但是我们需要分析传入的参数n,它把for循环中的语句执行了n次,所以此函数的赋值语句数量为T(n)=2n+1,我们也就求出了此函数的执行时间。我们再用动态的眼光看,随着问题规模的增大,T(n)中的n的贡献会远远大于1和参数2的贡献,所以在T(n)中起决定性作用的主导部分是n,因此1和参数2可以省略掉。时间复杂度描述的就是T(n)中随着n增加而增加速度最快的主导部分,用大O表示法表示,大O表示法记作O(f(n)),其中f(n)表示T(n)中的主导部分,所以此函数的时间复杂度就可以表示为O(n)。下面我们再做个练习分析一下:
例 T(n)=5n²+20n+1314
当n很小时,起决定性作用的是1314,但随着n的不断增大,n²项会起越来越大的作用,20n+1314对结果的影响会越来越小,同样,系数5也是一样,所以可以将他们都去掉,时间复杂度就为O(n²),怎么样,是不是很简单?
小结
总结完毕,整篇文章写下来花了很长时间,可能内容比较浅,但都是个人理解。也可能存在错误或不足,希望大家可以互相讨论,一起学习,一起进步。觉得写的还过得去的可以点个赞,当作给作者的小小鼓励。不管是否有人观看,作者都会坚持写下去的,毕竟这样学完之后的总结还是更加加深了知识的牢固程度的。加油!!!