2014年4月24日

《算法导论》笔记 第14章 14.1 动态顺序统计

摘要: 【笔记】一棵顺序统计量树T通过简单地在红黑树的每个结点存入附加信息而成。在一个结点x内,除了包含通常的红黑树的域key color p left right,还包括域size[x]。这个域中包含以结点x为根的子树的结点数(包括x本身),即子树的大小。如果定义哨兵为0,也就是设置size[nil]为0,则有等式 size[x]=size[left[x]]+size[right[x]]+1。在出现相等关键字的情况下,定义排序为按中序遍历树时输出的结点位置,以此消除顺序统计树原定义的不确定性。检索具有给定排序的元素:过程OS-SELECT(x,i)返回一个指向以x为根的子树中包含第i小关键字的结点的 阅读全文

posted @ 2014-04-24 21:22 电子幼体 阅读(390) 评论(0) 推荐(0) 编辑

《算法导论》笔记 第13章 总结与思考

摘要: 【总结】template class RBTREE{public: struct NODE{ NODE *p,*l,*r; T key; COLOR c; NODE() {} }NIL; NODE *nil, *root; NODE* newNode(T k, COLOR cl = RED) { NODE *p = new NODE; p->c = cl; p->p = nil; p->l = nil; p->r = nil; p-... 阅读全文

posted @ 2014-04-24 17:27 电子幼体 阅读(484) 评论(0) 推荐(0) 编辑

《算法导论》笔记 第13章 13.4 删除

摘要: 【笔记】// 基本没搞懂 NODE* rbDelete(NODE *z) { NODE *y, *x; if (z->l == nil || z->r == nil) { y = z; } else { y = treeSuccessor(z); } if (y->l != nil) { x = y->l; } else { x = y->r; } x->p = y->p; if (y->p == nil) { root = x; } else { if ... 阅读全文

posted @ 2014-04-24 08:14 电子幼体 阅读(708) 评论(0) 推荐(0) 编辑

2014年4月23日

《算法导论》笔记 第13章 13.3 插入

摘要: 【笔记】 void rbInsert(NODE *z) { NODE *y = nil; NODE *x = root; while (x != nil) { y = x; if (z->key key) { x = x->l; } else { x = x->r; } } z->p = y; if (y == nil) { root = z; } else { if (z->key key) { y->... 阅读全文

posted @ 2014-04-23 15:23 电子幼体 阅读(962) 评论(0) 推荐(0) 编辑

2014年4月22日

《算法导论》笔记 第13章 13.2 旋转

摘要: 【笔记】旋转:保持二叉查找树性质的查找树局部操作。左旋: void leftRotate(NODE *x) { NODE *y = x->r; x->r = y->l; if (y->l != nil) { y->l->p = x; } y->p = x->p; if (x->p == nil) { root = y; } else { if (x == x->p->l) { x->p->l = y; } else { x->p->r = y; } ... 阅读全文

posted @ 2014-04-22 21:29 电子幼体 阅读(869) 评论(0) 推荐(0) 编辑

《算法导论》笔记 第13章 13.1 红黑树的性质

摘要: 【笔记】红黑树中每个结点包含五个域:color,key,left,right和p。如果某结点没有一个子结点或父结点,则该域指向NIL。我们把NIL视为二叉树的外结点(叶子),而带关键字的结点视为内结点。一棵二叉树如果满足下面的红黑性质,则为一棵红黑树:1) 每个结点或是红的,或是黑的。2) 根结点是黑的。3) 每个叶结点(NIL)是黑的。4) 如果一个结点是红的,则它的两个儿子都是黑的。5) 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。采用哨兵来代表NIL,它的color域为BLACK,其它域为任意值。从某个结点x出发(不包括该结点)到达一个叶结点的任意一条路径上,黑色结 阅读全文

posted @ 2014-04-22 17:32 电子幼体 阅读(1483) 评论(0) 推荐(0) 编辑

2014年4月20日

《算法导论》笔记 第12章 总结与思考

摘要: 【思考】12-1 具有相同关键字的二叉查找树a) 当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐进性能如何?差不多O(n^2)b) 在结点x处设一个布尔标志b[x],并根据b[x]的不同值,置x为left[x]或right[x]。每当插入一个与x具有相同关键字的结点时,b[x]取反!O(nlogn)c) 在结点x处设置一个列表,其中所有结点都具有与x相同的关键字,并将z插入到该列表中。O(n^2)d) 随机地将x置为left[x]或right[x]。最坏O(n^2),平均O(nlogn)。12-2 基数树基数树,或称Patricia tri 阅读全文

posted @ 2014-04-20 21:39 电子幼体 阅读(442) 评论(0) 推荐(0) 编辑

《算法导论》笔记 第12章 *12.4 随机构造的二叉查找树

摘要: 【笔记】木有【练习】不会 阅读全文

posted @ 2014-04-20 18:53 电子幼体 阅读(230) 评论(0) 推荐(0) 编辑

2014年4月18日

《算法导论》笔记 第12章 12.3 插入和删除

摘要: 【笔记】插入:从根结点开始,沿树下降。指针x跟踪这条路径,而y始终指向x的父结点。根据key[z]与key[x]的比较结果,决定向左向右转。直到x成为NIL为止。这个NIL所占位置及我们想插入z的地方,y即为z的父结点。删除:以指向z的指针为参数,考虑三种情况。若z没有子女,则修改其父结点p[z],是NIL为其子女;如果结点z只有一个子女,则可以通过在其子结点与父结点之间建立一条链来删除z。如果结点z有两个子女,先删除z的后继y(它没有左子女),再用y的内容来替代z的内容。 void treeInsert(NODE *z) { NODE *y = NULL; ... 阅读全文

posted @ 2014-04-18 19:51 电子幼体 阅读(1057) 评论(0) 推荐(0) 编辑

《算法导论》笔记 第12章 12.2 查询二叉查找树

摘要: 【笔记】对一棵高度为h的二叉查找树,动态集合操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR等的运行时间均为O(h)。 NODE* treeSearch(NODE *rt,T k) { if (rt==NULL || k==rt->key) return rt; if (kkey) return treeSearch(rt->l,k); else return treeSearch(rt->r,k); } NODE* iterativeTreeSearch(NODE *rt,T k) { ... 阅读全文

posted @ 2014-04-18 12:06 电子幼体 阅读(550) 评论(0) 推荐(0) 编辑

导航