据结构及算法概述-考研

本人本科科班小zz
把所有知识点都理解了一遍 +做了天勤的小册子练习题的所有选择题部分
由于本人学过一些C++,可能有时候会在某行的右边写一些与C++类似的部分,
学过C++的同学可以看一下,有助于理解,当然没学过的如果影响你的观看可以不看。

本人手撸源码:

戳这里看二叉树+线索二叉树+二叉排序树源码代码
戳这里看图论=dfs+bfs+dijkstra+floyd+kruscal+prim+topological_sort源码代码
戳这里看查找排序源码

介绍数据结构和算法

一。数据结构和算法是相辅相成的,某一种数据结构几乎都有着他的算法。数据结构是存储的方式,算法则是一种操作。一种数据结构可以有多个不同的算法,一个算法也可以在不同的数据结构中使用,但这个算法的效率可能会千差万别。这就是我们要学习数据结构与算法的目的,同样的操作结果,算法可能会有不同的复杂度,从而体现出不同的效率,我们要去寻找尽可能优化的方式,就是在不同情境下,挑选合适的数据结构与算法去解决某一个问题,这样我们写的程序才会更快,用户体验才会更好。
数据结构

  1. 顺序表;
  2. 链表;
  3. 栈;
  4. 队列;
  5. 树;
  6. 图;
  7. 堆;
  8. 数组;
  9. 广义表;10.串;

经典算法:
1.dijkstra ;
2. floyd;
3. kruscal;
4. prim;
5. dfs;
6. bfs;
7. topological_sort;
8. 各种sort;
9. 各种search;
10.还有某种数据结构中特有的算法

以上列出这些数据结构与算法,可谓是特别多了,以下再稍微介绍以下每种数据结构与算法的大致状况。

下面先介绍数据结构

线性表【线性结构的表】

顺序表 list

存储结构:顺序表是一种顺序的结构,存储地址是连续的,它也是具有相同类型数据元素的有限的表(数据集合),可以为空表
优点:由于和普通数组类似,且可以使用下标访问元素,称为随机访问。

操作: (算法 algorithm)(学过C++的小兄弟可以联想STL中的vector,当然vector的结构当然不是这样的,但是他的操作与顺序表的操作是类似的)
1.length(L); 求表长 ,相当于v.size()
2.empty(L); 判断表空,相当于v.empty()
3.insert(&L,i,e); 在i位置插入新元素e,相当于v.insert();
4.delete(&L,i,&e); 删除i位置的元素,并通过元素e保存数值 相当于v.erase();
5.destroy(&L) ; 销毁顺序表L 并释放空间
6.getElem(L,i,&e); 获得i位置的元素,用e保存下来,相当于v.at();
7.locate(L,&e); 定位元素e在顺序表L中第一次出现的位置
8.init(&L); 初始化顺序表L,构造一个空表

链表 linklist

存储结构:链表是一种链式的结构,其存储地址是随机的。地址是随机的,因此这种结构和顺序结构完全不同。
用一种最简单的链表-单链表,解释。
两个域,其一是数据域(存放数据),其二是指针域(存放下一个结点的地址)。两个域构成一个结点这,n个结点,通过指针域相连接起来构成一个单链表

操作: (算法 algorithm) (学过C++的小兄弟可以联想STL中的list)
1.C(&L); 构造一个链表
2.length(L); 求表长 ,相当于l.size()
3.empty(L); 判断表空,相当于l.empty()
4.locate(L,e); 返回链表中第一次出现e的指针,若没有e元素 则返回NULL
5.insert(&L,i,e); 在i位置插入新元素e;
6.delete(&L,i,&e); 删除i位置的元素;
//这里还有删除某个值 就不写了

栈 stack

以下会介绍 栈 和 队列 结构,他们是特殊的结构。
栈的特性:FILO first in last out(先进后出)
可以把他想象成一个桶先装进去的最后才能出来

存储结构:
①顺序存储
②链式存储

实际上可以使用这两种方式的任意一种去实现栈结构。
而这两种存储结构正是之前说的①顺序表和②链表。
换句话说就是 使用 顺序表 或者 链表 的其中一种去 加以约束(栈的特性)便创建了一个栈结构

操作: (算法 algorithm) (学过C++的小兄弟可以联想STL中的stack)
1.length(S); 求表长 ,相当于s.size()
2.empty(S); 判断表空,相当于s.empty()
3.push(&S,e); 压栈, 相当于s.push();
4.pop(&S,&e); 出栈,并把出栈元素保存在e中。

与C++ STL相近解释部分(没学过C++的同学可以跳过)
上面说到是用 顺序表或者链表去加以约束,所以 顺序表和链表是底层,

STL中分为 顺序容器 和 适配器 和 其他,
stack 和 queue priority_queue 都被列入了 适配器,而不是一种容器,
实际上他们就是利用了顺序容器,加上栈的特性,实现了一种适配,也就是满足了栈的需求。
因此,stack(栈)和queue 并不是真正意义上的一种容器,而是一种容器为了满足增加的一种规则而进行修改的适配器。

