数据结构与算法
Q_C
这个作者很懒,什么都没留下…
展开
-
最短路径之Floyd算法
用途:求一个图中每一对顶点之间的最短路径。算法描述: floyd算法的基本思想是动态规划。 假设 dis[i][j] 表示节点i到节点j的最短距离,则有如下递推公式: dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);即节点i到节点j的最短路径有可能直接到达,也有可能借助另一节点k到达。其中,对k进行遍历,使dis[i][k] + dis[k]原创 2016-03-15 08:49:09 · 360 阅读 · 0 评论 -
最短路径之Dijkstra算法
用途: 计算一个图中源点到其它所有点的最短路径。算法描述:将图的所有顶点分成两个集合,S集合与T集合。其中,S集合包含了已经求出最短路径的所有顶点,T集合包含了其余顶点。初始化时,S集合仅包含起始点v0.遍历T集合中的所有顶点,找到与起始点距离最小的点,将其加入到S集合。更新dis[]数组。dis数组存储起始点到其余各顶点的最短距离。重复2,3步骤,直到S中包含了图的所有顶点。算法流程:原创 2016-03-13 11:04:11 · 345 阅读 · 0 评论 -
Tarjan算法
用途: 求一个图的强连通分量。算法介绍: 在一个图中,如果两个顶点相互可以到达,则称这两个点强连通。若一个图的每两个顶点都强连通,称此图为一个强连通图。一个图的最大强连通子图,称为强连通分量。 Tarjan算法以深度优先搜索为基础。定义dfn[], low[],其中,dfn[i]表示节点i在第几层被搜到(通常被称为时间戳),low[i]表示节点 i 所在的强连通子图的根节点的dfn值。 算法原创 2016-03-17 09:38:06 · 276 阅读 · 0 评论 -
栈的应用之算术表达式求值
栈是一种后进先出的数据结构。表达式求值是对栈的一个典型的应用。 对于如下一个表达式: 1 + 2 * (3 + 4)此算术表达式由一些操作符和操作数组成。其中,操作符有‘+’、‘*’、‘(’等,操作数有‘1’、‘2’、‘3’等。对于操作符来说,其运算是有优先级的。比如,上述表达式中,3+4应该先进行操作,将得到的结果再与2相乘。算符间的优先关系如下: 运算符 + - *原创 2016-04-28 22:12:38 · 12056 阅读 · 4 评论 -
排序算法之快速排序
基本思想: 通过一趟排序把数据分成两部分,其中,一部分的数据比另一部分数据都要小。然后,对得到的两部分数据分别进行上述过程,由此,可以得到一个有序序列。算法过程: 假设要排序的数组为data[0] ~ data[N - 1]. 首先要选取一个数据作为关键数据,一般选取数组第一个元素。然后将所有比它小的数都放到左边,将所有比它大的数都放到右边。完成一趟快速排序后对得到的两部分数据递归重复上述步骤。原创 2016-05-31 10:22:54 · 689 阅读 · 0 评论 -
并查集
概述并查集是用于集合的一种操作。主要用于集合的合并和查找。过程详解假设有两个集合,分别为集合A和集合B。 其中,A= {1,2,3,4}, B = {5,6}。 现将集合A表示成一个树的结构,如下所示:其中,1为树的根节点,即为集合A的代表元素。在存储集合A时,利用一个数组,每个元素对应的数组下标值为其父节点的值。当没有父节点时,数组对应的值为-1。 集合A的存储如下: i A[i]原创 2016-10-18 16:57:31 · 218 阅读 · 0 评论 -
最小生成树之Kruskal算法
问题定义在一个无向连通图中,如果存在一个连通子图,包含原图所有的顶点和部分边,且这个子图不存在回路,则称这个子图为原图的一个生成树。在所有生成树中,边权之和最小的称为最小生成树。算法原理下面从数学上证明Kruskal算法的正确性。 在一个连通图中,任意取部分节点属于集合A,剩余部分节点属于集合B。可以证明,此无向连通图的最小生成树必定包含连通两个集合的权值最小的边。 利用反证法,证明过程如下:原创 2016-10-20 10:55:29 · 613 阅读 · 0 评论 -
动态规划算法之集合划分
问题描述:在数学中,集合 X 的划分是把 X 分割到覆盖了 X 的全部元素的不交叠的“部分”或“块”或“单元”中。更加形式的说,这些“单元”关于被划分的集合是既全无遗漏又相互排斥的。假设集合A = {1,2,3}。根据其划分的集合数,划分结果如下:划分成一个集合: A1 = {1,2,3}; 共一种方法划分成两个集合: A1 = {1,2},A2 = {3}; 或 A1 = {1,3},A原创 2016-12-04 11:43:49 · 1753 阅读 · 0 评论