- 博客(9)
- 收藏
- 关注
原创 优先队列(Heap版)
这个优先队列用heap实现,代码改编自CLRS(算法导论)。 #define left(i) ((i) #define right(i) (((i) #define parent(i) ((i) >> 1)#define swap(a, b) {T t = a; a = b; b = t;}//测试用的结构体struct test...{ int key; string d
2007-08-18 19:32:00 632
原创 Trie
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。 它有3个基本性质: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3. 每个节点的所有子节点包含的字符都不相同。 Trie的实现见下面的代码,具体操作见注释。这个写的有些垃
2007-08-15 21:58:00 1154
原创 树状数组(Binary Indexed Tree)
树状数组,数组a是原数组,下面是他们的一些关系数组C就是C1=a1C2=a1+a2C3=a3C4=a1+a2+a3+a4C5=a5……C8=a1+a2+a3+a4+a5+a6+a7+a8……C2^n=a1+a2+….+a2^n那么树状数组具体怎么定义的呢?思考上面的规律,不难得出结论:对于序列a,我们设一个数组C定义C[i] = a[i – 2^k + 1] + … + a[i],
2007-08-13 21:20:00 971
原创 线段树
线段树的定义 经常遇到一些与区间有关的题目,这类题目用通常的方法很麻烦,但是有一种特殊的数据结构——线段树(Segment Tree)可以很好地解决有关区间上的问题。线段树是一棵二叉树,记为T(a,b),参数a,b表示区间[a,b],其中,b-a为区间的长度,记为L。其根为:[a,b]其左儿子为:[a,(a+b)/2]其右儿子为:[(a+b)/2,b]若L=1,则为叶子
2007-08-12 12:47:00 977
原创 Treap
Treap还是比较好写的,但是要加入动态顺序统计和parent指针就稍微有些麻烦了。一个重要的经验是采用哨兵(本例中是nullnode),这样会带来很大方便的。 //结点类型typedef struct node...{ int key, pri, size; //关键字,权值,统计量 node *left, *right, *parent; //左孩子、右孩
2007-08-10 21:57:00 866
原创 并查集(disjoint_set)
//并查集(disjoint_set)//构造函数:disjoint_set(const int& l),l:容量class disjoint_set...{private: int* p; //存储public: disjoint_set(int l) : p(new int[l+1]) ...{ memset (p, -1, siz
2007-08-10 15:34:00 817
原创 Hash_Table(散列表)
以下代码仅在 g++ 3.4.2中编译通过,令人惊奇的是VC 2005竟然编译出错,看来以后用VC 2005还得小心才行。 //结点类型template typename T, typename Tar>struct node...{ T data; Tar value; node* next; //初始化为空 node() : value(
2007-08-10 13:38:00 735
原创 队列
//队列的模板实现template typename T>class Queue...{private: int N; T* s; int head, tail;public: //构造函数,需指定队列的容量 Queue(int size) : N(size), s(new T[size]), head(0), tail(0) ...{}
2007-08-09 21:31:00 701
原创 栈
栈是一种很简单的数据结构,不用介绍了。 //栈的模板实现template typename T>class Stack...{private: int N; T* s; int top;public: //构造函数,需指定栈的容量 Stack(int size) : N(size), s(new T[size]), top(-1) ..
2007-08-09 21:22:00 562
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人