队列 queue

队列的特性:FIFO first in first out(先进先出)
其他的部分与 栈相似 ,在这里不做赘述,详情可以参照栈stack。

操作: (算法 algorithm) (学过C++的小兄弟可以联想STL中的queue)
1.length(Q); 求表长 ,相当于q.size()
2.empty(Q); 判断表空,相当于q.empty()
3.push(&Q,e); 入队, 相当q.push();
4.pop(&Q,&e); 出出,并把出栈元素保存在e中。

非线性表 【树是分岔的,图是你懂的 … …】

树 tree

戳这里看二叉树+线索二叉树+二叉排序树源码代码
树:

①双亲表示 (学过算法的同学 这其实就是 father【】 )
使用一个一维数组,整棵树的根节点存储他本身或者-1,这个操作标识他为root。
剩下的结点下标的位置存储他的父亲的值。

②孩子链表
每个结点拉一条单链表存储他的孩子

③孩子兄弟表示

二叉树:
类似于链表的结构,一个值域,两个指针域(二叉分两路,所以一个指针指向左孩子,另一个指针指向右孩子),这里的结构不太好描述,对于初学者也不太好理解,这里的定义是一个递归的定义,所以对于递归不太了解的同学来说,理解起来就非常困难,因此先理解好递归,才能学好这个二叉树。

图 graph

顶点集合+边的集合 构成 一张图G。顶点集不能为空,边集可以为空,因此图不能为空图。
因此收集好顶点集和边集是建立一张图的重要操作;
图分为两种:
①有向图(单向的箭头→表示,正如现在肺炎时期,在学校饭堂里,只能按照同一路线出入)
②无向图(与上述相反,可以自由进出)

图的概念多如牛毛,这里是简述所以就不提了。
//学过C++的同学注意一下, 这里的图不是 STL中使用的map,这两者是不一样的概念
存储结构:
①邻接矩阵 [ 就是利用一个二维数组 ]
n个顶点的图 使用nxn的矩阵存储,下标即可表示为两点之间的距离。

②邻接表
n个顶点 使用n个单链表分别存储 他的邻接点,m个邻接点通过指针连接遍形成一个邻接单链表,n个点都有一条属于他自己的单链表,这n条单链表就构成了一张图。

③逆邻接表

④十字链表

⑤邻接多重表

看到这里,就有同学会问,不就一张图吗,为啥要搞那么多种结构?
我给的回答是,因为使用图的不同情况比较多,不同的结构对同一个图的算法的效率的差距会很大,
因此设计多一些图的存储结构来更好的应对不同的场景。

操作:(算法 algorithm)
1.DFS (深度优先遍历)
其中一种遍历图的算法

2.BFS(广度优先遍历)
其中一种遍历图的算法

3.kruscal (克鲁斯卡尔)
其中一种最小生成树的算法

4.prim(普里姆)
其中一种最小生成树的算法

5.dijkstra(迪杰斯特拉)
单源到多源的最短路径算法

6.floyd(弗洛伊德)
多源到多源的最短路径算法

7.topological_sort(拓扑序列)

堆 heap

逻辑上是一种有规则的树,结点使用的是数组存储,
分为大顶堆和小顶堆:
①大顶堆
这棵树的每个结点要满足:父结点要比子结点要大
②小顶堆
这棵树的每个结点要满足:父结点要比子结点要小

数组 array

广义表

昵称套娃表,广义表可以由不同类型的数据元素组成,表头是最外层的第一个元素,表尾是除了表头以外的所有元素。

串 string

字符串
存储结构:
①顺序存储
②块链存储 //这里说的块链和区块链没有联系,不要搞混了

操作:(算法 algorithm)
最重要的是匹配算法,
最经典的匹配算法是著名的KMP算法

散列表

存储结构: (学过C++的小兄弟可以联想STL中的map,unordered_map也就是hash_map)
键值对存储:
键是唯一标识的,而值可以不同,也就是一个键可以对应多个值存储

以下是查找:

顺序查找

二分查找

二叉排序树查找

分块查找

以下是排序:

选择排序X2

1.简单选择排序;
2.堆排序;

交换排序X2

1.bubble_sort 起泡排序(别名:冒泡排序);
2.快速排序(简称快排);

插入排序X3

1.直接插入排序;
2.二分插入排序;
3.希尔排序;

归并排序

基数排序

举个小例子
123 456 789 248
这4个数进行排序
这四个数包含数字的范围是1-9 ,则开辟9个队列
按照低位到高位(或者相反)依次进到相应数字的队伍里,然后出队
数字最高位为3,所以入队出队3次,即可以排好


求点赞👍👍👍
原创不易,点赞容易。
您的鼓励就是我的最大动力!!!。

本篇博客到此结束,谢谢大家观看。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值