算法导论
文章平均质量分 63
xlf13872135090
这个作者很懒,什么都没留下…
展开
-
不相交集的find和union
两个不相交集合是指S1 ∩ S2 == {}空集,一般包含两个操作,find和union操作find:返回包含给定元素的集合union把两个集合合并成一个集合这里只用到了数组来表示这个数据结构,这个数组中保存着每个元素的等价类的名字#include #include using namespace std;class DisjSets{public: explicit原创 2013-12-24 17:02:37 · 1369 阅读 · 0 评论 -
算法导论第32章 字符串匹配
书中依次讲了4种方法,朴素算法、RabinKarp算法、有限自动机算法、KMP算法1、朴素算法:算法用一个循环来找出所有有效位移,该循环对n-m+1个可能的每一个s值检查条件P[1...m] = T[s+1....s+m];//朴素的字符串匹配算法void nativeStringMatcher(string st, string sp){ int n = st.length()原创 2014-01-08 16:07:30 · 3307 阅读 · 1 评论 -
算法导论第24章 单源最短路径
本章中有三个最短路径算法1、Bellman-Ford算法:解决的是一班情况下的单源最短路径问题,可适用于边的权重为负值,且有环路的情况,算法返回一个bool值,表明是否存在一个从源结点可以到达的权重为负值的环路。如果存在,则返回false,否则,可以求出最短路径和这条路径的权重。2、Dag_Shortest_Paths: 解决有向无环图的单源最短路径问题,算法根据结点的拓扑排序对带权重的原创 2014-01-06 22:07:26 · 3718 阅读 · 0 评论 -
所有结点对的最短路径问题之Johnson算法
Johnson算法可以在O(V*V lgV + VE)的时间内找到所有节点对之间的最短路径,对于稀疏图来说,算法的渐进表现要由于重复平方法和FloydWarshall算法,如果图没有权值为负值的环路,则返回所有结点对的最短路径权重的矩阵,否则,报告图有权值为负的环算法中运用Diskra、BellmanFord算法,使用的技术是重新赋予权重,如果图G = (V, E)中权值全为非负值,则通过原创 2014-01-05 16:09:48 · 12926 阅读 · 0 评论 -
算法导论第25章 所有结点对的最短路径问题Floyd等
dddd原创 2014-01-05 22:08:52 · 5079 阅读 · 0 评论 -
二叉查找树、红黑树、B树性质
二叉查找树性质“:1、遍历一棵含有n个节点的二叉查找树所需时间为Θ(n)(包括中序、前序、后续)2、对一棵高度为h的二叉查找树,动态操作集合操作search、miniMum、maxiMum、successor和predecessor、insert、delete的运行时间均为Θ(n)3、一棵在n个关键字上随机构造的二叉查找树的期望高度为O(lgn)红黑树定义:红黑原创 2013-12-16 09:11:02 · 1468 阅读 · 0 评论 -
跳跃表
【引言】二叉树是我们都非常熟悉的一种数据结构。它支持包括查找、插入、删除等一系列的操作。但它有一个致命的弱点,就是当数据的随机性不够时,会导致其树型结构的不平衡,从而直接影响到算法的效率。跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找、插入、删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领。 而且最重要的一点,就是它的编转载 2013-12-22 15:18:40 · 705 阅读 · 0 评论 -
算法导论第17章 摊还分析
在摊还分析中,我们求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价,从而说明一个操作的平均代价是很低的,即使序列中某一单一操作的代价很高,不涉及改了,但可以保证最坏情况下每个操作的平均时间。摊还分析中主要的三种方法:1、聚合分析 2、核算法(即记账法) 3、势能法1、聚合分析:证明对所有的n,一个n个操作的序列最坏情况下花费的总时间为T(n),因此,在最坏情况下,每原创 2013-12-21 11:04:20 · 5491 阅读 · 0 评论 -
算法导论 第23章 KrusKal算法 Prim算法
终于写出来了 ,这个算法的准备工作也忒多了,先打好图的结构的基础,然后写一个实现不相交集合的数据结构,然后结合这两个结构完成这个算法。写了两天,终于把这些都解决了,今天终于出来成果了,好激动,好\(≧▽≦)/,忍不住欢呼雀跃,功夫都没白费,不枉费我这星期六日还在写,嘿嘿~~~~~图的最小生成树算法:思路很简单,1、最开始时,每个结点都看成一棵树,使每个结点都成为一个集合原创 2013-12-29 16:37:32 · 1743 阅读 · 0 评论 -
算法导论第16章 贪心算法之活动选择
问题描述:假定有一个n个活动的集合S = {a1, a2, ...., an}, 这些活动使用同一个资源,而这个资源在某一刻只能供一个活动使用。每个活动ai有一个开始时间si和结束时间fi, 0 ≤ si 如果被选中,任务ai发生在半开时间区间[si, fi)。 如果两个活动ai, aj满足[si, fi), [sj, fj)不重叠,则他们是兼容的。即若si ≥ fj 或 sj ≤ fi,原创 2013-12-19 20:30:03 · 1538 阅读 · 0 评论 -
算法导论第15章 最长公共子序列问题(LCS)
#include using namespace std;const int m = 8;const int n = 7;//返回值结构struct twoArrayPair{ char b[m][n]; int c[m][n];};/*************************************************************//*c[m原创 2013-12-19 16:40:16 · 742 阅读 · 0 评论 -
算法导论15章 动态规划之矩阵链乘法问题
矩阵链乘法问题:给定一个n个矩阵的序列(矩阵链),矩阵Ai的规模为Pi-1 * Pi, 求完全括号话方案,使得计算成绩A1*A2*......*An所需标量乘法次数最少。注意:求解矩阵链乘法问题并不是要真正进行矩阵相乘运算,只是确定代价最低的计算顺序,确定最优计算书序所花费的时间通常要比随后真正进行矩阵相乘所节省的时间要少。两个矩阵A、B相容,即A的列数等于B的行数时, 才能相乘。n个原创 2013-12-18 17:30:19 · 2281 阅读 · 0 评论 -
算法导论第15章 最优二叉树
又出bug了,w的值是对的,为啥e数组的值一直不对?#include #include #include using namespace std;#define EPSILON 0.0000000001const int m = 7;const int n = 6;struct twoArray{ float e[m][n]; float root[n][n];};/**原创 2013-12-19 16:15:31 · 675 阅读 · 0 评论 -
红黑树C++
红黑树定义:1、每个结点要么是红的,要么是黑的2、根结点是黑的3、每个叶结点,即空节点是黑的4、如果一个结点是红的,则它的两个儿子是黑的5、对每个结点,从该结点到其子算结点的所有路径上包含相同数目的黑结点。红黑树性质:1、一棵有n个内结点的红黑树的高度至多为2lg(n+1)2、RB-insert总共花费为O(lgn)时间,原创 2013-12-17 10:37:02 · 727 阅读 · 0 评论 -
算法导论15章 动态规划 之 钢条切割
钢条切割问题,递归方法实现:#include using namespace std;int cutRod(int *p, int n){ if (n == 0) return 0; int q = -1; for(int i = 0; i < n; i++) q = max(q, p[i]+cutRod(p, n-i-1));原创 2013-12-17 15:18:38 · 2763 阅读 · 3 评论 -
34章 NP完全
1、P问题P ={ L ∈{0,1}*: 存在一个算法A,可以在多项式时间内判定L}P也是能在多项式内被接受的语言类P = {L : L能被一个多项式时间算法所接受}PATH = {: G = (V,E)是一个无向图,u,v ∈ V, k >= 0是一个整数,即G中从u到v存在一条长度至多为k的路径}是P问题,可以在多项式时间内被接受2、NP问题复杂类NP是能原创 2014-01-08 20:52:09 · 2559 阅读 · 0 评论