- 博客(22)
- 资源 (9)
- 收藏
- 关注
原创 算法导论-第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 8253 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 7626 17
原创 第16章 贪心算法
一、综述贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解最小生成树算法是贪心算法的一个经典的例子二、活动选择问题(1)代码#include using namespace std;#define N 11//一个活动用一个结点表示struct node{ int id; int start; int fini
2012-07-15 14:00:54 9501 11
原创 算法导论-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 5346 2
原创 算法导论-16.1-3
题目:假设要用很多个教室对一组活动进行调剂。我们希望应用尽可能少的教室来调剂所有的活动。请给出一个有效的贪心算法,来断定哪一个活动应应用哪一个教室。(这个题目也被成为区间图着色(interval-graph coloring)题目。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的色彩均不雷同,所需的起码色彩对应于找出调剂给定的所有活动所需的起码教室数。
2012-07-15 11:15:07 5920 4
原创 第15章 动态规划
一、综述动态规划是通过组合子问题的解而解决整个问题的。动态规划适用于子问题不是独立的情况,也就是各子问题的包含公共的子子问题。动态规划对每个子问题只求解一次,将其结果保存在一张表中。动态规划通常用于最优化问题。动态规划的设计步骤:a.描述最优解的结构b.递归定义最优解的值c.按自底向上的方式计算最优觖的值d.由计算出的结构构造一个最优解二、代码15.1装配线调度
2012-07-13 18:34:28 5365 8
原创 算法导论 第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 4196 8
原创 算法导论 14.1-7 顺序统计树求逆序对 O(nlgn)
一、题目说明如何在O(nlgn)的时间内,利用顺序统计树对大小为n的数组中的逆序对(见思考题2-4)进行计数。 二、思考求逆序数中介绍了使用树状数组或归并排序求逆序对,这里使用顺序统计数。数组中某个数字s[i]的逆序数是指出现在s[i]之前,但是比s[i]大的数字的个数。根据顺序统计量的Os_Rank(),每插入到一个元素x后,可以求得在已经出现的元素中,比x大的数字的个数
2012-07-09 21:34:16 4217 4
原创 HDU-1043-八数码-代码
解题分析过程见hdu1043八数码问题解题报告 //1043双向搜索-八数码#include #include #include using namespace std;char input[100];int state[10],s_num,e10[10],fac_n[10];char hash_T[400000],step[10000],hash_T2[4
2012-07-09 19:30:21 2068
原创 算法导论-13.3-6-红黑树基于栈实现RB-INSERT
题目:说明如果红黑树的表示中不提供父指针的话,应该如何有效地实现RB-INSERT 思考:令待插入的元素是z。在插入的过程记录从根结点到z的路径,并用栈存储。那么z的父结点就是栈顶元素,z的祖父结点就是栈的次顶元素。在向上迭代的过程同时出栈,控制好出栈的时间,就能正确实现RB-INSERT 代码:#include using namespace std;#de
2012-07-08 21:28:21 4039 1
原创 算法导论 第13章 红黑树
一、概念1.定义与性质(1)定义红黑树字义:满足(a)每个结点或是红的,或是黑的(b)根结点是黑的(c)每个叶结点(NIL)是黑的(d)如果一个结点是红的,则它的两个儿子是黑的(e)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点的二叉查找树称为红黑树。黑高度定义:从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上的黑色结点的个数称为x的黑高度。(2
2012-07-08 21:16:48 9689 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 9498 25
原创 算法导论-12-2-基数树
题目:给定两个串a = a0a1……ap和b = b0b1……b1,其中每一个ai和每一个bj都属于某个有序字符集,如果下面两条规则之一成立,则说串a按字典序小于串b:1)存在一个整数j,02)p例如,如果a和b是位串,则根据规则1)(设j=3),有10100 图12-5中示出的是基数树(radix tree)数据结构,其中存储了位串1011、10、011、100和0。当查找某
2012-07-05 18:50:16 5193 3
原创 算法导论-12-1-具有相同关键字元素的二叉查找树
题目:相同关键字的存在,给二叉查找树的实现带来了一些问题。a)当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐近性能如何?我们可以对TREE-INSERT做一些改进,即在第5行的前面测试key[z] = key[x],在第11行的前面测试key[z] = key[y]。如果等式成立,我们对下列策略中的某一种加以实现。对每一种策略,请给
2012-07-05 16:56:12 7387
原创 算法导论-第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 8388 4
原创 算法导论 11.2-4 散列表内未占用槽链接成自由链表
一、题目说明在散列表内部,如何通过将所有未占用的槽位链成一个自由表,来分配和去配元素的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典操作和自由链表操作应具有O(1)的期望运行时间。该自由链表是双链表吗?或者,是不是单链表就足够了?二、思考已知(1)所有未占用的槽位链成一个自由链表(2)槽位即slot(3)Hash(x)返回x所属于的slot一
2012-07-03 16:31:13 4474 8
原创 算法导论 11.1-4 大数组的直接寻址表
一、题目我们希望我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化是不实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典方案。每个存储的对象占用O(1)的空间;操作search,insert,delete的时间为O(1);对数据结构初始化时间为O(1)。 (提示:可以利用另外一个栈,其大小等于实际存储在字典中的关键字
2012-07-02 19:24:36 4522 2
原创 算法导论 10.4-5 O(n)时间非递归遍历二叉树
一、题目写一个O(n)时间的非递归过程,输出给定的含n个结点的二叉树中每个结点的关键字。要求只能用除树本身以外的固定量的额外存储空间,而且在过程中不能修改该树,哪怕是暂时的二、思考采用类似中序遍历的处理方法,对一个结点,可以分为以下几种情况1.从父结点进入子结点进行处理(1)如果有左孩子,就处理左孩子(2)返回到自己(3)访问自己(4)如果有右孩子,就处理右
2012-07-02 14:28:48 5665 10
原创 算法导论 第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 5519 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 4189 1
原创 算法导论 10.3-4 紧凑的多重数组
一、题目:我们常常希望一个双链表中的所有元素在存储器中能够紧凑地排列在一起,例如使用多重数组表示中的前m个下标位置(在一个分页的虚拟计算机环境中情况就是这样的)。假设链表以外没有指向链表元素的指针,请说明如何实现过程ALLOCATE_OBJECT和FREE_OBJECT,才能使这种表比较紧凑。(提示:使用栈的数组实现)思考:假设当前的数组是紧凑的,即数组中有f个元素,都位于数组的前f个
2012-07-01 21:29:05 5018 11
原创 算法导论 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 5892 12
VC++和VS写的小游戏贪吃蛇
2012-06-12
背包问题九讲
2012-05-14
openGL的配置文件
2011-04-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人