![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
__matrix
这个作者很懒,什么都没留下…
展开
-
十二、图的算法入门--(4)最短路问题---Dijkstra算法实现
摘自计蒜客:http://www.jisuanke.com/course/35/7557先来看这样一个问题:有n座城市,已知任意两个座城市之间的距离,现在要分别求出城市A到其他n-1座城市的最短路径,也就是求所经过的距离和的最小值。这是一个经典的单源最短路问题,即求一起点到其余各个顶点的最短路径问题。首先,我们可以把该场景看成是一个带权图,把n个城市看成n个顶点,把两座城市之间的距转载 2016-05-09 16:25:38 · 7478 阅读 · 0 评论 -
十二、图的遍历--(1)图的遍历和生成树
摘自计蒜客:http://www.jisuanke.com/course/35/7315什么是图的遍历呢?从图的某个顶点出发,沿图中的路径依次访问图中的所有顶点,并且使得图中所有顶点都恰好被访问一次,这个过程即为图的遍历。需要注意的是,接下来讨论图的遍历时,都是特指在一个连通图上进行遍历。图的两种最常见的遍历算法:广度优先搜索(BFS)和深度优先搜索(DFS)。从思路上讲,图的遍历转载 2016-05-01 19:37:38 · 3121 阅读 · 0 评论 -
十二、图的遍历--(2)深度优先搜索算法
摘自计蒜客:http://www.jisuanke.com/course/35/7316深度优先搜索(Depth-First-Search,简称DFS)。这是一种常见的用于遍历或搜索树或者图的算法。首先来看看深度优先搜索算法的具体过程:开始我们假设图上所有顶点都未被访问,选择图中任一顶点,开始执行以下操作:1.访问当前顶点V,并将顶点标记为已访问; 2.遍历与顶点转载 2016-05-01 22:06:48 · 4057 阅读 · 0 评论 -
十二、图的遍历--(3)广度优先搜索算法
摘自计蒜客:http://www.jisuanke.com/course/35/7320广度优先搜索算法(Breadth-First-Search, 简称BFS)是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先来看看广度优先搜索的具体方法吧:对于一个连通图,假设一开始所有顶点均未被访问,广度优先搜索的主要操作如下:1.选择图中任意一个转载 2016-05-02 09:35:44 · 1253 阅读 · 0 评论 -
十二、图的遍历--(4)最短路径简化版
摘自计蒜客:http://www.jisuanke.com/course/35/7317小明外出游玩,景区一共有 NN 个地方可以玩耍,编号从 11 到 NN,并且知道了小明现在所在景点的编号 CC,以及 MM 条路径。现在求小明到每个地方分别需要经过多少个地方?输入格式:第一行输入三个正整数 N, M, CN,M,C。代表蒜头君想去 NN 个地方,有 MM 条路径,蒜转载 2016-05-02 16:51:37 · 1700 阅读 · 0 评论 -
六、树和二叉树--(0)什么是树
摘自计蒜客:http://www.jisuanke.com/course/35/1387树形结构广泛存在我们的现实生活里,下面两张图你一定不陌生吧,第一张是 Linux 文件系统结构,第二张是美国福特汽车公司的汽车家谱图。类似的树形结构还有很多,他们都可以抽象成数据结构里的树。和自然界里的树有所类似又有所不同,他们都有且仅有一个树根,树上的元素都是从树根衍生出来的。不同的是自然界里的树,它转载 2016-05-02 21:56:38 · 856 阅读 · 0 评论 -
六、树和二叉树--(1)什么是二叉树
摘自计蒜客:http://www.jisuanke.com/course/35/1389如上图所示,二叉树的每个结点最多只有两个孩子结点,也就是说每个结点最多有两个子树。二叉树有 5 种基本形态:空二叉树,树为空,没有结点;只有根结点的二叉树;只有左子树的二叉树;只有右子树的二叉树;左右子树都有的二叉树。接下来我们来看看二叉树的性质:转载 2016-05-02 22:03:12 · 420 阅读 · 0 评论 -
六、树和二叉树--(2)二叉树的先序遍历、中序遍历、后序遍历
摘自计蒜客:http://www.jisuanke.com/course/35/1394(一)、先序遍历先序遍历时二叉树遍历的一种,对于每个结点,先访问当前结点,然后访问结点的左子树,最后访问结点的右子树。在子树里依然按照这个遍历顺序访问。#includeusing namespace std;class Node {public: int data;转载 2016-05-02 22:11:32 · 364 阅读 · 0 评论 -
六、树和二叉树--(3)已知先序遍历和中序遍历求后序遍历
摘自计蒜客:http://www.jisuanke.com/course/35/1397算法过程如下:在先序遍历中知道根结点的编号,在中序遍历中找到根结点所在位置,那么位置前面的结点就是根结点的左子树上的结点,位置后面的结点就是右子树上的结点。按照以上方法递归建立起一个二叉树,最后调用二叉树的后序遍历函数,输出后序遍历。#include#includeusing names转载 2016-05-02 22:23:32 · 404 阅读 · 0 评论 -
七、二叉排序树--(1)什么是二叉排序树
摘自计蒜客:http://www.jisuanke.com/course/35/1423二叉排序树(Binary Search Tree)。二叉排序树又称为二叉查找树,二叉搜索树。二叉排序树和普通的二叉树在结构上一样,它要么是一棵空树,要么是这样的一棵二叉树:对任意结点,如果左子树不为空,则左子树上所有结点的权值都小于该结点的权值;如果右子树不为空,则右子树上所有结点的权值都大于该结点的权转载 2016-05-16 23:30:49 · 1026 阅读 · 0 评论 -
七、二叉排序树--(2)二叉排序树的创建/插入/查找/删除
摘自计蒜客:http://www.jisuanke.com/course/35/1432直接上代码吧:#includeusing namespace std;class Node {public: int data; Node *lchild, *rchild, *father; Node(int _data, Node *_father = NULL) {转载 2016-05-16 23:36:38 · 594 阅读 · 0 评论 -
十二、图的算法入门--(3)最小生成树---Kruskal算法实现
摘自计蒜客:http://www.jisuanke.com/course/35/7553最小生成树的另一种算法——Kruskal 算法。首先我们定义带权图 G 的边集合为 E,接着我们再定义最小生成树的边集合为 T,初始集合 T 都为空。接着执行以下操作:首先,我们把图 G 看成一个有 n 棵树的森林,图上每个顶点对应一棵树。接着,我们将边集合 E 的每条边,按权值从小转载 2016-05-09 15:54:14 · 598 阅读 · 0 评论 -
十二、图的算法入门--(1)连通分量和FloodFill算法
摘自计蒜客:http://www.jisuanke.com/course/35/7547一、连通分量和FloodFill算法首先,我们来介绍一个概念:子图(subgraph)。若一个图的顶点集和边集分别是另一图的顶点集的子集和边集的子集,则称该图为另一图的子图。换句话说,从一个图里选出一部分顶点和边,只要确保选择的边对应的两个顶点也都被选择,那么所有选出的顶点和边组成的图就是原图的子图转载 2016-05-08 11:05:19 · 3264 阅读 · 0 评论 -
十二、图的算法入门--(2)最小生成树---Prim算法实现
摘自计蒜客:http://www.jisuanke.com/course/35/7551讨论图论的一个经典问题——最小生成树。什么是最小生成树呢?我们先来看这样一个问题:有 n 座城市,现要给城市间铺设高铁,使得任意两座城市之间都可以高铁到达。现已知任意两座城市之间铺设高铁的费用,求问如何铺设可以使得总费用最小。这就是一个经典的最小生成树问题。首先可以把该场景看成是一个带权图,城市转载 2016-05-08 21:49:24 · 729 阅读 · 0 评论 -
数据结构-Hash法-静态Hash法
Hash表,桶、槽、关键字、Hash地址、静态Hash法原创 2017-01-03 20:31:21 · 2219 阅读 · 0 评论 -
十一、图的存储---(3)邻接矩阵的构造和使用
摘自计蒜客:http://www.jisuanke.com/course/35/7195//以下主要针对有向图,如果遇到无向图的情况,将每条无向边对应到有向图中的正反两条边就可以了。#include #include using namespace std;class Graph {private: int **mat; int n;转载 2016-05-01 09:27:47 · 449 阅读 · 0 评论 -
十一、图的存储---(2)邻接矩阵和邻接表
摘自计蒜客:http://www.jisuanke.com/course/35/7191两个常见的图的存储结构——邻接矩阵和邻接表。什么是邻接矩阵呢?所谓邻接矩阵存储结构就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。对于有 nn 个顶点的图 G = (V, E)G=(V,E) 来说,我们可以用一个 n * nn∗n 的矩阵 AA 来表示 GG 中各顶点的相邻关系转载 2016-04-30 16:54:09 · 2767 阅读 · 0 评论 -
九、堆与优先队列---(2)堆插入
/*本程序维护一个大根堆,即父结点的权值大于等于所有子树上的结点权值*先将元素插在堆最后,为保持堆序性,接下来我们要通过比较元素的父结点权值,做从小到大的堆调整。如果元素比父结点权值大,则将元素与其父结点进行交换。如果还比此时的父结点权值大,则继续调整,否则结束调整操作。*/转载 2016-04-28 22:55:15 · 358 阅读 · 0 评论 -
九、堆和优先队列---(1)创建堆
创建一个自定义大小的堆转载 2016-04-28 22:03:45 · 293 阅读 · 0 评论 -
九、堆与优先队列---(3)输出堆中元素并获取和删除堆顶元素
/**将堆中元素存储在数组里,输出堆中元素也就是输出数组里的元素,并获取和删*除堆顶元素*/#includeusing namespace std;class Heap {private: int *data, size;public: Heap(int length_input) { data = new int[le转载 2016-04-28 23:26:45 · 1070 阅读 · 0 评论 -
九、堆和优先队列---(4)堆排序
//堆排序/**堆排序是一种高效重要的排序方法。它的时间复杂度可以达到O(nlogn)。*原理:首先我们得到一个大根堆, 然后从堆的最后一个元素开始,依次往前遍历,每次首先将堆顶元素和当前元素进行交换,交换后再对新的堆顶做一个自上而下的堆调整。*/#includeusing namespace std;class Heap {private: int *d转载 2016-04-29 09:59:18 · 319 阅读 · 0 评论 -
九、堆和优先队列---(5)优先队列解决哈夫曼编码
/*摘自计蒜客:http://www.jisuanke.com/course/35/6525*优先队列解决哈夫曼编码*当哈夫曼树上结点总个数大于 1 时,哈夫曼树的 WPL,等于树上除根结点之外的所有结点的权值之和。如果结点总个数为 1,则哈夫曼树的 WPL 即为根结点权值。*每次从优先队列里取出两个权值最小的元素,累加元素权值后,将两个元素权值的和插入到优先队列里。重复上述操作,直到转载 2016-04-29 14:57:32 · 607 阅读 · 0 评论 -
十、森林与并查集---(0)什么是森林
内容摘自计蒜客:http://www.jisuanke.com/course/35/7051我们都知道植物界里的森林,是由许多棵树组成的,就像下面这张图:在数据结构里,森林是由若干棵互不相交的树组成的。下图就是一个由两棵树组成的森林。两棵树之间分别独立,没有交集。森林有两种遍历方法,分别是先序遍历和后序遍历。请注意,森林是没有和树的中序遍历对应的转载 2016-04-29 16:22:53 · 1270 阅读 · 0 评论 -
十、森林与并查集---(2)并查集的创建
/*摘自计蒜客:http://www.jisuanke.com/course/35/7055*实现并查集类DisjointSet的基本操作*/#include using namespace std;class DisjointSet{private: int * father;public: //初始化就是将每个元素都建立一个只包含该元素的集合转载 2016-04-30 10:22:37 · 454 阅读 · 0 评论 -
十、森林与并查集---(3)并查集的查询
//摘自计蒜客:http://www.jisuanke.com/course/35/7056并查集的查询操作是指查询某个元素的代表。通常用于判断两个元素是否在一个集合内,也是并查集合并操作的基础。原理如下: 首先对node的类型分类讨论。如果node是所在集合的代表元素,也就是对应有根树根的话,则直接返回node的值;但如果node不是所在集合的代表元素,我们就需要不转载 2016-04-30 10:30:20 · 562 阅读 · 0 评论 -
十、森林与并查集---(4)并查集的合并
#include //并查集的合并操作是指将两个元素所在集合求并集,合并为一个集合using namespace std;class DisjointSet {private: int *father;public: DisjointSet(int size) { father = new int[size]; for转载 2016-04-30 11:15:11 · 414 阅读 · 0 评论 -
十、森林与并查集---(5)并查集按秩合并优化
摘自:http://www.jisuanke.com/course/35/7069并查集的查询操作最坏情况下的时间复杂度为O(n), 其中n为总元素个数。极端情况下,有根树会退化成一条链,而查询操作最坏情况下会遍历整条链。由于合并操作需要用到两次查询操作,所以合并操作的最坏时间复杂度也为O(n);为了解决出现这种极端情况,要进行更“智能”地合并:每次合并的时候都尽可能让合并后的有根树的转载 2016-04-30 14:22:10 · 924 阅读 · 0 评论 -
十、森林与并查集---(6)并查集路径压缩优化
摘自:http://www.jisuanke.com/course/35/7070路径压缩优化是并查集最简单、也是非常有效的一个优化。在执行find_set(a)的过程中,路径压缩优化会将从a到d路径上的所有点都指向有根树的根,也就是d。这么做的好处在于:通过这样的处理,能将有根树的高度尽可能降低,下次再进行查询或合并操作的时候时间开销就更小了。路径压缩优化实现起来并不复杂,在转载 2016-04-30 14:47:36 · 593 阅读 · 0 评论 -
十、森林与并查集---(7)游戏分组
有n位同学要玩游戏,要求分组方案中将所有得好友组合都被分在一组。输入格式:第一行输入两个数n和m,1接下来输入m行,每行输入两个数a和b,表示编号a和编号b的同学是好友关系,0输出格式:输出一行,表示最多可以分成多少组。样例1:输入:5 20 22 3输出:3 样例说明:第一组:编号为0、2 、3的同学第二组:编号为1的同学第转载 2016-04-30 15:32:26 · 553 阅读 · 0 评论 -
十一、图的存储---(0)什么是图
摘自计蒜客:http://www.jisuanke.com/course/35/7180在一个社交网络中,每个帐号和他们之间的关系构成了一张巨大的网络,就像下面这张图:那么在电脑中,我们要用什么样的数据结构来保存这个网络呢?这个网络需要用一个之前课程里未提到过的数据结构,也就是接下来要讲解的图结构来保存。到底什么是图?图是由一系列顶点和若干连结顶点集合内两个顶点的边转载 2016-04-30 16:09:31 · 575 阅读 · 0 评论 -
十一、图的存储---(1)图的常用概念
摘自计蒜客:http://www.jisuanke.com/course/35/7189图常用的几个概念:有很少边或弧(如 ee 顶点的度是指依附于某个顶点的边数。下图是电视剧《琅琊榜》的人物关系图,从图上我们发现和顶点“萧景琰”直接相关的有 4条关系,则我们称该顶点的度为 4。相应的,我们称顶点“萧景睿”的度为2。在有向图中,我们需要学习顶点的入度和出度这两个概念。顶点的转载 2016-04-30 16:31:19 · 517 阅读 · 0 评论 -
数据结构框架图
数据结构框架图转载 2017-04-24 16:23:31 · 1001 阅读 · 0 评论