目录
前言:
从本科开始就混迹在CSDN了,但从今天开始我每天都会在博客中写一点自己看书的笔记或者是做项目(本人是机器人路径规划方向的)的时候遇到的困难和感悟。我看的数据结构是程杰的《大话数据结构》。
其实算法和数据结构的关系很紧密,如果单个拿出来讲,很少有人能讲明白,就算讲明白了也很少有人能立马听懂,所以国内有很多教材或者教学视频都是将这两部分做一个结合。因为本科不是学计算机的,只是相关的电子信息工程专业,所以对于做机器人路径规划的我还是得从头来过。在看数据结构之前,我尝试过直接看算法导论,给我的感受是,学着真的很枯燥有很多概念不能完全看懂或者完全看不懂。今天是第一天,所以废话有点多了,算是交待一下自己的主线(机器人路径规划)和副本(C++相关知识和嵌入式相关知识)
一、算法综述:
定义是:解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令代表一个或者多个操作。
算法有很多要求和性质,就个人的理解是:
用最少的资源高效地正确地解决特定的任务。
其中就包括了基本特性:输入输出、有穷性、确定性、可行性;
以及算法设计的要求:正确性、可读性、健壮性;
函数的渐近增长不难理解其中的道理,在这里已对数函数和一次函数(线性函数)做一个简单的例子:
![](https://img-blog.csdnimg.cn/20210816205034257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsZWNzdGFy,size_16,color_FFFFFF,t_70)
当两个函数在某个点(这里是n点)以后,其中一个函数恒大于另外一个函数。
对于算法而言常用的有:
常数阶(1)<对数阶(lgn)<线性阶(n)<线性对数阶(nlgn)<平方阶(n^2)<立方阶(n^3)<指数阶(2^n)<阶乘(n!)< ···
这里说明一下:常数阶是指有限的操作比如运行几次的操作都称为常数阶,另外可以用O(1)表示比如:1<=O(1)<=15,这是允许的;以此类推n<=O(n)<=2.5n 也是允许的。这里的O(1)、O(n)就是所谓的常数阶、线性阶;
最后说明一下,在工程中,如果解决一个方案要比O(n^2)更多的时间为代价,是非常耗时的。通常要求时间复杂度要尽可能低,同时内存还不能占用太多。也就是形象的要求“吃下去的是草,挤出来的是奶,还得是纯牛奶,不能是水”。
另外算法还有很多基础概念,比如最好情况和最坏情况。这些在后面的总结中会一一表现出来,在这里就不过多的解释说明了。
二、 线性表
标题是线性表,但是直到现在才说线性表,因为算法绪论不得不提的原因,所以才迟迟没有进入正题。
线性表的定义:
零个或者多个数据元素的有限序列
其中需要了解的概念知识和专业术语有:
1. 线性表是有一个头一个尾的一串数据,就像一根线,中间没有分支,因此称作线性表;
2. 前(先)驱元素,比如在线性表中:a1就是a2的前驱元素;
后继元素:同理可得an就是an-1的后继元素;
3. 线性表的长度为:线性表中元素的个数,是个数,是个数!不是数组的长度!!!
线性表的长度是根据线性表的插入和删除随时在改变的,而数组(动态数组除外)的长度是不会改变的。就像下面这样:
![](https://img-blog.csdnimg.cn/20210816213242988.png)
插入和删除操作给出了一个最好和最坏的情况,以删除为例:
最好情况:删除最后一个元素,其余元素位置不变,只进行一次操作;
最坏情况:删除的是第一个元素,他的后继元素需要向前移动一个位置,那么而后的所有元素都需要移动,因此需要n次操作;
线性表的优缺点:
优点:存储空间占用最小,能够快速读(时间复杂度为O(1))取任意位置的数据;
缺点:插入和删除时间复杂度高(O(n)),容易造成控件碎片;
总结
由于线性表的优缺点较为明显,如何尽可能在保留线性表的优点的同时又要克服缺点成为了一个难题:链式存储结构方法的发明有效的克服了这个难题。链式存储结构分析在第二讲中分析。
2021-8-16