摘要: JavaMail是JavaEE中的一个组件,用来开发邮件客户端程序(MUA)。JavaMail API本身是与具体的消息协议无关的,可以在运行程序之前设置实现具体协议的providers,例如在Sun的mail.jar中提供了一个缺省的文件 javamail.default.providers,里面提供了三个协议(imap, smtp和pop3)的实现,其中smtp的provider类是com.sun.mail.smtp.SMTPTransport。如果用户需要开发 NNTP协议的客户端程序,可以考虑其他的provider,例如GNU JavaMail。JavaMail需要JavaSE中的 J 阅读全文
posted @ 2011-10-10 14:59 ljsspace 阅读(652) 评论(0) 推荐(0) 编辑
摘要: 题目:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)*7+rand7()可以构造出均匀分布在1-49的随机数(原因见下面的说明),可以将41~49这样的随机数剔除掉,得到的数1-40仍然是均匀分布在1-40的,这是因为每个数都可以看成一个独立事件。下面说明为什么(rand7()-1)*7 阅读全文
posted @ 2011-10-10 14:46 ljsspace 阅读(668) 评论(0) 推荐(1) 编辑
摘要: 配对堆(Pairing Heap)是一个简单实用的min-heap结构(当然也可以做成max-heap)。它是一颗多路树(multiway tree),类似于Leftist Heap和Skew Heap,但是与Binomial Tree和Fibonacci Heap不一样。它的基本操作是两个多路树的连接(link),所以取名叫Pairing Heap。连接操作(参考以下实现中的方法linkPair)类似于Binomial Tree和Fibonacci Heap中的link操作,即将root key值最大的树作为key值最小的树的孩子(一般作为最左边的孩子,特别是Binomial Heap必须这 阅读全文
posted @ 2011-09-06 11:09 ljsspace 阅读(3862) 评论(3) 推荐(0) 编辑
摘要: Fibonacci Heap(简称F-Heap)是一种基于二项堆的非常灵活的数据结构。它与二项堆不同的地方在于:1)root list和任何结点的child list使用双向循环链表,而且这些lists中的结点不再有先后次序(Binomial Heap中root list的根结点按degree从小到大顺序,child list的结点按degree从大到小顺序);2)二项堆中任何一颗Binomial Tree中根结点的degree是最大的,而F-Heap中由于decrease-key操作(cut和cascading cut)的缘故,并不能保证根结点的degree最大;3)二项堆中任何结点(deg 阅读全文
posted @ 2011-09-05 14:11 ljsspace 阅读(1458) 评论(0) 推荐(0) 编辑
摘要: Just like leftist or skew heaps, a binomial heap is also a mergeable heap data structure. But unlike those 'lopsided' heaps that are composed of only single binary tree, a binomial heap consists of a set of trees that are called binomial trees. Binomial trees are so called because the number 阅读全文
posted @ 2011-08-29 15:36 ljsspace 阅读(580) 评论(0) 推荐(0) 编辑
摘要: 斜堆(Skew Heap)基于左倾堆的概念,也是一个用于快速合并的堆结构,但它可自我调整(self-adjusting),每一个merge操作的平摊成本仍为O(logN),其中N为结点数,而且和左倾堆相比,每个结点没有npl属性,从而节省了空间。斜堆并不能保证左倾,但是每一个合并操作(也是采取右路合并)同时需要无条件交换(而左倾堆中只是根据左右子树的npl值不符合要求时才交换)左右子树,让新合并的右子树变成左子树,原来的左子树变成新的右子树(这有点类似于Splay Tree中的做法),从而可以达到平摊意义上的左倾效果。注意:一颗子树r和NULL子树合并时并不需要交换r子树的左右子树。由于斜堆并 阅读全文
posted @ 2011-08-25 00:14 ljsspace 阅读(1575) 评论(0) 推荐(0) 编辑
摘要: Tarjan算法解决LCA查询要求事先知道全部查询提问,如果LCA要求即时询问即时回答,就需要用到下面介绍的在线算法。在线算法需要对任意树进行预处理,设输入树的结点个数为n,该算法的预处理时间和空间复杂度都是O(n),查询复杂度为O(1)。本算法的基本思想是将对一棵树T做预处理,生成每个结点的额外信息,然后利用结点的额外信息将T映射到一颗完全二叉树B,最后利用完全二叉树的特性,通过二进制位运算可以在常数时间内查询出任何两个结点x和y的LCA。*****************预处理*****************预处理T需要生成每个结点的inlabel值,ascendant值,parent和 阅读全文
posted @ 2011-08-24 00:40 ljsspace 阅读(4349) 评论(3) 推荐(0) 编辑
摘要: 左倾堆(Leftist Heap)是一个便于merge操作的数据结构,通过左倾树(Leftist Tree)实现。左倾树是一种特殊的二叉树,树中结点除了满足普通二叉堆的key大小规定外,还要求每一个结点X的左子树的Null Path Length(NPL)值不小于右子树的NPL值,因此这也是与普通二叉堆的区别:虽然普通二叉堆也满足左倾树的条件,左倾树往往不是一棵完全二叉树(而且通常不平衡),从而左倾树不能用数组表示了。上面提到的NPL指的是某个结点到NULL结点(总共有n+1个NULL结点)的最短路径长度,规定NULL结点本身的NPL等于-1,叶子结点的NPL等于0,非叶结点的NPL等于它的两 阅读全文
posted @ 2011-08-21 00:21 ljsspace 阅读(706) 评论(3) 推荐(0) 编辑
摘要: LCA的Tarjan离线(offline)算法中,通过后序DFS遍历多叉树(结点数为n),利用并查集算法(disjoint sets‘ union-find operations),可以在线性时间O(n+|P|)内找到事先给定(即offline的含义)的|P|个成对结点的LCA。具体做法如下:1)首先所有的结点通过makeSet(x)调用放到各自独立集合中,然后在用lca(u)递归调用任何一个结点u时,按照从左到右顺序依次遍历u的所有子树v1,v2...vk,在v1被访问之后,v1的属性visited标记为true(此时u的属性visited还是false),然后将v1子树中所有结点与u结点合 阅读全文
posted @ 2011-08-16 12:05 ljsspace 阅读(2472) 评论(0) 推荐(1) 编辑
摘要: 树状数组中每个元素覆盖了不同长度的子区间,类似于稀疏表(ST)算法的思想,每一个数组元素存储了输入数列A在该区间的最小值下标。注意:这里树状数组不是用来存储区间累加值,而是区间的最小值下标。这里针对预处理阶段提供两个算法:方法1(参考以下实现代码中的方法preprocess)采用类似于累加和中的update做法,每一个元素A[i]需要处理树状数组T中O(logn)个受影响的元素,因此预处理复杂度为O(nlogn)。方法2(参考以下实现代码中的方法preprocess2或preprocess3)利用DP(动态规划)思想,观察到树状数组中每一个下标为i的元素覆盖的区间都可以划分为:r个子区间 + 阅读全文
posted @ 2011-08-10 11:56 ljsspace 阅读(916) 评论(0) 推荐(0) 编辑