2011年7月20日

红黑树(red-black tree)算法,附AVL树的比较

摘要: 【转】【经典】导读: linux内核中的用户态地址空间管理使用了红黑树(red-black tree)这种数据结构,我想一定有许多人在这种数据结构上感到困惑,我也曾经为此查阅了许多资料以便了解红黑树的原理。最近我在一个外国网站上看到一篇讲解红黑树的文章,觉得相当不错,不敢独享,于是翻译成中文供所有内核版的弟兄们参考。由于本人水平有限,难免有出错之处,欢迎大家指正。 原文网址:http://sage.mc.yu.edu/kbeen/teaching/algorithms/resources/red-black-tree.html 加两个链结地址: 红黑树的实地使用 http://www.linu 阅读全文

posted @ 2011-07-20 20:55 龙豆 阅读(7531) 评论(0) 推荐(0)

算法导论-14.1-8

摘要: 【题目】现有一个圆上的n条铉,每条铉都是按其端点来定义的。请给出一个能在O(n log n)的算法,确定圆内相交铉的对数(例如:如果n条铉都是直径,他们交于圆心,则正确的答案为C(n,2),组合数)。另外任意两条铉没有公共点。【解答】[转] 通过角度来判断两条弦是否相交,这样可以在O(n*logn)内完成。 对于两条弦P1P2和Q1Q2来说(顺时针),圆心与端点形成的向量有一个角度A 如果A(P1)<A(Q1)<A(P2)<A(Q2)或者A(Q1)<A(P1)<A(Q2)<A(P2),这样角度区间“交叉”就意味着两条弦有交叉。 通过角度来统计交叉弦的对数,和 阅读全文

posted @ 2011-07-20 16:31 龙豆 阅读(896) 评论(0) 推荐(1)

2011年7月18日

算法导论-13.2-4

摘要: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】首先证明任意的二分查找树可通过至多n-1次旋转变成右行链: 从根开始,反复对根节点执行right-rotate直到根的左子树中的节点都处于根的右行链中;沿着右行链遍历,找到原来树中根节点的右儿子,遍历过程中对每个节点执行right-rotate操作直到该节点没有左子树;对原来根的右孩子执行同样的操作,反复进行right-rotate操作;所有可能的right-rotate有n-1个由对称性可知右行链可通过至多n-1次旋转变. 阅读全文

posted @ 2011-07-18 22:02 龙豆 阅读(590) 评论(0) 推荐(0)

2011年7月16日

poj-1856 Sea Battle *

摘要: /* * bfs * 又是一道水题。。1A * */#include <cstdio>#include <cstring>using namespace std;const int MAXN = 1000 + 5;int r, c; //同题意bool vis[MAXN][MAXN];char map[MAXN][MAXN];// sx,sy:矩形左上角。。ex,ey:矩形右下角..tot:矩形数。。。flag:是否正确int sx, sy, ex, ey, tot, flag;//获得ex,ey.. 若不是矩形,返回falsebool inline get_cor(i 阅读全文

posted @ 2011-07-16 21:06 龙豆 阅读(330) 评论(0) 推荐(0)

非递归遍历二叉树[转]

摘要: 【转】http://blog.csdn.net/kofsky/article/details/28864531.先序遍历从递归说起voidpreOrder(TNode*root){if(root!=NULL){Visit(root);preOrder(root->left);preOrder(root->right);}}递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点。如果不用递归,那该怎么做呢?仔细看一下递归程序,就会发现,其实每次都是走树的左分支(left),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。其实过程很简单:一直往左走 阅读全文

posted @ 2011-07-16 19:43 龙豆 阅读(591) 评论(0) 推荐(0)

2011年7月15日

算法导论-7-6 对区间的模糊排序

摘要: 【转】《算法导论》chapter7 problem7-6对区间的模糊排序考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2≤…≤cn .a)为n个区间的模糊排序设计一个算法,你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各ai ),也要能充分利用 阅读全文

posted @ 2011-07-15 22:20 龙豆 阅读(1990) 评论(0) 推荐(1)

算法导论-5.1-2

摘要: 【转】描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少?这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,若产生的整数位于[0, n-1]内,则取这个数作为结果。如果这个数在[0,n-1]外,则丢弃它,再次运行算法重新生成一个。 a) 证明上述算法可以产生 [0, n-1]范围内的随机数在范围[0,1, ..., n-1, n, .. 阅读全文

posted @ 2011-07-15 21:57 龙豆 阅读(943) 评论(0) 推荐(0)

poj-1980 Unit Fraction Partition **

摘要: /* * 本以为这题剪枝会很难,没想到1A了。。32ms * 这个题的难点是分数的处理。。不要用double。。精度难以把握。。 * */#include <cstdio>#include <cmath>using namespace std;int p, q, a, n, tot; //如题目定义,tot为答案//p1/q1 和 p2/q2 比较大小int inline frac_cmp(int p1, int q1, int p2, int q2){ return p1 * q2 - p2 * q1;}/*int inline gcd(int a, int b){ 阅读全文

posted @ 2011-07-15 21:22 龙豆 阅读(961) 评论(0) 推荐(1)

算法导论-4-6 VLSI芯片测试

摘要: 【转】问题:Diogenes 教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的.教授的测试装置一次可测试二片,当该装置中放有两片芯片时,每一片就对另一片作测试并报告其好坏.一个好的芯片总能够正确的报告另一片的好坏,但一个坏的芯片的结果就是不可靠的.这样,每次的测试的四种可能结果如下: a)证明若少于 n/2 的芯片是坏的,在这种成对测试方式下,使用任何策略都不能确定哪个芯片是好的.b)假设有多于 n/2 的芯片是好的,考虑从 n 片中找出一片好芯片的问题.证明 n/2 对测试就足以使问题的规模降至近原来的一半.c)假设有多于 n/2 的芯片是好的,证明好的芯片可用 O(n) 阅读全文

posted @ 2011-07-15 19:32 龙豆 阅读(2821) 评论(0) 推荐(0)

算法导论-4-2 找出所缺的整数

摘要: 【转】 问题: 某数组A[1..n]含有所有从0..n的所有整数,但其中有一个整数不在数组中,通过利用一个辅助数组B[0..n]来记录A中出现的整数,很容易在O(n)时间内找出所缺的整数。但在这个问题中,我们却不能由一个单一操作来访问A中的一个完整整数,因为A中元素是以二进制表示的。我们所能用的唯一操作就是“取A[i]的第j位”这个操作所花时间为常数。证明:如果访问数组A中信息的唯一方式是这种单一位操作,仍能在O(n)时间内找出所缺的整数。A之外的任一完整整数仍然可以由一个单一操作来访问。【算法导论 中文版P504-2】 昨天晚上看算法导论看到了这一题,没有想多久,没想通。当时想的是把A中的每 阅读全文

posted @ 2011-07-15 19:19 龙豆 阅读(2337) 评论(1) 推荐(1)

导航