![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法导论
文章平均质量分 79
windmissing
喜欢编程,喜欢思考,方向明确
展开
-
算法导论-第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 · 8230 阅读 · 3 评论 -
算法导论 10.4-2 O(n)时间 递归遍历二叉树
一、题目请写出一个O(n)时间的递归过程,在给定的n个原创 2014-09-02 20:54:11 · 2896 阅读 · 1 评论 -
算法导论 第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 · 5486 阅读 · 8 评论 -
算法导论-13-3-AVL树
题目:答:a)一棵高度为h的AVL树中,至少有Fh个结点,其中Fh是第h个斐波那契数b)AVL的旋转算法见AVL平衡树的旋转c)#include #include using namespace std;//结点结构struct node{ int key; int h; node *left; node *right; node *p; node()原创 2012-08-25 15:41:23 · 3325 阅读 · 6 评论 -
算法导论 6-3 Young氏矩阵
一、题目二、思考a)不唯一2 3 4 58 9 12 14 16 c)提取Y[1][1],并用ox7FFFFFFF填充。然后向右下调整YOUNG-EXTRACR-MIN(Y)1 if Y[1][1] == 0X7FFFFFFF2 then error "heap underflow"3 min <- Y[1][1]4 A原创 2012-09-13 20:18:05 · 3747 阅读 · 3 评论 -
算法导论-8-3-排序不同长度的数据项
一、题目a)给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但是该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序b)给定一个字符串数组,其中不同的串包含的字符个数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序(注意此处的顺序是指标准的字母顺序,例如,a 二、思路a)先用计数排序算法按数字位数排序O(n)原创 2012-06-23 15:14:09 · 3441 阅读 · 2 评论 -
算法导论 9.3-8 求两个数组的中位数
一、题目设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数的O(lgn)时间的算法二、思路递归求解该问题,解题规模不断减半,最后剩下4个元素时,得到问题的解,本文求的是下中位数,下中位数的特点是:(1)当n为奇数,令n = 2 * m + 1,下中位数是第m+1小的数,数组中有m个数小于下中位数,有m原创 2012-06-25 09:06:58 · 7384 阅读 · 18 评论 -
算法导论 7-6 对区间的模糊排序
一、题目考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2原创 2012-06-21 09:19:44 · 4021 阅读 · 3 评论 -
算法导论 10.2-8 用一个指针实现双链表
一、题目说明如何对每个元素仅用一个指针np[x](而不是两个指针next和prev)来实现双链表。假设所有指针值都是k位的整型数,且定义np[x] = next[x] XOR prev[x],即next[x]和prev[x]的k位异或(NIL用0表示)。注意要说明访问表头所需的信息,以及如何实现在该表上的SEARCH、INSERT和DELETE操作。如何在O(1)时间内实现这样的表。原创 2012-07-01 19:10:50 · 5866 阅读 · 12 评论 -
算法导论 10.4-3 O(n) 二叉树 非递归遍历
一、题目 二、伪代码三、代码原创 2014-09-02 21:45:41 · 2760 阅读 · 5 评论 -
算法导论 10.4-5 O(n)时间非递归遍历二叉树
一、题目写一个O(n)时间的非递归过程,输出给定的含n个结点的二叉树中每个结点的关键字。要求只能用除树本身以外的固定量的额外存储空间,而且在过程中不能修改该树,哪怕是暂时的二、思考采用类似中序遍历的处理方法,对一个结点,可以分为以下几种情况1.从父结点进入子结点进行处理(1)如果有左孩子,就处理左孩子(2)返回到自己(3)访问自己(4)如果有右孩子,就处理右原创 2012-07-02 14:28:48 · 5634 阅读 · 10 评论 -
第26章 最大流(正在修改)
一、综述1.定义定义1:流网络定义2:残留容量定义3:增广路径已知一个网络流G=(V,E)和流f,增广路径p为残留网络G|f中从s到t的一条简单路径能够沿一条增广路径p的每条边传输的网络流的最大量为p的残留容量,由下式定义:c|f(p) = min{c|f(u,v) : (u,v)在p上}定义4:割、净流、容量、最小割净流和容量的区别: 穿过(S原创 2013-05-18 22:26:48 · 7181 阅读 · 4 评论 -
算法导论 第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 · 4573 阅读 · 8 评论 -
算法导论-9.3-3-快速排序-最坏时间O(nlgn)
一、题目假定元素的值不同,说明如何才能使快速排序在最坏情况下以O(nlgn)时间运行二、思考要改善最坏情况的下运行时间,就要从划分入手,保证即使是最坏情况,也要尽量均衡地划分。因此,使用SELECT找到中值,再以这个中值为主元进行划分三、代码1.以RANDOMIZED-SELECT作为选择中值的算法//9.3-3#include using name原创 2012-06-24 19:56:56 · 6176 阅读 · 3 评论 -
算法导论 第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 · 4188 阅读 · 8 评论 -
算法导论 10.3-4 紧凑的多重数组
一、题目:我们常常希望一个双链表中的所有元素在存储器中能够紧凑地排列在一起,例如使用多重数组表示中的前m个下标位置(在一个分页的虚拟计算机环境中情况就是这样的)。假设链表以外没有指向链表元素的指针,请说明如何实现过程ALLOCATE_OBJECT和FREE_OBJECT,才能使这种表比较紧凑。(提示:使用栈的数组实现)思考:假设当前的数组是紧凑的,即数组中有f个元素,都位于数组的前f个原创 2012-07-01 21:29:05 · 4993 阅读 · 11 评论 -
算法导论 第8章 线性时间排序
一、概念1.比较排序比较排序是指通过输入元素间的比较来确定各元素次序的排序算法。任何比较排序在最坏情况下都要用O(nlgn)次比较来进行排序合并排序和堆排序是渐近最优的2.非比较排序非比较排序指使用一些非比较的操作来确定排序顺序的排序算法对于非比较排序,下界O(nlgn)不适用计数排序是稳定排序,若n个数据的取值范围是[0..k],则运行时间为O(n+k),原创 2012-06-20 10:24:08 · 6551 阅读 · 4 评论 -
算法导论-第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 · 8368 阅读 · 4 评论 -
算法导论 第22章 图的基本算法 22.1 图的表示
一、综述图的表示方法通常有两种,即邻接表表示法和邻接矩阵表示法。这两种方法都可以表示有向图和无向图1.邻接表表示法(1)用邻接表表示无向图(2)用邻接表表示有向图(3)邻接表的优点及适用场合使用邻接表表示稀疏图比较紧凑2.邻接矩阵表示法(1)用邻接矩阵表示无向图(2)用邻接矩阵表示有向图(3)邻接矩阵的优点与适用场合用邻接矩阵表示稠密图可原创 2012-08-07 09:19:00 · 6228 阅读 · 4 评论 -
算法导论 11.2-4 散列表内未占用槽链接成自由链表
一、题目说明在散列表内部,如何通过将所有未占用的槽位链成一个自由表,来分配和去配元素的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典操作和自由链表操作应具有O(1)的期望运行时间。该自由链表是双链表吗?或者,是不是单链表就足够了?二、思考已知(1)所有未占用的槽位链成一个自由链表(2)槽位即slot(3)Hash(x)返回x所属于的slot一原创 2012-07-03 16:31:13 · 4463 阅读 · 8 评论 -
算法导论-16.1-3
题目:假设要用很多个教室对一组活动进行调剂。我们希望应用尽可能少的教室来调剂所有的活动。请给出一个有效的贪心算法,来断定哪一个活动应应用哪一个教室。(这个题目也被成为区间图着色(interval-graph coloring)题目。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的色彩均不雷同,所需的起码色彩对应于找出调剂给定的所有活动所需的起码教室数。原创 2012-07-15 11:15:07 · 5895 阅读 · 4 评论 -
算法导论 第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 · 9490 阅读 · 25 评论 -
算法导论 第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 · 6253 阅读 · 5 评论 -
第16章 贪心算法
一、综述贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解最小生成树算法是贪心算法的一个经典的例子二、活动选择问题(1)代码#include using namespace std;#define N 11//一个活动用一个结点表示struct node{ int id; int start; int fini原创 2012-07-15 14:00:54 · 9492 阅读 · 11 评论 -
算法导论-15-1-双调欧几里得旅行商问题
一、题目 二、思考先做以下定义:对所有点按x坐标排序,从0开始依次为每个点编号,令(1)两条路径分别为A和B,且起点都是点0,方向严格向右(2)A[i]表示路径A的一种状态,起点为点0,终点为点i,方向严格向右,0(3)B[j]表示路径B的一种状态,起点为点0,终点为点i,方向严格向右,0(4)d[i][j]为点i与点原创 2012-08-29 11:06:19 · 9019 阅读 · 7 评论 -
算法导论-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 · 3818 阅读 · 0 评论 -
算法导论-14-1-最大重叠点
题目:假设希望对一组区间记录一个最大重叠点,亦即覆盖它的区间最多的那个点。a)证明:最大重叠点总存在于某段的端点上。b)设计一数据结构,能有效地支持操作INTERVAL-INSERT,INTERVAL-DELETE和返回最大重叠点操作FIND-POM。(提示:将所有端点组织成红黑树。左端点关联+1值,而右端点关联-1值。附加一些维护最大重叠点的信息以扩张树中结点。)思考:原创 2012-08-27 20:21:52 · 5230 阅读 · 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 · 9922 阅读 · 12 评论 -
算法导论 第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 · 7800 阅读 · 8 评论 -
14.3-6 MIN GAP
请说明如何维护一个支持操作MIN-GAP的动态数据集Q,使得该操作能够给出Q中两个数之间的最小差幅。例如,Q={1,5,9,15,18,22},则MIN-GAP(Q)返回18-15=3,因为15和18是其中最近的两个数。使用操作INSERT,DELETE,SEARCH和MIN-GAP尽可能高效,并分析它们的运行时间。题目中的Q是一个有序序列,但输入序列P不一定是有序的。 由于以RED-BLACK原创 2016-10-09 09:22:36 · 974 阅读 · 0 评论 -
算法导论 15-3 编辑距离
题目概述有六种操作,分别是复制(copy)、替换(replace)、删除(delete)、插入(insert)、交换(twiddle)、消灭(kill)。 将这六种操作任意组合(可以重复或者没有)得到一个操作序列。 操作序列的输入是一个字符串,操作的输出是另一个字符串。 例如字符串algorithm,经过以下操作序列,得到字符串altruistic。 一个字符串src,变成另一个字符串d原创 2016-12-21 17:57:19 · 2498 阅读 · 0 评论 -
算法导论 第22章 图的基本算法 22.4 拓扑排序
一、综述定义:对有向无回路图G=(V,E)进行须拓扑排序后,结果为该图所有顶点的一个线性序列,满足如果G包含边(u, v),则在该序列中,u就出现在v的前面(如果图是有回路的,就不可能存在这样的线性序列)。定理:一个有向图G是无回路图,当且仅当对G进行深度优先搜索时没有得到反向边。二、代码//用邻接表实现图的转置#include using namesp原创 2012-08-07 16:41:59 · 5585 阅读 · 9 评论 -
算法导论 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 · 2384 阅读 · 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 · 6768 阅读 · 5 评论 -
算法导论6.5-8堆排序-K路合并
一、题目请给出一个时间为O(nlgk)、用来将k个已排序链表合成一个排序链表算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)二、步骤step1:取每个链表的第一个元素,构造成一个含有k个元素的堆step2:把根结点的值记入排序结果中。step3:判断根结点所在的链表,若该链表为空,则go to step4,否则go to step5step原创 2012-06-16 10:39:33 · 8688 阅读 · 4 评论 -
算法导论-22.3-6-用栈实现DFS
题目:重写过程DFS,利用一个栈来消除递归代码:#include #include using namespace std;#define N 10#define WHITE 0#define GRAY 1#define BLACK 2//边结点结构struct Edge{ int start;//有向图的起点 int end;//有原创 2012-08-07 16:02:53 · 5266 阅读 · 2 评论 -
算法导论-16.2-6
题目:说明如何在O(n)时间内解决部分背包问题思考:http://www.cnblogs.com/meteorgan/archive/2012/04/22/2459117.html常规算法:先求avgi = vi/wi,按照avgi从大到小排序,再贪心选择,时间复杂度为O(nlgn)改进:更一般的情况,不需要排序,例如:如果a1, a2,a3是avgi 最大的三个物品,原创 2012-07-15 12:56:19 · 5316 阅读 · 2 评论 -
算法导论 第7章 快速排序
一、概念快速排序是基于分治模式的,选择一个数作为主元,经过一遍扫描,所有小于主元的数放在主元的左边,大于主元的数放在主元的右边,这样就划分成了两组数据。然后对两组数分别进行快排。快排的运行时间与划分是否对称有关,关键是如何选择主元。最坏情况下,时间复杂度是O(n^2),最好情况下,时间是O(nlgn)二、程序#include using namespace std;原创 2012-06-19 11:00:32 · 7894 阅读 · 4 评论 -
算法导论 第13章 红黑树
一、概念1.定义与性质(1)定义红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的黑高度。(2原创 2012-07-08 21:16:48 · 9683 阅读 · 25 评论 -
算法导论 10.1-2 用一个数组实现两个栈
一、题目说明如何用一个数组A[1..n]来实现两个栈,使得两个栈中的元素总和不到n时,两个都不会发生上溯。注意PUSH和POP操作的时间应为O(1)二、思考分别用数组的两端作为两个栈的起点,向中间扩展,两个栈中的元素总和不超过n时,两个栈不会相遇三、代码//用一个数组实现两个栈struct stack2{ //栈1和栈2的栈顶指针 int top1,原创 2012-09-18 18:29:29 · 7366 阅读 · 0 评论