算法和数据结构
文章平均质量分 81
bravepam
代码偏执狂
展开
-
算法导论 第13章 13-2 红黑树上的连接操作
题目解答: a) 由题意可知:现在红黑树节点的域中增加了黑高度域bh。回顾习题13.3-3和13.4-5,题目要求我们标出图中每个节点的黑高度,具体见下面: 习题13.3-3 假设开始时所有子树黑高度为k 题目习题13.4-5 删除过程并不能假设所有子树黑高度为k,但是可以设A节点,即x所指向的节点(注意A现在是双黑原创 2015-02-01 21:08:23 · 1740 阅读 · 0 评论 -
算法导论 第20章 斐波那契堆
斐波那契堆的定义 参看19章 二项堆我们可以看到对于可合并堆操作,二项堆均有O(lgn)的时间,对于本章将要讨论的斐波那契堆也支持这些操作,而且它有着更好的渐进时间界,对于不涉及元素删除的操作,它有着O(1)的时间界。 和二项堆一样,在仅支持可合并对操作(这些操作请参考19章)的情况下,每个斐波那契堆也是由一组二项树组成,只不过这些树均是无序的。无序二项树的定义和二项树类似:无原创 2015-03-29 10:16:02 · 2364 阅读 · 0 评论 -
算法导论 第18章 B 树
前言 B树和红黑树一样,也是一种平衡树。但是前者主要用在数据库系统或者文件系统中,有助于降低磁盘I/O次数;此外,B树可以有很多的子女,几十或者上千个不等,“分支因子”较大。B树定义 B树是递归定义的,每个节点,都可以看做是一棵以该节点为根的子B树。B树高度 B树的操作 本篇博客实现的B树提供以下操作: 1、判空操原创 2015-04-03 21:08:32 · 1483 阅读 · 0 评论 -
算法导论 第18章 思考题18-2 2-3-4树的链接与分裂,推广至B树
题目 2-3-4树是B树的特例,是度为2的B树。在B树这篇博客中,我们实现的B树是一个模板,因此要得到2-3-4树,即度为2的B树非常容易,只要如是声明就可以了——Btree bt,其中int是所存元素类型。 在本题中,要实现的是2-3-4树的链接与分裂。参看红黑树的连接操作我们不难得到2-3-4树的链接方法。现在,我们对于2-3-4树的链接也予以推广,即实现任意度数的B树原创 2015-04-10 19:45:49 · 2379 阅读 · 0 评论 -
算法导论 第24章 单源最短路径
最短路径的定义 在最短路径问题中,给出的是一个带权有向图G=(V,E),加权函数w:E->R为从边到实值的映射。路径p = 的权是其组成该路径的各边的权值之和:定义从u到v的最短路径的权为:从顶点u到v的最短路径为权值等于最短路径权值的任何路径。单源路径问题的诸多变体 单终点最短路径:找出每个顶点v指向终点t的最短路径。将原有向图的每条边反向原创 2015-04-05 15:28:25 · 2737 阅读 · 0 评论 -
算法导论 第21章 用于不相交集合的数据结构
不相交集合的定义和操作 不相交集合的数据结构保持一组动态集合,每个集合通常有一个代表(也是该集合的成员),用以标识该集合。显然,由于这组动态集合是不相交的,那么集合代表(标识)自然也是独一无二的。对于不相交集合,我们希望其能够支持以下操作: 1、MAKE-SET(x):创建一个集合,只含有一个元素x,那么该集合的代表自然就是x; 2、FIND-SET(x):返回元素x原创 2015-04-07 14:21:22 · 2260 阅读 · 0 评论 -
算法导论 21-3 Tarjan的脱机最小公共祖先算法
是原创 2015-04-07 15:32:01 · 1927 阅读 · 0 评论 -
算法导论 32.4-5 字符串的循环旋转问题
题目 根据这个题目的意思,我们来做一点小改变:即给定字符串s1和s2(长度分别为n,m),判断s2是否是s1的一次移位而生成的字符串的子串。之所以这样改变,是因为在这个问题的解法中,第二个高效解法可以很好的解决本题目。因而现在,我们只讨论这个改变后的问题。解法一:直接法,暴力破解。时间复杂度O(n(m+n)) 1、对s1进行一次循环移位; 2、判原创 2015-04-29 19:15:50 · 1833 阅读 · 0 评论 -
算法导论 第19章 二项堆
二项树 和其他树一样,二项树也是递归定义的。如下图,二项树B0只包含一个节点。二项树Bk是由两颗二项树Bk-1连接而成:其中一棵是另外一棵树的根的左孩子。下图展现了二项树B0到B4。二项树的性质 对于二项树Bk,有如下性质: 1、有2^k个节点; 2、树高为k; 3、在深度i处,恰好有个节点; 4、根的度为k,大于任何其他节点的度,并原创 2015-03-26 19:34:31 · 3380 阅读 · 0 评论 -
算法导论 第13章 红黑树
对于一颗普通的高度为h的二叉查找树,对于诸如locate、predecessor、successor、minimum、maximum、insert、erase等基本操作的时间复杂度一般都为O(h),这样,在树高较低时,这些操作实行就会很快。但是,经过长期的插入和删除后,树高可能发生较大变化,极端情况下甚至退化为链状,此时树高为O(n),那么上述操作的性能将大大降低。而红黑树作为一种加入了平衡策略的原创 2015-01-31 11:17:07 · 968 阅读 · 0 评论 -
算法导论 13-3 AVL平衡二叉树
题目 AVL树的主要操作 在本篇博客中我们只实现AVL平衡树的insert、erase、edit和locate以及两个遍历操作,当然还包括一些配套函数,主要论述insert和erase操作,其他诸如successor、minimum等等操作可以参考二叉查找树和红黑树,实现很类似,并没有太大不同。 此外,这些操作我将全部用递归实现,所以和上述两种树以及treap(树堆)节原创 2015-06-01 14:17:18 · 2058 阅读 · 0 评论 -
字符串的相似度
问题描述 给定两个字符串s1和s2,测定它们之间的相似度。相似度的定义如下:假设s1 = "abcde",s2 = "abcd",那么我们可以经过一次编辑(删掉s1的字符e,或者在s2末尾插入字符e)将它们变为相同的,这个编辑次数称为距离,而相似度为1/(距离+1)。 那么,我们只要求计算出任意两个字符串的距离,问题便迎刃而解了。关于编辑总共有三种操作,删除、插入或者修改(复制原创 2015-04-29 21:27:06 · 658 阅读 · 0 评论 -
二叉树(续) 三种层次遍历算法
前言 关于二叉树我们在前面已经细致的讨论,具体的二叉树实现请参考前面的链接,这篇博客重点放在二叉树的三种遍历算法上面。解法一: 对于二叉树的层次遍历,我们很容易想到,如果能够输出每一层的节点,那么整棵树的层次遍历就只需要不断调用它即可,如下图:层次遍历的结果为: 12 5 18 2 9 15 19 17原创 2015-05-16 14:37:35 · 3917 阅读 · 0 评论 -
算法导论 第六章 二叉堆
前言 通常的编程学习中,我们都会接触到堆这种树结构,本篇博客主要讨论最常见的二叉堆,并将其和斐波那契堆与二项堆进行一些比较。二叉堆的定义 二叉堆顾名思义是形如二叉树的堆,而且是完全二叉树,不过其底层实现通常都是用的数组。因为如果将其从上到下,从左到右依次从1开始编号,正好可以填满数组的前部分,更重要的是实现简单高效,编号此时即为数组索引。如下图即为一个最大堆:原创 2015-05-17 15:26:34 · 1321 阅读 · 0 评论 -
算法导论 第12章 二叉查找树
二叉查找树的概念和性质 二叉查找树(Binary Search Tree)是这样的一棵树:设节点x的左右孩子分别为y,z,那么key[x] = key[x],而它的以y和z分别为根的左右子树也是满足这样条件的二叉树。 二叉查找树支持多种动态集合操作,包括locate,minimum,maximum,predecessor,successor,insert以及eras原创 2015-01-30 16:01:43 · 792 阅读 · 0 评论 -
算法导论 第14章 数据结构的扩张(一)动态顺序统计树
动态顺序统计树(Orderly Statistic Tree) 在一个包含n个元素的集合中,第i个顺组统计量就是该集合的第i小关键字,这里的i我们称为秩。在一个无序的集合中,确定任意一个统计量都能在O(n)的时间内找到。现在,我们介绍一种更快速的方法,利用对红黑树,作出一些修改和扩张,使得任意统计量的查找耗时降为O(lgn),这样的一棵树称之为顺序统计树。 顺序统计原创 2015-02-02 10:51:05 · 1004 阅读 · 1 评论 -
算法导论 第23章 最小生成树 思考题
23-1 次最优的最小生成树 (c)根据普利姆算法计算出最小生成树,并得到树的parent数组(里面记录了各顶点的父顶点)。运用动态规划方法即可,状态转移方程如下:设顶点个数为V,那么时间复杂度为O(V2) 。(d)1、根据普利姆算法计算得出最小生成树,并得到max[u,v];2、对于没有加入到MST中的每条边,设为(x,y),计算出,称为原创 2015-03-29 20:33:50 · 3922 阅读 · 1 评论 -
算法导论 14章 数据结构的扩张(二) 区间树
区间树——红黑树的扩张 将红黑树进行扩张以支持由区间构成的动态集合,其节点主要除红黑树节点常规信息之外,还有一个区间信息,这样的一颗树称之为区间树。我们将利用14.2节总结的红黑树扩张的四个步骤来讨论如何进行扩充以得到区间树。步骤1:基础数据结构 毫无疑问,我们将选择红黑树。该区间树的每个节点有一个区间信息,对于节点x,即为int[x],用low表示in原创 2015-02-05 18:20:03 · 1056 阅读 · 0 评论 -
算法导论 第14章 数据结构的扩张(三) 14.3-6 最小差幅树
题目 思考 为了加深对数据结构的扩张的理解,我们根据14.2给出的四个步骤一一来实践。步骤1:选择基础树结构 显然,我们得选择红黑树作为基本数据结构了,每个节点除了和红黑树一样的域之外,还有一个minGap域,用于存储以该节点为根的子树的最小差幅。对于树根而言,minGap就是整棵树,即整个序列的最小差幅了。步骤2:附加信息 minGap是最小差原创 2015-02-06 10:55:42 · 693 阅读 · 0 评论 -
用对象的多重数组实现双链表
在有些语言(例如FORTRAN)中不提供指针与对象数据类型,那么该如何实现双链表呢?我们将介绍运用数组和数组下标在逻辑上来构造双链表,让它表现的就像用指针实现的一样自然。对象的多重数组表示 如下图是一个用数组实现的双链表的逻辑图: 对一组具有相同域的对象,每一个域都可以用一个数组来表示。上图说明了如何用三个数组实现双链表。动态几何的关键字存储在数组key中,而指针域原创 2015-01-30 13:21:27 · 1258 阅读 · 0 评论 -
算法导论 第十章 10.2-8 用单指针域实现双链表
数学基础 利用单指针域实现双链表的关键在于如何能够得到前驱和后继的地址,只有这样才能称之为双链表。我们可以运用异或的性质,如下:a⊕b = b⊕aa⊕a = 0a⊕0 = aa⊕(a⊕b) = (a⊕a)⊕b = b(a⊕b)⊕b = a⊕(b⊕b) = a 双链表逻辑结构首先,我们给出链表节点的结构(C++模板)和逻辑图,然后再仔细讲原创 2015-01-29 19:50:29 · 1696 阅读 · 0 评论 -
算法导论 第13章 13-1 持久动态集合
题目解答: a) 不管是插入还是删除,需要改变的节点包括从根节点开始到要插入或者删除位置的路径上的所有节点。 b) 其中key[x] == k;PERSISTENT-TREE-INSERT(T, x){ curr <- root[T]; T' <-NULL, p <-NULL;//T'为新根,p记录查找过程中当前节点的父亲 while (原创 2015-02-01 20:23:36 · 1321 阅读 · 0 评论 -
算法导论 第12章 12-2 基数树
算法导论 第12章思考题 基数树题目 解决思路: 很显然,这是关于二叉查找树的应用,主要是运用插入和遍历。 关于插入,遍历01字符串,从根节点开始,经过一段时间的插入,现在进行到节点x,如果当前遇到的字符是0,且x的左孩子存在,则直接向左走,否则创建一个新节点成为x的左孩子,然后走到此节点;如果当前遇到的字符是1,且右孩子存在,则直接向右走,原创 2015-02-01 17:05:02 · 1086 阅读 · 0 评论 -
算法导论 26章 最大流(一)
最大流问题 为了求一点到另一点的最短距离,我们可以把公路地图模型化为有向图。同理,我们可以将公路模型化为一个“流网络”(flow network),并运用它来解决物流相关的问题。其中最大流问题是其中一种,即:在不违背每条路(即有向图的边)的容量的情况下,可以把物质从源点送到汇点的最大速率是多少。最大流定义和性质 流网络是一个有向图G=(V,E),其中每条边(u原创 2015-03-22 16:45:04 · 4819 阅读 · 0 评论 -
算法导论 第14章 数据结构的扩张(四) 14-1 最大重叠点
题目 同习题14.3-6我们依然运用数据结构扩张的四个步骤来解决这个问题。步骤1:选取基础数据结构 我们选择红黑树作为基础数据结构来扩张,红黑树是这章的主题,扩张之后所得的树称之为最大重叠点(POM)树。由于要求得区间的最大重叠点,因而当然的,我们的节点必然包含一个域存储以该节点为根的子树的最大POM,即为pom域。步骤2:附加信息原创 2015-02-06 20:26:02 · 1157 阅读 · 0 评论 -
算法导论 第22章 图的基本算法(三) 拓扑排序
拓扑排序 采用DFS我们可以给有向无环图进行拓扑排序,生成一个该图顶点的线性序列,满足对于边(u,v),在该序列中,u出现在v的前面,如果有回路,那么就不会生成这样的序列。 我们可以利用DFS后,各定点的f域,即结束访问时刻来获得拓扑序列。f域大的应当出现在前面,这说明它访问结束比较晚,意味着有较多的顶点是其后裔。如果这个图是一个课表,顶点表示各课程,则表明该课程是较多原创 2015-03-23 14:06:27 · 659 阅读 · 0 评论 -
算法导论 第22章 图的基本算法(四) 强连通分支
强连通分支 计算有向图的强连通分支是深度优先搜索经典应用,很多图相关的算法都是将图分解为各个强连通分支之后,然后在各个强连通分支上运行,最后根据各个强连通分支之间的关系将所有的解组合起来。 对于有向图G=(V,E)任意两个顶点u,v,如果u能够经过一条路径到达v,v也能通过一条路径到达u,即两者互相可达,它们将属于一个强连通分支,强连通用分支就是这样一个最大的互相可达的顶点集合。原创 2015-03-23 14:45:49 · 3294 阅读 · 0 评论 -
算法导论 第22章 图的基本算法(一)
这篇博客讨论图的基本算法第一部分,包括两点内容:1、22.1节课后习题算法;2、广度优先搜索。对于深度优先搜索由于有递归形式以及非递归形式,还有对边类型和课后习题等等,内容较多,将重新开辟一章。本章算法中主要采取的图的表示 图的表示比较简单,在此就不再讨论。我们约定一下,在本章中各种算法的图的相关表示,便于后续算法的讨论。约定如下: 1、边节点结构;struct原创 2015-03-22 19:24:36 · 1248 阅读 · 0 评论 -
算法导论 第22章 图的基本算法(二) 深度优先搜索
深度优先搜索(DFS) 本篇博客主要讨论有向图的深度优先搜索,包括递归形式以及非递归形式,遍历中对图的各边进行分类,同时解决该节书后习题。 DFS与BFS的异同:当扫描顶点u的邻接链表发现v时,就将u置为v的祖先,这一点与BFS相同;与此不同的是,在BFS中,先辈子图形成一棵树,而DFS的先辈子图可以有几棵树组成,即成为一个森林,因为搜索可以从多个不同的源顶点开始。原创 2015-03-23 09:47:38 · 2451 阅读 · 0 评论 -
算法导论 第19章 思考题19-2 采用二项堆的最小生成树算法
题目思路 关于二项堆的性质和实现,可以参考二项堆的定义和实现。对题目给出的算法的分析后,我们可以得到以下几点: 1、1~4行初始化,我们可以用一个数组充当Vi,采用并查集的方式,方便查找子树根等,程序后最终得到前驱子图;相对应的,创建每一个二项堆存储Ei,其中key为权值,值为edge(包含边起点和终点); 2、5~12行迭代。每一次迭代最多减少一个顶点集,对于原创 2015-03-27 14:33:19 · 1284 阅读 · 0 评论 -
算法导论 第23章 最小生成树 斐波那契堆实现优先队列
最小生成树(Minimum Spanning Tree)问题 对于一个无向连通图G=(V,E),找出一个无回路的子集T包含于E,连接了所有的顶点,且其权值之和 为最小。由于T无回路且连接了所有的顶点,因而必然是一棵树,即生成树,又由于权值和最小,因而叫做最小生成树。确定图G的树T的问题成为最小生成树问题。如下图是图G,阴影边是最小生成树的边,可知权值和为37.最小原创 2015-03-29 18:48:49 · 3013 阅读 · 2 评论 -
算法导论 13-4 Treap树
题目原创 2015-02-03 14:23:34 · 1415 阅读 · 0 评论