图与图的简单算法

树结构分类

树这种存储结构是为了是数据更加有序,这样才有利于更快的遍历。但同时,构造它需要花费一些时间和空间。

1.   完全二叉树:在第n层从左到右没有填满节点之前,不能对第n+1层进行填充。这样的结构是为了更好的存储,一个简单的数组就能进行存储,下标作为指针,如果n为树根,2n为左孩子,2n+1为右孩子。

2.   大顶堆(小顶堆类似):任何一个根节点的值始终大于子树中的任何一个值。当数据量很大,又需要获得前几名的对象的时候,大顶堆最好不过了。

3.   二叉堆:即是完全二叉树,又是堆。

4.   红黑树:平衡二叉树的一种。

图的数据结构

1.   邻接表:对于稀疏矩阵比较实用,占空间少,更加紧凑。

2.   邻接矩阵

3.   十字链表(未接触)

广度优先搜索(BFS,Breadth First Search)

1.   解决的问题

a)   求单源最短路径

b)   生成一棵“广度优先搜索树”,树的所有节点即为图的所有节点,树的枝干即为图的边,但不是所有边。

2.   它的优点在于它的搜索过程

BFS只用第k层的顶点全部被遍历完毕,才会对k+1层进行遍历。因此当target的分布很密集,最好是在root很近的位置,那么BFS很轻松的获得结果。

而DFS适用于target比较少,target在树中的位置远离root。

而且,如果单层的节点数目过于庞大,BFS就会因内存耗尽而崩溃;DFS不会出现这样的问题,这与它们的遍历过程有关系。

That heavily depends on thestructure of the search tree and the number and location of solutions (akasearched-for items). If you know a solution is not far from the root of thetree, a breadth first search (BFS) might be better. If the tree is very deepand solutions are rare, depth first search (DFS) might take an extremely longtime, but BFS could be faster. If the tree is very wide, a BFS might need toomuch memory, so it might be completely impractical. If solutions are frequentbut located deep in the tree, BFS could be impractical. If the search tree isvery deep

——from stackoverflow

3.   算法过程

a)   现规定三种颜色,未遍历的为white,邻接顶点没有遍历完的节点为grey,邻接顶点全部遍历完毕的为black。

b)   将将要遍历的顶点入队,利用队列的性质完成遍历

4.   时间复杂度O(|V|+|E|)

主要的操作时队列的操作和对邻接顶点的遍历,队列操作每个顶点仅有一次,总次数为|V|,邻接顶点遍历操作为|E|

深度优先搜索

1.   解决的问题:

a)   生成不想交的森林(即有向图图中的强连通分量或者无向图中的连通分量)

b)   进行拓扑排序,生成强连通分量或连通分量


2.   与BFS不同,DFS使用的是栈或者递归,这样可以保证搜索的方向是向下的。

Kruskal算法

1.  新建图G,G中拥有原图中相同的节点,但没有边

2.  将原图中所有的边按权值从小到大排序

3.  从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中

4.  重复3,直至图G中所有的节点都在同一个连通分量中

Prim算法

1.  输入:一个加权连通图,其中顶点集合为V,边集合为E;

2.  初始化:Vnew ={x},其中x为集合V中的任一节点(起始点),Enew = {};

3.  重复下列操作,直到Vnew = V:

a)  在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则是V中没有加入Vnew的顶点(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);


b)  将v加入集合Vnew中,将(u, v)加入集合Enew中;

4.  输出:使用集合Vnew和Enew来描述所得到的最小生成树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值