我苦逼,被我睡过去了。

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的时候无语,发现老师太坑爹,一上午把这些都讲了,看不懂以下先放着........上网上找点资料再看.....


三、线段树


四、并查集