《算法导论》答案
文章平均质量分 86
《算法导论》是不可多得的经典算法教材,值得我们深入理解,仔细分析。本系针对《算法导论》中文版原书第2版所写的答案,代码均用C++实现。不保证完全正确,旨在抛砖引玉。
windmissing
喜欢编程,喜欢思考,方向明确
展开
-
算法导论 9.1-1 求第二小元素
一、题目描述证明:在最坏情况下,利用n+ceil(lgn)-2次比较,即可得到n个元素中的第2小元素。(提示:同时找最小元素)二、常规方法使用两次for循环,分别将数组从前往后扫描。 第一扫次扫描过程中,不断记录和更新当前情况下的最小元素。 第二次和扫描过程中,不断记录和更新当前情况下的第二小元素。 伪代码如下:Int min = array[0], minId = 0;FOR i in [原创 2015-11-23 19:12:48 · 2380 阅读 · 0 评论 -
算法导论 第22章 图的基本算法 22.5 强联通分支
一、综述 定义: 二、代码#include using namespace std;#define N 10#define WHITE 0#define GRAY 1#define BLACK 2//边结点结构struct Edge{ int start;//有向图的起点 int end;//有向图的终点 Edge *next;//指向同一个起点的下原创 2012-08-07 18:42:42 · 6763 阅读 · 5 评论 -
算法导论 第22章 图的基本算法 22.4 拓扑排序
一、综述定义:对有向无回路图G=(V,E)进行须拓扑排序后,结果为该图所有顶点的一个线性序列,满足如果G包含边(u, v),则在该序列中,u就出现在v的前面(如果图是有回路的,就不可能存在这样的线性序列)。定理:一个有向图G是无回路图,当且仅当对G进行深度优先搜索时没有得到反向边。二、代码//用邻接表实现图的转置#include using namesp原创 2012-08-07 16:41:59 · 5579 阅读 · 9 评论 -
算法导论 第22章 图算法 22.3 深度优先搜索
一、综述 深搜策略:在深搜过程中,对于最新发现的顶点,如果它还有以此为起点的而未探测到的边,就沿此边继续探测下去。当顶点v的所有边都已被探测过后,搜索将回溯到发现顶点v有起始点的那些边。时间戳:当顶点v第一次被发现时记录下第一个时间戳d[v],当结束检查v的邻接表时,记录下第二个时间戳f[v]。v在d[v]时刻前是白色的,在时刻d[v]和f[v]之间是灰色的,在时刻f[v]之后是黑原创 2012-08-07 15:40:18 · 7794 阅读 · 8 评论 -
算法导论 第22章 图算法 22.2 广度优先搜索
一、综述BFS蛮简单的,没什么好的综述的。BFS算法的算法过程与它是有向图还是无向图没有关系,也与用邻接图还是用矩阵表示也没有关系。本文的代码是用邻接图实现的,例子是22-3的有向图。用邻接矩阵实现的BFS 见算法导论-22.2-3-邻接矩阵实现图的广度优先搜索二、代码1.Link_Graph.h#include #include using namespace原创 2012-08-07 09:54:54 · 6266 阅读 · 1 评论 -
算法导论 第22章 图的基本算法 22.1 图的表示
一、综述图的表示方法通常有两种,即邻接表表示法和邻接矩阵表示法。这两种方法都可以表示有向图和无向图1.邻接表表示法(1)用邻接表表示无向图(2)用邻接表表示有向图(3)邻接表的优点及适用场合使用邻接表表示稀疏图比较紧凑2.邻接矩阵表示法(1)用邻接矩阵表示无向图(2)用邻接矩阵表示有向图(3)邻接矩阵的优点与适用场合用邻接矩阵表示稠密图可原创 2012-08-07 09:19:00 · 6213 阅读 · 4 评论 -
算法导论 第21章 用于不相交集合的数据结构
一、综述不相交集合数据结构(disjoint-set data struct)保持一组不相交的动态集合S={S1,S2,……,Sk}这种数组结构支持三种操作:(1)MAKE-SET(x):构造一种只有元素x的集合(2)UNION(x,y):合并两个集合(3)FIND-SET(x):找出元素x所属的集合二、代码1.UnionFindSet.h/* UnionFind原创 2012-08-03 18:45:24 · 5703 阅读 · 1 评论 -
算法导论 第20章 斐波那契堆
只能把看懂的一部分先写出来了一、综述1.斐波那契堆斐波那契堆是可合并堆在不涉及删除的操作(除去EXTRACT和DELETE)中,操作仅需O(1)的平摊运行时间当EXTRACT和DELETE的操作数目较小时斐波那契堆能得到较好的运行效率。斐波那契堆不能有效地支持SEARCH操作用于解决诸如最小生成树和寻找单源最短路径等问题的快速算法都要用到斐波那契堆。2.斐波那契堆的原创 2012-08-02 16:31:57 · 14417 阅读 · 11 评论 -
算法导论-第19章-二项堆
一、概念1.可合并堆(1)可合并堆应支持的操作MAKE-HEAP()INSERT(H, x)MINIMUM(H)EXTRACT-MIN(H)UNION(H1, H2)(2)二项堆是一种可合并堆2.二项树(1)二项树的定义二项树是Bk一种递归定义的有序树B0只包含一个结点Bk(k>0)由两棵二项树B|k-1连接而成,其中一棵作为另一棵的左孩子(原创 2012-07-30 18:01:07 · 8221 阅读 · 3 评论 -
算法导论 第18章 B树
一、定义1、B树B树是为磁盘或其它直接存取辅助存储设备而设计的一种平衡查找树,主要特点是降低磁盘I/O操作次数。B树以自然的方式推广二叉查找树。B树的分支因子由磁盘特性所决定。 2、B数的数据结构int n:当前存储在结点x中的关键字数key[N]:n个关键,以非降序存放bool leaf;//TRUE:x是叶子;FALSE:x是内结点node *child[N原创 2012-07-29 12:29:04 · 7589 阅读 · 17 评论 -
第16章 贪心算法
一、综述贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解最小生成树算法是贪心算法的一个经典的例子二、活动选择问题(1)代码#include using namespace std;#define N 11//一个活动用一个结点表示struct node{ int id; int start; int fini原创 2012-07-15 14:00:54 · 9488 阅读 · 11 评论 -
第15章 动态规划
一、综述动态规划是通过组合子问题的解而解决整个问题的。动态规划适用于子问题不是独立的情况,也就是各子问题的包含公共的子子问题。动态规划对每个子问题只求解一次,将其结果保存在一张表中。动态规划通常用于最优化问题。动态规划的设计步骤:a.描述最优解的结构b.递归定义最优解的值c.按自底向上的方式计算最优觖的值d.由计算出的结构构造一个最优解二、代码15.1装配线调度原创 2012-07-13 18:34:28 · 5328 阅读 · 8 评论 -
算法导论-14-2-Josephus排列
题目:Josephus问题的定义如下:假设n个人排成环形,且有以正整数m。a)假设m为整数。请描述一个O(n)时间的算法,使之对给定的整数n,输出(n, m)-Josephus排列。b)假设m不是个常数。请描述一个O(nlgn)时间的算法,使给定的整数n和m,输出(n, m)-Josephus排列。 思考:利用14.1中的动态顺序统计,假设刚刚删除的是剩余点中的第sta原创 2012-08-28 11:00:26 · 3811 阅读 · 0 评论 -
算法导论-14-1-最大重叠点
题目:假设希望对一组区间记录一个最大重叠点,亦即覆盖它的区间最多的那个点。a)证明:最大重叠点总存在于某段的端点上。b)设计一数据结构,能有效地支持操作INTERVAL-INSERT,INTERVAL-DELETE和返回最大重叠点操作FIND-POM。(提示:将所有端点组织成红黑树。左端点关联+1值,而右端点关联-1值。附加一些维护最大重叠点的信息以扩张树中结点。)思考:原创 2012-08-27 20:21:52 · 5222 阅读 · 4 评论 -
算法导论 第14章 14.3 区间树
一、综述1.区间树区间树中一种对动态集合进行维护的红黑树,该集合中的每个元素x都包含一个区间int[x]2.基础数据结构红黑树,其中每个结点x包含一个区间域int[x],x的关键字为区间的低端点3.附加信息max[x]:以x为根的子树中所有区间的 端点的最大值4.对信息的维护max[x] = max(high[int[x]], max[left[x]], max[r原创 2012-08-25 20:10:42 · 9912 阅读 · 12 评论 -
算法导论 第14章 14.1 动态顺序统计
一、概念1.动态顺序统计动态顺序统计是指,在一个动态的无序的集合中,任意的顺序统计量都可以在O(lgn)时间内确定。2.基础数组结构红黑树,每个树结点的域包括:key[x],color[x],left[x],right[x]3.附加信息size[x]:以结点x为根的子树的内部结点(包括x)数,即子树的大小。如果定义哨兵nil,则size[nil[T]]为0size[原创 2012-07-12 21:44:59 · 4179 阅读 · 8 评论 -
算法导论 第13章 红黑树
一、概念1.定义与性质(1)定义红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的黑高度。(2原创 2012-07-08 21:16:48 · 9679 阅读 · 25 评论 -
算法导论 第12章 二叉查找树
一、概念1.定义与性质(1)设x为二叉查找树中的一个结点,若y是x左子树中的一个结点,则key[y] (2)二叉查找树上执行的基本操作的时间与树的高度成正比。2.结构(1)结点结构:关键字key卫星数据data分别指向父、左右孩子的指针p, left, right3.在二叉查找树上的操作查找一个关键字:SEARCH(x, k)求最小关键字:MINIMUM原创 2012-07-05 18:56:44 · 9487 阅读 · 25 评论 -
算法导论-第11章-散列表
一、概念1.综述散表表仅支持INSERT、SEARCH、DELETE操作。把关键字k映射到槽h(k)上的过程称为散列。多个关键字映射到同一个数组下标位置称为碰撞。好的散列函数应使每个关键字都等可能地散列到m个槽位中2.散表函数(1)若函数为h(k)=k,就是直接寻址表(2)除法散列法:h(k) = k mod m(3)乘法散列法:h(k) = m * (原创 2012-07-03 22:25:46 · 8358 阅读 · 4 评论 -
算法导论 第10章 10.4 有根树的表示
一、概念1.二叉树(1)用域p、left、right来存放指向二叉树T中的父亲、左儿子、右儿子。没有则为NULL。(2)结点结构struct node{ node *p; node *left; node *right; int key;};(3)树的结构struct Bin_Tree{ node *head;};2.分支原创 2012-07-02 14:07:00 · 5480 阅读 · 8 评论 -
算法导论 第10章 10.3 指针和对象实现
一、概念1.对象的多重数组表示:对一组具有相同域的对象,每一个对象都可以用一个数组来表示2.对象的单数组表示:一个对象占据存储中的一组连续位置二、代码int Allocate_Object(){ if(free == NULL) { cout<<"error:out of space"<<endl; exit(0); } else {原创 2012-07-01 21:58:50 · 4178 阅读 · 1 评论 -
算法导论 第10章 10.2 链表
一、概念(1)数组的线性序是由数组的下标决定的,链表中的顺序是由各对象中的指针所决定的(2)链表结点结构node *prev;node *next;int key;(3)链表结点node *head;node *nil;//哨兵(4)对链表的操作LIST-SEARCH(L, k)LIST-INSERT(L, x)LIST-DELETE(L, x)原创 2012-06-29 10:03:37 · 5071 阅读 · 6 评论 -
算法导论 第10章 10.1 栈和队列
一、概念1.栈(1)栈实现了后进先出操作。在栈的数组实现中,栈顶指针指向栈顶元素,插入时先修改指针再插入,删除时先取栈顶元素再修改指针。当top[S]=0时,栈中空的。(2)数组栈的结构:int top;//栈顶指针int *s];//指向栈数组(3)在栈上实现的操作STACK-EMPTY(S)//判断栈是否为空PUSH(S, x) /原创 2012-06-26 15:43:14 · 4566 阅读 · 8 评论 -
算法导论 第9章 排序和顺序统计学算法导论
一、概念第i个顺序统计量是该集合中第i小的元素。当n为奇数时,中位数是出现在i=(n+1)/2处的数。当n为偶数时,中位数分别出现在i=n/2和i=(n+1)/2处。在本文中,忽略n的奇偶性,中位数是指出现在i=(n+1)/2处的数。本文假设集合中的数互异。二、代码#include using namespace std;//书中的程序int length_A原创 2012-06-25 20:27:50 · 6823 阅读 · 4 评论 -
算法导论 第8章 线性时间排序
一、概念1.比较排序比较排序是指通过输入元素间的比较来确定各元素次序的排序算法。任何比较排序在最坏情况下都要用O(nlgn)次比较来进行排序合并排序和堆排序是渐近最优的2.非比较排序非比较排序指使用一些非比较的操作来确定排序顺序的排序算法对于非比较排序,下界O(nlgn)不适用计数排序是稳定排序,若n个数据的取值范围是[0..k],则运行时间为O(n+k),原创 2012-06-20 10:24:08 · 6535 阅读 · 4 评论 -
算法导论 第7章 快速排序
一、概念快速排序是基于分治模式的,选择一个数作为主元,经过一遍扫描,所有小于主元的数放在主元的左边,大于主元的数放在主元的右边,这样就划分成了两组数据。然后对两组数分别进行快排。快排的运行时间与划分是否对称有关,关键是如何选择主元。最坏情况下,时间复杂度是O(n^2),最好情况下,时间是O(nlgn)二、程序#include using namespace std;原创 2012-06-19 11:00:32 · 7885 阅读 · 4 评论 -
算法导论 第6章 堆排序
一、概念1.定义(1)堆heap堆是一种数组对象The (binary) heap data structure is an array object that can be viewed as a nearly complete binary tree(2)最大堆max-heapfor every node i other than the root,A[PARE原创 2012-06-17 15:42:43 · 6246 阅读 · 5 评论