摘要: 给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strongly Connected)。如下图中,任意两个顶点都是互相可达的。实际上,解决该问题的较好的方式就是使用强连通分支算法(SCC:Strongly Connected Components),可以在 O(V+E) 时间内找到所有的 SCC。如果 SCC 的数量是 1,则说明整个图是强连通的。实现 SCC 的一种算法就是 Kosaraju 算法。Kosaraju 算法基于深度优先搜索(DFS),并对图进行两次 DFS 遍历。Kosaraju 算法的思想就是,如果从顶点 v 可以抵达所有顶点,并且所有顶点都可以抵达 v,则说明图是强连通的。 阅读全文
posted @ 2015-01-30 22:29 sangmado 阅读(4291) 评论(0) 推荐(0) 编辑
摘要: 有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的。通过 Kosaraju 算法,可以在 O(V+E) 运行时间内找到所有的强连通分支。Kosaraju 算法是基于深度优先搜索(DFS),算法的描述如下:创建一个空的栈 S,并做一次 DFS 遍历。在 DFS 遍历中,当在递归调用 DSF 访问邻接顶点时,将当前顶点压入栈中;置换图(Transpose Graph);从栈 S 中逐个弹出顶点 v,以 v 为源点进行 DFS 遍历。从 v 开始的 DFS 遍历将输出 v 关联的强连通分支。 阅读全文
posted @ 2015-01-30 22:28 sangmado 阅读(2484) 评论(0) 推荐(1) 编辑
摘要: Union-Find 算法为不相交集合数据结构中的非常有用的操作。其通常使用链表或一维数组来实现,另一种实现方式是使用有根树来表示集合,树中的每个节点都包含集合的一个成员,每棵树表示一个集合,形成不相交集合森林(Disjoint-set forest)。每棵树的根包含了集合的代表,并且是它自己的父节点。通过引入两种启发式策略,可以获得目前已知的、渐进意义上最快的不想交集合数据结构。第一种启发式策略是按秩合并(Union by Rank),其思想是使包含较少节点的树的根指向包含较多节点的树的根。第二种启发式策略是路径压缩(Path Compression),在 Find 操作中,使查找路径上的每个节点都直接指向根节点。路径压缩并不改变节点的秩(Rank)。 阅读全文
posted @ 2015-01-30 20:50 sangmado 阅读(2849) 评论(0) 推荐(1) 编辑
摘要: 不相交集合数据结构(Disjoint-set)是一种用于跟踪集合被分割成多个不相交的子集合的数据结构。Union-Find 算法为该数据结构提供了两种非常有用的操作:Find:判断子集合中是否存在特定的元素。可以用于检测是否两个元素存在于相同的子集合中。Union:将两个不子集合合并成新的子集合。Union-Find 算法的一个具体的应用就是在无向图(Undirected Graph)中检测是否存在环。 阅读全文
posted @ 2015-01-30 20:49 sangmado 阅读(3461) 评论(1) 推荐(2) 编辑
摘要: 给定有向图 G = (V, E),需要判断该图中是否存在环路(Cycle)。深度优先搜索(DFS:Depth-First Search)可以用于检测图中是否存在环。DFS 会对一个连通的图构造一颗树,如果在构造树的过程中出现反向边(Back Edge),则认为图中存在环路。对于非连通图,可以对图中的不同部分分别进行 DFS 构造树结构,对于每棵树分别检测反向边的存在。在 DFS 对图进行遍历时,将遍历过的顶点放入递归栈中,如果新遍历的顶点已经存在于递归栈中,则说明存在一个反向边,即存在一个环。 阅读全文
posted @ 2015-01-30 20:48 sangmado 阅读(15503) 评论(0) 推荐(0) 编辑
摘要: 深度优先搜索(DFS:Depth-First Search)是一种图搜索策略,其将搜索限制到 2 种操作:(a) 访问图中的一个节点;(b) 访问该节点的子节点。对图的深度优先搜索与对树(Tree)的深度优先遍历(Depth First Traversal)是类似的,区别在于图中可能存在环,所以可能会遍历到已经遍历的节点。 阅读全文
posted @ 2015-01-30 20:46 sangmado 阅读(4247) 评论(1) 推荐(3) 编辑
摘要: 广度优先搜索(BFS:Breadth-First Search)是一种图搜索策略,其将搜索限制到 2 种操作:(a) 访问图中的一个节点;(b) 访问该节点的邻居节点。广度优先搜索(BFS)由 Edward F. Moore 在 1950 年发表,起初被用于在迷宫中寻找最短路径。对图的广度优先搜索与对树(Tree)的广度优先遍历(Breadth First Traversal)是类似的,区别在于图中可能存在环,所以可能会遍历到已经遍历的节点。BFS 算法的实现通常使用队列(Queue)数据结构来存储遍历图中节点的中间状态。 阅读全文
posted @ 2015-01-30 20:45 sangmado 阅读(4468) 评论(0) 推荐(0) 编辑
摘要: 有一个小偷在偷窃一家商店时发现有 n 件物品,第 i 件物品价值 vi 元,重 wi 磅,此处 vi 和 wi 都是整数。小偷希望带走的物品价值越高越好,但他的背包至多只能装下 W 磅的东西,W 为整数。为尽可能多的带走更多的东西,小偷可以带走物品的一部分,而不必做出 0-1 的二分选择。那么,小偷应该带走哪些物品呢? 阅读全文
posted @ 2015-01-30 20:44 sangmado 阅读(2182) 评论(2) 推荐(0) 编辑
摘要: 本文汇编了一些常见的字符串算法,包括字符串反转算法、字符串左旋算法、字符串右旋算法、字符串旋转匹配算法、字符串包含算法、字符串删除算法、字符串转整数算法、字符串全排列算法、字符串字典序组合算法等。 阅读全文
posted @ 2015-01-30 20:43 sangmado 阅读(7329) 评论(0) 推荐(4) 编辑