数据结构
stitch389
这个作者很懒,什么都没留下…
展开
-
图的拓扑排序
拓扑序列:一些活动,其中某些活动必须在另一些活动完成之后才能开始,一定是无环的有向图,称为AOV网。 拓扑排序,其实就是对一个有向图构造拓扑序列的过程。构造时会有两个结果:如果此网的全部结点都被输出,则说明其为不存在环的AOV网。如果没有输出全部顶点数,则说明这个网存在回路,不是AOV网。 拓扑排序基本思路:从AOV网中选择一个入度为0的顶点输出,然后删去此结点,并删除以此结点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止。 在拓扑排序的过程中,需要删除顶点,用邻接表会更加原创 2020-11-09 15:36:06 · 1155 阅读 · 0 评论 -
最短路径:迪杰斯特拉算法与弗洛伊德算法
对网图和非网图,最短路径含义的不同的。非网图的最短路径:两顶点之间经过的边数最少的路径。网图的最短路径:两顶点之间经过的边上权值之和最少的路径。 迪杰斯特拉(Dijkstra)算法 解决了从某个源点到其余各项点的最短路径问题。时间复杂度为O[n2]。若想找到从源点到某一个特定终点的最短路径,这个问题和求源点到其他所有顶点的最短路径一样复杂。 若源点为v0,终点为v8,此算法不是一下子就求出了v0到v8的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最原创 2020-11-09 15:08:19 · 648 阅读 · 0 评论 -
图的最小生成树:普利姆算法、克鲁斯卡尔算法
最小生成树(Minimum Cost Spanning Tree):对于一个带权值的图,即网结构,n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。有两种算法:普利姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。 这两者都是基于邻接矩阵的。 普利姆(Prim)算法 普利姆算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。 思路:假设 N = (P, {E}) 是连通网, TE 是 N上最小生成树中边的集合。算法从 U = {u0}(u0 属于 V), TE = {}原创 2020-11-09 10:06:05 · 503 阅读 · 0 评论 -
图的深度优先遍历、广度优先遍历
邻接矩阵的深度优先遍历: typedef int Boolean; //bool型变量,表示已经访问过,表示未访问过 Boolean visited[MAXVEX]; //访问标志的数组 //邻接矩阵的深度优先递归算法 void DFS(MGraph G, int i) { int j; visited[i] = 1; printf("%c ", G->vexs[i]); for (j = 0; j < G->numVertexes; j++) if (G->arc[i原创 2020-11-06 16:19:48 · 68 阅读 · 0 评论 -
图的存储结构:邻接矩阵、邻接多重表
图有5种存储结构:邻接矩阵、邻接多重表、邻接表、边集数组、十字链表。 一、邻接矩阵 对于无权无向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = V[j][i] = 1,若无边,则为0。V[i][i] 必为0。此时邻接矩阵必为对称矩阵。 对于无权有向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = 1,若无边,则为0。V[i][i] 必为0。 对于有权有向图:若顶点 i 与顶点 j 间有边,则 V[i][j] = 权,若无边,则为无穷。V[i][i] 必为0。 邻接矩阵存在一个问原创 2020-11-06 14:55:41 · 900 阅读 · 0 评论 -
优先队列(堆)
优先队列的声明 typedef ElementType int; struct HeapStruct{ int Capacity; int size; ElementType *Elements; }; typedef struct HeapStruct *PriorityQueue; PriorityQueue Initialize(int MaxElements) { PriorityQueue H; if(MaxElements < MinP翻译 2020-10-10 15:51:46 · 75 阅读 · 0 评论 -
二叉树
定义 typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; struct TreeNode { Elementype Element; SearchTree Left; SearchTree Right; }; 建立一棵空树 SearchTree MakeEmpty(SearchTree T) { if(T != NULL) { MakeEmpty(T->翻译 2020-10-10 14:54:13 · 74 阅读 · 0 评论 -
队列
声明 #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED typedef int ElementType; struct QueueRecord { int Capacity; int Front; int Rear; int Size; ElementType *Array; }; struct QueueRecord; typedef struct QueueRecord *Queue; #endif // Q翻译 2020-09-24 11:02:35 · 95 阅读 · 0 评论 -
链表
定义 typedef int Elementype; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; struct Node { Elementype Element; Position Next; }; 判空 int IsEmpty(List L) { return L->Next == NULL; } 判断是否为最后一个节点 int IsLast(P翻译 2020-09-24 10:27:50 · 50 阅读 · 0 评论 -
字符串匹配的朴素模式与KMP模式
* 什么是朴素模式? 朴素模式思路:从主串的第一位开始与要匹配的字符串的第一位做对比,若相同,比较下一位,若不同,从主串的第二位开始与要匹配的字符串的第一位做对比,以此类推。 例:主字符串 M 为 ababcdx,要匹配的字符串 T 为 abx。 第一次:M[0] == T[0], M[1] == T[1], M[2] != T[2], 第一次匹配失败。 第二次:M[1] != T[0], 第二次匹配失败。 第三次:M[2] == T[0], M[3] == T[1], M[4] != T[翻译 2020-11-06 10:38:26 · 65 阅读 · 0 评论