ACM竞赛中所用到的数据结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
队列Queue
#include<queue> using namespace std; queue <int> Q; Member Functions: //STL queue
堆栈Stack
特点:
先进后出 FILO 入队O(1), 出队O(1)
不能随机访问中间的元素
实现方法:
链表 数组 STL
堆栈Stack
#include<stack> using namespace std; //STL stack <int> S;
链表list
特点:
插入O(k) 删除O(k)
查找O(k)
最坏情况下都是O(n)
实现方法:
链表 数组->改进块状数组 STL
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]; } }
串的模式匹配--KMP
由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的 改进的模式匹配算法简称为KMP算法 朴素的串模式匹配的复杂度是O(m*n)
长度为m的母串S, 匹配长度为n的子串A
求母串S中有多少个子串A
求母串S中第1个子串A的位置
KMP算法的复杂度为O(m+n) 总体思想
串的模式匹配--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) { 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; } return -1; }
关于堆 Heap
二叉堆(又名最大/最小堆) 二项堆 映射2分堆 Fibonacci堆 Interval heap 左偏树Leftist Tree
队列Queue
特点:
先进先出 FIFO 入队O(1), 出队O(1)
不能随机访问中间的元素
实现方法:
链表 数组 STL
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]; }
随机查找第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); 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); }
链表list
#include<list> using namespace std; //STL list<int> S;
链表list
排序
排序
快速排序 O(n*log(n)) 堆排序(稳定排序)O(n*log(n))
选择排序,冒泡排序 O(n^2)
桶排序 O(M)
O(n)随机查找第k小元素
串的模式匹配--BM
算法的关键和 KMP 类似,也是构造一个辅助数组, 不过,不同于KMP算法的是,BM算法的辅助数组 大小只和匹配串的字符集大小相关(一般情况下也 就是ASCII字符集,256个字符),其内容和模式串 相关,辅助数组的内容即是模式串的索引: position[patten[i]]=i; 也是相当简单的辅助数组构造。 具体可以见 http://www-igm.univmlv.fr/~lecroq/string/node14.html 另外,动态演示程序见附件
Baidu Nhomakorabea
串的模式匹配--BM
快速的字符串查找算法 Boyer-Moore算法 BM 算法是一个较优的模式匹配算法。一般,如果 不考虑模式串的长度,一个具有时间复杂度O(n)的 算法应该是最优的了,但是事实不是如此。BM算 法可以实现更高效率的模式匹配。分析和实验说明, BM匹配算法对于那些字符集比较大,而模式串中 出现的字符比较少的时候,工作效率最快。而且, 考虑KMP匹配方式的优化,可以结合KMP匹配和 BM匹配,进一步提高效率。
ACM竞赛中所用到的 数据结构
基本数据结构
基础:队列、堆栈、链表 排序与检索:快速排序和归并排序的思想 串的模式匹配:KMP, Boyer-Moore, Trie(*), 有限状态自动机(*) 树:左儿子右兄弟表示法, AVL(用STL实现), 哈夫曼树,Splay Tree(*), 树状数组,线段树 ,PQ树(***) 字典:Hash、并查集(*)、可并优先队列,堆