当前位置:
文档之家› ACM竞赛中所用到的数据结构_非常不错_和大家分享汇总
ACM竞赛中所用到的数据结构_非常不错_和大家分享汇总
堆栈Stack
#include<stack> using namespace std; //STL stack <int> S;
链表list
特点:
插入O(k)
删除O(k)
查找O(k)
最坏情况下都是O(n)
实现方法:
链表
数组->改进块状数组
STL
链表list
#include<list> using namespace std; //STL list<int> S;
串的模式匹配--BM
算法的关键和 KMP 类似,也是构造一个辅助数组, 不过,不同于KMP算法的是,BM算法的辅助数组 大小只和匹配串的字符集大小相关(一般情况下也 就是ASCII字符集,256个字符),其内容和模式串 相关,辅助数组的内容即是模式串的索引: position[patten[i]]=i; 也是相当简单的辅助数组构造。
关于堆 Heap
二叉堆(又名最大/最小堆) 二项堆 映射2分堆 Fibonacci堆 Interval heap 左偏树Leftist Tree
队列Queue
特点:
先进先出 FIFO 入队O(1), 出队O(1) 不能随机访问中间的元素
实现方法:
链表 数组 STL
队列Queue
串的模式匹配--KMP
// start matching pattern T in S[i..)
// return match pos or longest match length with corresponding pos
int kmp(char *s, int ls, char *t, int lt, int i,int &longest,int &lp)
ACM竞赛中所用到的 数据结构
唐陈兴 2007.12.26
基本数据结构
基础:队列、堆栈、链表 排序与检索:快速排序和归并排序的思想 串的模式匹配:KMP, Boyer-Moore, Trie(*), 有
限状态自动机(*) 树:左儿子右兄弟表示法, AVL(用STL实现),
哈夫曼树,Splay Tree(*), 树状数组,线段树 ,PQ树(***) 字典:Hash、并查集(*)、可并优先队列,堆
}
return -1;
}
串的模式匹配--BM
快速的字符串查找算法 Boyer-Moore算法 BM 算法是一个较优的模式匹配算法。一般,如果
不考虑模式串的长度,一个具有时间复杂度O(n)的 算法应该是最优的了,但是事实不是如此。BM算 法可以实现更高效率的模式匹配。分析和实验说明, BM匹配算法对于那些字符集比较大,而模式串中 出现的字符比较少的时候,工作效率最快。而且, 考虑KMP匹配方式的优化,可以结合KMP匹配和 BM匹配,进一步提高效率。
随机查找第k小元素
随机第k小元素
int select(int *a,int b,int e,int k){
if(b==e) return a[b];
int x=a[b+rand()%(e-b+1)],i=b-1,j=e+1,tmp;
while (i<j){
while(a[++i]<x);
while(a[--j]>x);
具体可以见
http://www-igm.univ-mlv.fr/~lecroq/string/node14.html 另外,动态演示程序见附件
二叉搜索树
BST(二叉搜索树)不是一棵平衡的树,它的树结 构与输入数据的顺序有很大的关系
{
longest = lp = 0; --s; --t;
for(int j=1; i<=ls; i++,j++) {
while( j>0 && s[i]!=t[j] ) j=fail[j];
if( j>longest ) { longest = j; lp = i-j; }
if( j==lt ) return i-lt;
if (i<j) tmp=a[i],a[i]=a[j],a[j]=tmp;
ቤተ መጻሕፍቲ ባይዱ
}
if (j==e) j--;
i=j-b+1;
if (k<=i) return select(a,b,j,k);
else return select(a,j+1,e,k-i);
}
串的模式匹配--KMP
由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进 的模式匹配算法简称为KMP算法
链表list
排序
排序
快速排序 O(n*log(n)) 堆排序(稳定排序)O(n*log(n)) 选择排序,冒泡排序 O(n^2) 桶排序 O(M)
O(n)随机查找第k小元素
std:sort
STL #include<algorithm> using namespace std; int a[M],b[M]; sort(a,a+n); sort(a,a+n,cmp); bool cmp(const int x,const int y){ return x>y; //return b[x]<b[y]; }
朴素的串模式匹配的复杂度是O(m*n)
长度为m的母串S, 匹配长度为n的子串A 求母串S中有多少个子串A 求母串S中第1个子串A的位置
KMP算法的复杂度为O(m+n) 总体思想
O(n)线性时间预处理子串,求出前缀函数 O(m)线性时间扫描母串求出匹配
串的模式匹配--KMP
//KMP 求前缀函数 int fail[maxlen]; void makefail( char *t, int lt ) { --t; for(int i=1,j=0;i<=lt;i++,j++){ fail[i]=j; while(j>0 && t[i]!=t[j]) j=fail[j]; } }
#include<queue> using namespace std; queue <int> Q; Member Functions:
//STL queue
堆栈Stack
特点:
先进后出 FILO 入队O(1), 出队O(1) 不能随机访问中间的元素
实现方法:
链表 数组 STL