
数据结构与算法
Del Piero
这个作者很懒,什么都没留下…
展开
-
最短路径:Bellman-Ford算法
Dijkstra算法可以很好地解决无负权图的最短路径问题,但要是出现了负权边就会失效,这时应该使用Bellman-Ford算法(BF算法),可以解决单源最短路径问题,也可以处理有负权边的情况。原创 2020-09-23 22:54:34 · 575 阅读 · 0 评论 -
最短路径:Dijkstra算法
最短路径是图论中经典的问题:给定图G(V,E)和起点S,终点T,求一条从起点到终点的路径,使得这条路径上经过的所有边的边权之和最小。Dijkstra算法可以用来解决单源最短路径问题,即给定图G和顶点S,得到S到达其他每个顶点的最短路径。基本思想是:对图G(V,E)设置一个集合S,用来存放已经访问过的顶点,然后每次从集合V-S(没有被访问的顶点)中选择与起点s最短距离最小的一个顶点u,访问并加入集合S。接着以u为中介点,优化起点s与u能达到的所有顶点v之间的最短距离。上述操作重复n次(n为顶点个数),直到集原创 2020-09-21 11:58:36 · 854 阅读 · 0 评论 -
图
1.图的定义图结构是一种非线性的数据结构,由顶点(Vertex)和边(Edge)组成,每条边的两端必须是图的两个顶点(可以是相同的顶点),记号G(V,E)表示图G的顶点集为V,边集为E。图可以分为有向图和无向图。有向图的所有边都有方向;无向图中所有边都是双向的,无向边连接的两个顶点可以互相到达。在一些问题中,可以把无向图当作所有边都是正向和负向的两条有向边组成。顶点的度是指和该顶点相连的边的条数,对于有向图来说,顶点的出边条数称为顶点的出度,入边条数称为入度。顶点和边都可以具有权值,分别叫做点权和边权原创 2020-09-16 18:06:26 · 246 阅读 · 0 评论 -
堆
1.堆的定义堆是一个可以被看作完全二叉树的数组对象,堆中每个结点的值都不小于或者不大于其左右孩子结点的值。如果父结点的值大于子结点的值,这样的堆称为大顶堆;如果父结点的值小于子结点,则称为小顶堆。2.堆的存储结构由于堆是一颗完全二叉树,可以使用数组存储。编号为x的结点,左子结点为2x,右子结点为2x+1。const int maxn=100;int heap[maxn];3.堆的基本操作(1)建堆...原创 2020-09-02 15:56:33 · 186 阅读 · 0 评论 -
并查集
1.并查集的定义并查集是一种维护集合的树型数据结构,用于处理一些不相交集合的合并及查询问题(Union、Find、Set),支持以下两种操作:(1)合并:合并两个集合(2)查找:判断两个元素是否在一个集合中并查集通过数组father实现,father[i]表示元素i的父亲结点,父亲结点也是集合内的元素。如果father[i]=i,说明元素i是集合的根结点,一个集合内只存在一个根结点,作为该集合的标识。int father[N];father[1]=1;father[2]=1;father[3原创 2020-08-30 22:57:20 · 235 阅读 · 0 评论 -
树与二叉树(三)
1.平衡二叉树(AVL树)的定义AVL树是一种自平衡二叉查找树,树中任何结点的两个子树高度之差的绝对值不超过1,也成为高度平衡树,左子树与右子树的高度之差成为该结点的平衡因子。只要能随时保证每个结点平衡因子的绝对值不超过1,AVL的高度就能始终保持O(logn)级别。(1)存储结构struct node{ int data; int height; //当前子树高度 node *lchild; node *rchild;}(2)创建新结点node* newNode(int x)原创 2020-08-27 10:51:51 · 249 阅读 · 0 评论 -
树与二叉树(二)
1.树的遍历一般意义上的树子结点个数不限,子结点之间没有先后次序。(1)树的静态写法子结点个数无法确定,所以用vector存放所有子结点下标struct node{ int data; vector<int> child;}Node[maxn];创建新结点:int index=0;int newNode(int data){ Node[index].data=data; Node[index].child.clear(); //vector的clear()方法清空原创 2020-08-19 09:44:30 · 282 阅读 · 0 评论 -
树与二叉树(一)
1.树的定义与性质树是一种数据结构,是由有限结点组成的具有层次关系的集合。每个元素称为一个结点,两个结点之间通过边连接,结点向下延伸出子结点。**没有父结点的结点是根结点(root),每个结点有0个或多个子结点,每个非根结点有且只有一个父结点。**树有以下基本性质:1.树可以没有结点,没有结点称为空树2.树的层次要从根结点算起,根结点是第一层3.结点的子树个数(子结点个数)称为结点的度,一棵树中结点最大的度称为树的度4.树中不存在环,边数一定等于结点数-15.度为0的结点称为叶子结点,当树中只有原创 2020-08-17 23:34:47 · 396 阅读 · 0 评论 -
链表
1.链表链表是一种常见的数据结构,在物理存储上是非连续非顺序的,数据的逻辑顺序是通过指针连接。链表的结点一般由存储数据元素的数据域和指向下一个结点地址的指针域构成。struct node{ typename data; node *next;}链表可以分为带头结点的链表和不带头结点的链表,这里讲的是带头结点的链表。头结点一般称为head,数据域无内容,指针域指向第一个结点。最后一个结点的指针指向NULL,表示链表的结尾。2.结点内存空间的分配(1)mallocmalloc函数是stdli原创 2020-07-30 16:47:49 · 257 阅读 · 0 评论 -
队列
1.队列队列作为一种先进先出的数据结构,只允许在队尾插入元素,队首删除元素,是一种特殊的线性表。队列可以分为顺序队列和循环队列,这里讲的都是顺序队列。队首指针front指向队首元素的前一个位置,队尾指针rear指向队尾元素。用数组实现队列时首尾指针都是int型变量,用链表实现队列时是int*类型的指针。2.队列的基本操作以int数组为例,队列中没有元素时front和rear的值都为-1(1)获取队列内元素的个数int size(){ return rear-front;}(2)队列为空b原创 2020-07-25 00:11:58 · 334 阅读 · 0 评论 -
栈
1.栈栈是一种后进先出的数据结构。向栈中插入新元素称为进栈、入栈、压栈,使新元素成为栈顶元素;从栈中删除一个元素称为出栈、退栈,于其相邻的元素成为栈顶元素。栈顶指针是指向栈顶元素的标记,通常记为TOP,在数组栈中TOP是一个int型变量,而在链表栈中是一个int*类型指针。数组栈中数组下标从0开始,TOP为栈顶元素的下标。2.栈的基本操作以数组栈为例(1)获取栈内元素个数int size(){ return TOP+1;}(2)是否为空TOP=-1表示栈内没有元素bool empty(原创 2020-07-24 10:24:53 · 308 阅读 · 0 评论 -
C++标准模板库(STL):algorithm头文件常用函数
algorithm是stl中最重要的头文件之一,其中定义了多种算法可供使用者直接调用。#include <algorithm>using namespace std;1.max()、min()分别返回两个数的最大值和最小值,参数可以是整数、浮点数,但必须是2个参数。2.abs()返回一个数的绝对值,参数必须是整数。3.swap()swap(x,y)可以交换x和y的值4.next_permutation()给出一个序列在全排列中的下一个序列int a[10]={1,2,3}原创 2020-07-23 17:17:20 · 551 阅读 · 0 评论 -
C++标准模板库(STL):map和pair
map是STL中的一种关联容器,可以将任何基本类型映射到任何基本类型(包括STL容器),映射前的类型称为key(键),映射后的类型称为value(值)。map可以自动建立键值对的对应,并且会以键从小到大的顺序自动排序。1.map基本用法(1)头文件#include <map>using namespace std;(2)定义不同于其他stl容器,map在定义时需要确定键typename1和值typename2,已完成typename1到typename2的映射,typename可以原创 2020-07-22 10:46:52 · 600 阅读 · 0 评论 -
C++标准模板库(STL):string
string是STL中的字符串类模板,对字符串常用的一些功能进行了封装,相比字符数组使用更加方便。1.string基本用法(1)头文件#include <string>using namespace std;(2)定义string str1;string str2="dog";(3)输入输出string类型只能使用cin和cout输入输出#include <iostream>#include <string>using namespace st原创 2020-07-17 15:50:41 · 507 阅读 · 0 评论 -
C++标准模板库(STL):vector和set
一、vectorvector(向量)是一种顺序容器,可以理解为变长数组,数组长度可以随着需要自动改变。1.vector的定义要使用vector的功能,首先需要添加头文件。#include <vector>using namespace std;定义:vector<typename> v;typename为数组类型,可以为int、double、char、结构体或者其他STL标准容器等。下面这条代码定义了一个二维vector数组,每一维的数组长度都是可变的。注意:v原创 2020-07-16 23:14:12 · 1111 阅读 · 1 评论