数据结构
「已注销」
这个作者很懒,什么都没留下…
展开
-
大话数据结构——图论再讨论(五)~最短路径~2020.9.7
最短路径最短路径分为迪杰斯特拉与弗洛伊德算法,且听我娓娓道来。单源最短路径——迪杰斯特拉#include <iostream>#include <cstring>using namespace std;const int MAXVEX = 105;const int INFINITY = 65535;struct MGraph{ int arc[MAXVEX][MAXVEX]; int vexes[MAXVEX]; int numVertexes,numEdge原创 2020-09-07 22:25:07 · 102 阅读 · 0 评论 -
大话数据结构——图论再讨论(四)~最小生成树~2020.9.7
最小生成树最小生成树的两种经典算法分别是Prim算法和Kruscal算法,且听我娓娓道来。Prim算法#include <iostream>using namespace std;const int MAXVEX = 105;const int INFINITY = 65535;struct MGraph{ int arc[MAXVEX][MAXVEX]; int vexes[MAXVEX]; int numVertexes,numEdges;};void CreateM原创 2020-09-07 16:44:09 · 130 阅读 · 0 评论 -
大话数据结构——图论再讨论(三)~2020.9.6
图的两种遍历方式——DFS与BFS深度优先遍历DFS①对于邻接矩阵而言://用于遍历整张图的bool数组,标记图中结点是否已经被访问 bool visited[MAXVEX];void DFS_MGraph(MGraph *G,int i){ visited[i] = true;//将该结点标记为已经访问过 cout<<G->Vexes[i]<<' '; for(int j=0;j<G->numVertexes;j++){ if(G->a原创 2020-09-06 10:30:47 · 94 阅读 · 2 评论 -
大话数据结构——图论再讨论(二)~2020.9.4
邻接表邻接表的结构定义struct EdgeNode{//边表结点 int adjvex;//边表结点在顶点表中的编号 int weight; EdgeNode *next;};typedef struct VertexNode{//顶点 int data; VertexNode *firstEdge; }AdjList[maxn],VertexNode;typedef struct{ AdjList adjList; int numVertexes,numEdges;}Gr原创 2020-09-04 18:03:28 · 93 阅读 · 0 评论 -
大话数据结构——图的再讨论(一)~2020.9.2
返校上课的第一天,从头开始复习图的相关知识。图的定义图是由顶点的有穷非空集合和顶点之间的边的集合组成的。通常表示为:G( V , E ),其中,G表示一个图,V表示图G中顶点的集合,E表示图G中边的集合。①线性表中我们把数据元素叫元素,树中将数据元素叫结点,图中将数据元素称为顶点(Vertexes)。②在定义中,若V是顶点的集合,则强调了顶点集合V非空。③在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以为空。#各种图的定义1.无向图:若顶点vi和vj之间的边没有原创 2020-09-02 11:32:49 · 191 阅读 · 0 评论 -
大话数据结构——二叉排序树的删除操作~2020.8.15
话不多说,先上代码再逐步分析。完整代码:主函数已省略,仅包括删除操作typedef struct BiTNode{ int data; BiTNode *lchild,*rchild;}BiTNode,*BiTree;bool Delete(BiTree *p){ BiTree q,s; if((*p)->lchild == NULL){ q = *p,*p=(*p)->rchild,delete q; } else if((*p)->rchild == NULL)原创 2020-08-15 12:53:50 · 315 阅读 · 0 评论 -
大话数据结构——二叉排序树的查找与插入操作~2020.8.12
话不多说,先放出完整的代码与运行结果,再逐一讲解。完整代码如下:#include <iostream>using namespace std;typedef struct BiTNode{ int data; BiTNode *lchild,*rchild;}BiTNode,*BiTree;//使用typedef为BiTNode赋予两种不同的名字bool SearchBST(BiTree T,int key,BiTree f,BiTree *p){ /*二叉排序树的查找操作,运原创 2020-08-12 12:16:04 · 314 阅读 · 0 评论 -
大话数据结构——斐波那契查找~2020.8.12
于七月末最后一次发文之后,便进入了极其混沌的暑假时光,每天至少打12个小时的电脑游戏,虚度了大好时光,十分可惜,于此记之,以明志。今日开始学习生活重回正轨。今天带来的是斐波那契查找,它是利用黄金分割原理来实现的。何为黄金分割原理?笔者自身也不知道,我将它理解为一种类似于公理的原理,记住即可,不需要知道其中的原理,就如同下放的代码一样,与折半查找大致相同,只是几个地方做出了修改,把它记住即可,不需要知道原理。int Fibonacci_Search(int a[],int n,int key){ /原创 2020-08-12 10:51:42 · 231 阅读 · 0 评论 -
大话数据结构——查找~折半查找及优化~2020.7.27
折半查找又称二分查找。(我在我的基础算法代码共享模块中放出过折半查找的代码模板及例题,有兴趣的朋友可以前往自行查看)它的前提是线性表中的记录必须是有序的(通常是升序),且线性表必须采取顺序存储(即使用数组存储)。折半查找的思想详见下图,使用树来模拟的,来源为《大话数据结构》。折半查找的详细代码如下:#include <iostream>using namespace std;int Binary_Search_SolutionOnBook(int a[],int n,int key){原创 2020-07-27 18:22:16 · 349 阅读 · 0 评论 -
大话数据结构——图~关键路径~2020.7.27
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网 ( Activity On Vertex Network )。在AOV网(拓扑排序)的基础上,AOE网(关键路径算法+拓扑排序)为一个全新的概念。在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,便被称之为AOE网 ( Activity On Edge Network )。AOE网是要建立在活动之间的制约关系原创 2020-07-27 11:54:07 · 349 阅读 · 0 评论 -
大话数据结构——图~拓扑排序~2020.7.20
拓扑排序是一个无环图的应用,如一个“电影制作”的工程图,不可能在人员到位进驻场地时,导演还没有找到,也不可能在拍摄过程中,场地都没有,因此,这样的工程图,一定是无环的有向图。在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网。设G={V,E}是一个具有n个顶点的有向图,V中的顶点序列v1,v2,……,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前。这样的顶点序列为一个拓扑序列。所谓拓扑排序,即为对一个有向图原创 2020-07-20 12:43:55 · 161 阅读 · 0 评论 -
大话数据结构——图论全复习~两种存储结构,两种遍历方法,最小生成树,最短路径~2020.7.18
存储结构①图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息(数组下标代表顶点序号),一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。下图更便于大家理解邻接矩阵的概念。(注:度的概念指有几条边与顶点相连,当然度也是之于顶点才有意义的。有向图讲究入度与出度,所谓入度,是指有几条边以该顶点为起点,出度同理)邻接矩阵实现代码:#include <iostream>using namespace std;typedef int V原创 2020-07-18 13:38:16 · 376 阅读 · 0 评论 -
大话数据结构——最短路径~弗洛伊德Floyd算法~O(n ^ 3)~2020.7.16
按我的个人理解,Dijkstra算法关注的是单元最短路径问题,而Floyd算法关注的是多元最短路径问题,即一个是从某个顶点出发求出其达到其他顶点的最短路径,一个是从每个顶点出发到达其他顶点的最短路径。迪杰斯特拉算法与弗洛伊德算法的核心,都在于关注中继顶点,即,引入中继顶点之后,反而缩短了两个顶点之间的距离。举个例子,比如从v0->v5,直接距离是99,而从v0->v3距离是4,从v3->v5距离是27,显然4+27<<99,最短路径的思想便是如此,不断地引入中继顶点使图松弛,原创 2020-07-16 14:22:40 · 210 阅读 · 0 评论 -
大话数据结构——最短路径~迪杰斯特拉Dijkstra算法~O(n ^ 2)~2020.7.16
通过迪杰斯特拉算法解决了从某个源点到其余各顶点的最短路径问题,时间复杂度为O(n ^ 2)。最短路径的算法显然是应用于网图的(即顶点之间的边带权值的图),举个例子,倘若从v0到v2,其距离为25,而从v0到v1,距离为1,从v1到v2,距离为9,则显然,先从v0到v1,再从v1到v2的距离比从v0到v2的距离更短。迪杰斯特拉算法正是不断地寻找形如v1这样的点,使整张图“松弛”,从而求出从某一个顶点到其他所有顶点(下放代码并不包括考虑图中包含孤立点的情况)的最短路径(单源最短路径)。下面直接放出代码:#原创 2020-07-16 11:18:50 · 374 阅读 · 0 评论 -
大话数据结构——最小生成树~Kruscal算法~O(eloge)~2020.7.15
Kruscal算法。时间复杂度O(eloge),其中e为边数。运用的主要知识:贪心思想与C++STLsort(),并查集(寻找祖先),边集数组(图的另一种存储结构,定义一个结构体,以边为主体,存放边的权值以及边所连接的两个点的下标)。#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const ll maxn=200005;struct edge{ int u原创 2020-07-15 11:38:28 · 407 阅读 · 1 评论 -
大话数据结构——最小生成树~Prim算法~O(n^2)~2020.7.15
Prim算法,时间复杂度O(n ^ 2),用于生成最小生成树。以下直接放出代码,注释中详细解释了代码的思想及需要注意的地方。#include <iostream>#include <cstring>#include <cstdio>#define MAXVEX 105#define INFINITY 65535using namespace std;typedef char VertexType;//顶点类型 typedef int EdgeType;//原创 2020-07-15 10:53:46 · 294 阅读 · 1 评论 -
大话数据结构——图~无向图邻接表广度优先遍历~2020.7.11
话不多说,直接上代码:#include <iostream>#include <cstring>#include <queue>using namespace std;typedef char VertexType;typedef int EdgeType;const int MAXVEX = 110;typedef struct EdgeNode{ //存储边表节点 int adjvex; //邻接点域,存储该顶点对应的下标。 EdgeTy原创 2020-07-11 12:04:13 · 222 阅读 · 0 评论 -
大话数据结构——图~无向图邻接矩阵广度优先遍历~2020.7.11
广度优先遍历(BFS),亦称广度优先搜索。如果说使用递归是深搜的核心,那么使用队列进行操作是广搜的核心。如果说图的深度优先遍历类似于二叉树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历(树的层序遍历在前文中我所撰写的树的四种遍历方式的博文中有所提及,倘若您感兴趣,可自行前往查看)。话不多说,直接放出代码。比起深搜,广搜是很好理解的,重要的部分我已经放在了注释中阐明。#include <iostream>#include <cstring>#include <que原创 2020-07-11 11:41:59 · 699 阅读 · 0 评论 -
大话数据结构——图~无向图邻接表深度优先遍历~2020.7.11
话不多说,直接上代码。有关深度优先遍历的概念请参考我的前一篇博文。#include <iostream>#include <cstring>using namespace std;typedef char VertexType;typedef int EdgeType;const int MAXVEX = 110;typedef struct EdgeNode{ //存储边表节点 int adjvex; //邻接点域,存储该顶点对应的下标。 EdgeTyp原创 2020-07-11 10:05:36 · 330 阅读 · 0 评论 -
大话数据结构——图~无向图邻接矩阵深度优先遍历~2020.7.11
图的遍历与树的遍历类似,即从图中某一个顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。深度优先遍历,也称之为深度优先搜索,简称dfs。 深度优先遍历其实就是一个递归的过程,其详细过程可以表述为:从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。(注:此处用文字表述不太容易说清,对于不谙递归奥秘的初学者来说可能有些难以理解。若想更深入地了解递归,可以在脑中模拟下放地代码,或参考原著《大话数据结构》。)以下直原创 2020-07-11 09:44:33 · 643 阅读 · 0 评论 -
大话数据结构——图的建立·无向图~邻接表~进阶~2020.7.9
暑假伊始,已是一个学期没有返校,学习难免有所懈怠,拖更数日,还望各位海涵。今天为大家带来《大话数据结构》中使用邻接表建立无向图的代码,供大家参考。此部分的代码非本人原创,而是参考了这本书上的代码。说实话,动手敲代码前,这一部分的内容我并没有完全理解,但开始敲之后,便有了个人理解,这部分的代码也就有所了解了。所谓邻接表,是为了弥补邻接矩阵在空间上可能会出现浪费的不足而出现的一种数据结构,其大义是将图中的顶点,存储在一个一维数组中(一维数组的大小又编码人自己决定),一维数组中的每一个元素可以看作是一个结构,结原创 2020-07-09 13:29:49 · 229 阅读 · 0 评论 -
大话数据结构——无向图图的建立~邻接矩阵~基础中的基础~2020.7.5
邻接矩阵存储图的信息应该是图论的基础了。邻接矩阵指的是建立一个二维数组,显然,为了表示数组中的一个值,需要调用两个下标,第一个下标表示顶点a,第二个下标表示顶点b,a到b的权值便存储在二维数组中。需特别注意:①建立无向图时,录入权值时需要考虑两个方向,即,从a顶点到b顶点与从b顶点到a顶点的权值相等,需做一次赋值的操作。②邻接矩阵中,自己到自己的距离显然是零,需在初始化时考虑。③邻接矩阵中,显然有不连通的两个顶点,此时二者之间的权值应赋值为正无穷。解决的方法是:在初始化邻接矩阵时,同时考虑为“自己到原创 2020-07-05 14:57:46 · 1166 阅读 · 0 评论 -
大话数据结构——二叉树的层序遍历~2020.7.5
顾名思义,二叉树的层序遍历,即按层次对二叉树进行遍历查询,因此,上图的遍历结果为ABCDEF。话不多说,直接上代码。二叉树的前序,中序,后序遍历我用到的都是递归的思想(深搜),而进行层序遍历选择队列更优(广搜)。#include <iostream>#include <queue>using namespace std;typedef char ElemType;struct BiTree{ BiTree *left,*right; ElemType data;}.原创 2020-07-05 12:07:28 · 138 阅读 · 0 评论 -
大话数据结构——二叉树的建立与遍历~2020.6.30
二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中的所有节点,使得每个节点被访问且仅被访问一次。二叉树的遍历方法:前序遍历中序遍历后序遍历层序遍历原理:递归对于递归而言,由于上一个学期研究了dfs和bfs,故而对递归的思想有所深入了解,对于二叉树的理解便没有那么困难了。总体而言,二叉树并非一种特别困难的数据结构,下面放出前序建立二叉树的代码以及二叉树的前序中序后序遍历代码。#include <iostream>#include <cstdio>us原创 2020-06-30 14:23:30 · 203 阅读 · 0 评论 -
大话数据结构——串与KMP模式匹配算法~2020.6.30
KMP模式匹配算法是用于在某一特定字符串S中查找是否存在一段字串T的算法,若存在,返回S串中出现的第一个T串的第一个字符的位置,否则返回0 。这一算法本人研读了一个上午,仍有些迷迷糊糊,草草地将代码抄了下来,粘到C站上,供大家查看。不配合原书的图片,KMP算法很难说清,此处仅供大家粗略地浏览代码,若想了解更多,可以查阅其他大佬的文章,或查看《大话数据结构》对应内容。#include <iostream>#include <cstring>#include <strin原创 2020-06-30 12:37:57 · 218 阅读 · 0 评论 -
大话数据结构——队列的链式存储结构~2020.6.28
比起循环队列,队列的链式存储结构是非常好理解的。其基本思路与建立链式线性表基本想同,详细资料请参考笔者前文。不同的是,链式队列需要一个头指针和尾指针,方便进行压入(push)与弹出(pop)操作。此处设立了一个head作为头指针,一个tail作为尾指针,head中的data数据记录队列长度而tail仅仅作为一个指针,指向队尾数据。详细内容请参考代码。#include <iostream>#include <cstdio>using namespace std;typedef原创 2020-06-28 11:24:17 · 140 阅读 · 0 评论 -
大话数据结构——循环队列~2020.6.28
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO(First In First Out)。允许插入的一端称为队尾,允许删除的一端称为队头。队列顺序存储结构的不足:入队操作时间复杂度为O(1),出队操作时间复杂度为O(n)。因此,使用循环队列可大大降低出队操作的时间复杂度。所谓循环队列,即使用两个指针分别指向队列的头和尾,即头指针和尾指针,而不必关注用于存储队列数据的数组下标。此处规定:头指针为front,尾指针为rear,头指针指向原创 2020-06-28 10:23:21 · 505 阅读 · 0 评论 -
大话数据结构——栈的链式存储结构~2020.6.27
近日研读《大话数据结构》,通过C++实现基本数据结构的代码。栈的定义于上一篇文章阐明,于此不再赘述,下面直接放上通过链表实现的栈的链式存储结构的代码,由于鄙人才疏学浅,尚不能将自己的代码应用于实际生活中,故此尽仅在主函数中加入了简单的测试数据,大体上仍停留在面向过程编程的阶段,但栈的实现及其主要功能基本完备,放上代码与大家共享。#include <iostream>using namespace std;typedef int ElemType;struct node{ node *原创 2020-06-27 20:34:45 · 130 阅读 · 0 评论 -
大话数据结构——栈的顺序存储结构~2020.6.27
“栈(stack)是限定仅在表尾进行插入和删除操作的线性表。”栈又称后进先出(LIFO)的线性表,首先它是一个线性表,也就是说,栈元素具有线性关系。此处直接奉上用数组(封装于类中)实现的线性存储结构栈及双向栈,其中双向栈仅给出了几个必要的类方法,而不包括于主函数中的测试操作。稍后将奉上链式存储结构栈的代码。#include <iostream>#include <cstdio>using namespace std;const int maxn=25000;typed原创 2020-06-27 11:11:38 · 197 阅读 · 0 评论 -
大话数据结构——线性表的顺序存储结构~2020.6.25
先上完整代码供码友观看。#include <iostream>#include <cstdio>using namespace std;const int maxn = 205;typedef int ElemType;class SqList{ private: ElemType data[maxn]; int Length; public: SqList():Length(0) {} int showLength() { return Len原创 2020-06-25 14:23:21 · 129 阅读 · 0 评论 -
大话数据结构——线性表的链式存储结构~2020.6.27
近日阅读《大话数据结构》自学数据结构的相关知识,将所学成果以代码的形式与大家共享,交流学习。鄙人才疏学浅,码风极其简陋,虽惶恐,仍报以学习的心展示代码,望大犇批评指正。由于线性表是数据结构中最简单的知识,线性存储结构已于之前的文章中展出,其难度根本不值得一提,有C语言的基础便能应付自如,而今天要展出的线性表链式存储结构的代码,则需要C语言中链表有关的知识。代码已经在DEV的环境下经过调试,运行一切正常。对于编程大犇来说,其难度根本不值得一提,对于初学数据结构乃至初学C语言链表相关知识(本人初探链表时极其原创 2020-06-27 10:25:43 · 147 阅读 · 0 评论