我苦逼,被我睡过去了。
ppt摘录如下:
一、二叉堆是一个严格的完全二叉树,它的特点就是可以在O(logn)的时间内对元素进行插入和删除,并且可以在O(1)的时间内找到最大元素或者最小元素。
注:
1、通常将根节点为整个树中最小元素的二叉堆叫做小根堆,反之则为大根堆。2、堆在同层次上是无序的,也就是说堆的关系只是本节点与子节点和父节点之间的关系,与兄弟节点无关。3、其存储结构可以是顺序存储,因为它是一个完全二叉树,已知一个节点的下标(序号),可以知道其子节点和父节点的下标(序号)。4、一般情况下我们都采用连续一段数组的存储方式来存储二叉堆。已知一个节点n,其父节点为n/2(这里为整除),其左孩子节点为n*2,右孩子为n*2+1。void push(int a) //a为插入的关键字 { int temp,w; n++; s[n]=a; w=n; while ((w!=1)&&(s[w]<s[w/2])) {//逐层调整关键字的位置 if (s[w]<s[w/2]) { temp=s[w]; s[w]=s[w/2]; s[w/2]=temp; } w=w/2; }
二、树状数组是查询和维护时间复杂度均为O(logn)的数据结构
引入:
·在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。
·但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。
·可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。当n非常大时,程序会运行得非常缓慢。
·“树状数组”可以较高的效率解决此类问题。
看不太懂,暂缓。
注:1、树状数组应用实例(poj 2352)
注:看ppt的时候无语,发现老师太坑爹,一上午把这些都讲了,看不懂以下先放着........上网上找点资料再看.....
三、线段树
四、并查集