ps:最近忙寄咯,准备下个月找暑假实习还有准备蓝桥杯,所以打算每天抽空出来系统的复习一遍数据结构与算法,顺便记录记录笔记...
1.数据结构:
1.1.什么是数据结构?
数据结构是指互相之间存在一种或者多种关系的数据元素集合。也就是Data_Structure = {Data , Relation}
1.2.数据结构的分类
数据结构可以分为逻辑结构和物理结构这两个角度来分类。
1.3.逻辑结构
1.从逻辑关系上描述数据,与数据存储无关。2.从具体问题抽象出来的数据模型。3.与数据元素本身的形式、内容无关。4.与数据元素的相对位置无关
其中,逻辑结构还将数据结构分为:线性结构、非线性结构
线性结构中由细分为:线性表(顺序表、链表)、栈、队列、串、数组、广义表等
非线性结构中包含:树、图、堆、矩阵等等。。。
1.4.物理结构(存储结构)
在存储结构上,数据结构又分为了:链式存储结构和顺序存储结构
顺序存储结构就是将数据按照存储地址顺序一个一个存放进去,主要的代表就是顺序表。
![](https://i-blog.csdnimg.cn/blog_migrate/ca33ab5f80c85e8c2fd86434b39ccad7.png)
链式存储结构:不像顺序结构那样,它的存储数据的物理地址可以不是连续的,而是由指针指向对应的存储地址,形成一条链子一样的结构。主要代表就是链表
![](https://i-blog.csdnimg.cn/blog_migrate/434a2f20f64ffe3cdd8e9afa1a1811dc.png)
1.5.总结:
![](https://i-blog.csdnimg.cn/blog_migrate/8c5c63286b05dee1cfd0be0d0a9c7f4f.png)
对比顺序与链式的区别:
存储结构 | 顺序存储结构 | 链式存储结构 |
存储方式区别 | 数据按照存储地址顺序一个一个存放进去 | 存储数据的物理地址可以不是连续的 |
crud操作的时间复杂度 | 查询 O(1) 增、删、改 O(n) | 查询O(n) 增、删、改 O(1) |
空间分配 | 需要预分配空间,超出的话就会内存溢出报错 | 不需要提前预留空间 |
2.算法
2.1.什么是算法
算法就是解决某个问题的方法,是解决这个问题的详解步骤的描述。
2.2.算法的特性
算法五个基本特性:有穷性、确定性、可行性、输入、输出
算法设计与要求:
正确性:不含有语法错误;对于各种合法的输入数据能够得到满足规格说明要求的结果。
可读性:要求程序有较好的人机交互性,有助于人们对算法的理解。
健壮性:对输入的非法数据能作出适当的响应或处理。
效率与低存储需求:主要指算法的执行时间和所需的最大存储空间,这两方面主要和问题的规模有关。
2.3.算法的时间复杂度
算法的运行时间:算法中每一条语句的执行时间之和。
其中,一条语句的执行时间 = 执行频率* 执行1次需要的时间。
现在出个题目来看看算法的运行次数:
public void test(int n){
int ans = 0;//执行1次
for(int i = 0;i<n;i++){ //执行n次
for(int j = 0;j<n;j++){//执行n*n次
for(int k = 0;k<n;k++){ //执行n*n*n
ans++;//执行n*n*n
}
}
}
}
而在程序中,我们一般用Landau符号来表示时间复杂度
符号 | 定义 |
f(n)=O(g(n)) | 大O,渐近上限 |
f(n)=o(g(n)) | 小o,asymptotically negligible,lim f(n)/g(n)=0 |
f(n)=Ω(g(n)) | 渐近下限(当且仅当g(n)=O(f(n))) |
f(n)=ω(g(n)) | asymptotically dominant (当且仅当g(n)=o(f(n))) |
f(n)=Ѳ(g(n)) | asymptotically tight bound(渐近紧密界限) (当且仅当f(n)=O(g(n))且f(n)=Ω(g(n))) |
在算法的复杂度计算中,我们一般用O()来表示。
如上题,我们的伏安法复杂度就是O(2*n*n*n+n*n+n+1) = O(n3);
2.4.空间复杂度
空间复杂度是指程序在运行过程中,临时占用的空间大小,包括,输入数据的所占的空间、源程序所占的空间、辅助变量的空间。
注意的一点是:临时占用空间大小并不包括程序的形参占用的空间
比如上一题中,我们的空间复杂度为O(1).
做个题叭:
以下程序段中语句“x++;”的语句频度为( D )
for(i=1; i<=n; i++)
for(j=1; j<=i; j++)
for(k=1; k<=j; k++)
x++;
A. n(n+1)(2n+1)/2 B. n(n+1)(n+1)/2 C. n(n+1)(2n+1)/6 D. n(n+1)(n+2)/6
这个题刚看到的时候还觉得挺难的,但是只要我们按部就班,一步一步计算还是不难的:
![](https://i-blog.csdnimg.cn/blog_migrate/8568b36e237051b260894baa1c264768.png)
下面算法将一维数组a中的n个数逆序存放到原数组中,空间复杂度为(A)
for(i=0; i<n/2;i++)
{ t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
A.O(1) B. O(n) C. O(nlog2n) D. O(n2)
2.5.总结:
![](https://i-blog.csdnimg.cn/blog_migrate/c99e9eecccd0fc55677887b9e0882527.png)