algos&data_structure
march_on
这个作者很懒,什么都没留下…
展开
-
动态规划—最长公共子序列LCS
最长公共子序列问题可以描述如下:给定两个序列X[0,····m]和Y[0,····n],找出X和Y的最大长度的公共子序列S,即最长公共子序列问题(longest common sequence )。分析: 假设Z[0,····k]是X和Y的一个LCS,原创 2011-09-11 16:03:02 · 1323 阅读 · 0 评论 -
回溯 图着色问题
图着色问题(Graph Coloring Problem, GCP),又称着色问题,是最著名的NP-完全问题之一。给定一个无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为K个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的K值。先考虑三着色问题。思路:1.对图中的每个顶点,选择三种颜色之一对其进行着色。2.如果该着色合法原创 2011-11-30 20:09:43 · 2274 阅读 · 0 评论 -
回溯 八皇后问题(递归和非递归)
8皇后问题:如何在8 x 8的国际象棋棋盘上安排8个皇后,使得没有两个皇后能互相攻击?( 如果两个皇后处在同一行、同一列或同一条对角线上,则她们能互相攻击。)解向量为长度为8的数组,记为solution。因为共有8个皇后,而棋盘刚好为8*8,所以每一行肯定会有一个皇后,那么我们约定solution[i]表示第i+1个皇后放在第i+1行的第几列。solution中的列从1开始记。回溯算法的思原创 2011-11-30 16:35:41 · 7007 阅读 · 0 评论 -
单源最短路径(bellman-ford 、dijkstra)
对一个带权有向图G=(V,E),给定一个源顶点S,找出S到图中其他顶点v的最短路径即单源最短路径问题。该问题还有很多变体,像单终点最短路径、单对顶点最短路径、每对顶点间的最短路径等等。最短路径问题是具有最优子结构的:一对顶点间的最短路径包含了该路径上的顶点间的最短路径。直观上理解,如果该路径上的两个顶点间的路径pij不是最短路径,那么用这两个顶点间的最短路径代替pij,那么就会出现一条更短的路原创 2011-11-01 20:16:35 · 1419 阅读 · 0 评论 -
最小生成树算法(prim&kruskal)
无向连通图 G = (V, E)的生成树是它的极小连通子图:连接了图中所有的顶点,有保持图连通的最少的边,且不包含回路(最少的边这一条件已经隐含了不含回路的性质,同时,生成树是一种树,也是不允许有回路的)。在所有的生成树中,权值最小的树就是最小生成树(minimum spanning tree)。由最小生成树的性质可知,它的边数比顶点数小一,而且一个图的最小生成树往往是不唯一的。求解无向连通图原创 2011-11-01 20:08:01 · 2507 阅读 · 1 评论 -
最长单调递增子序列
题目:给定一个序列X[0···n],找出它的最长的单调递增子序列(Longest Increasing Subsequence)分析:思路一: 将序列X按非递减顺序排列,形成新序列Y,问题就转变成求解X和Y的LCS。假设使用快速排序,则排序过程的时间复杂度为O(nlgn),而求两个序列的LCS的时间复杂度为O(n2)(因为X、Y长度相等),综合可知该解法的时间复杂度为原创 2011-09-11 22:23:54 · 12429 阅读 · 4 评论 -
深度优先搜索和广度优先搜索
将图记为G(V,E)。图的表示一般有两种方法:邻接矩阵和邻接表。邻接矩阵是一个为|V|*|V|的二维矩阵,记为array,array[i][j]表示节点i和节点j之间是否存在边,对于带权图(又称为网),array[i][j]还可以表示节点i和节点j之间边的权。因为邻接矩阵大小和图中的边数|E|无关,所以邻接矩阵更适合于稠密图(|E|接近|V|²)。邻接矩阵同样适合程序需要经常判断两个顶点之间是否存原创 2011-10-24 17:01:53 · 4142 阅读 · 0 评论 -
堆、堆排序、优先级队列(c++实现)
到目前为止,我所知道的堆有两种,一是内存的一种,常见的用途就是动态内存分配了(在c/c++中就是这样),另一种是这里所要论述的一种数据结构。一、堆数据结构中的堆又叫二叉堆,顾名思义,我们可以把它看成一颗完全二叉树,每个元素最多有2个孩子,分别看做左孩子和右孩子。根据元素和它的孩子的关系,堆又可以分为最大堆和最小堆。最大堆的性质是父母的值不小于左右(如果都有)的值,相应地,最小堆就是原创 2011-10-19 17:39:56 · 3522 阅读 · 1 评论 -
快速排序的递归实现
快速排序通常是排序的最佳选择,因为其平均的运行时间为O(nlgn )。最坏情况下每次划分都产生两个分别包含n-1个元素和一个元素的区域,此时时间复杂度为o(n²)。最佳情况下每次划分都将数组分成两个长度差不多的区域,此时时间复杂度与平均性能差不多。 快速排序的递归原创 2011-09-10 16:37:20 · 1061 阅读 · 0 评论 -
活动选择问题(动态规划算法和贪心算法)
问题描述: 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动a都有一个开始时间和结束时间,且 0动态规划:一、 定义子集合Sij = { ak S : f i 假设S中的活动已按照结束时间递增的顺序排列,则Sij具有如下的性质:1.当i 2.假设ak属于Sij,那么ak将把原创 2011-09-22 10:33:02 · 10491 阅读 · 2 评论