码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈数据结构-堆

时间:2016-09-13 20:42:18      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

在数据结构的世界中有一个叫堆的玩意,这玩意有什么用呢?无用,都去pq了 堆,其实就是一棵完全二叉树。

“若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树”  by 谋财害命公司 百度

技术分享

 

↑清真的 完全二叉树 ↓

技术分享

啊那么为什么会闲的无聊出现这种奇怪的数据结构呢?

因为我们的某些算法可能需要堆来进行优化,如dj,prim。

堆可以在O(1)的时间取出最优值,但是需要O(logn)的时间修改和O(nlogn)的时间建立。【啊大概好像也许应该可能是这样的复杂度】

那么我们该怎么建立一个清真的堆呢?

首先我们要明白堆的原理:

1.加入元素时,在尾部添加,然后从尾部开始递归,爬树爬到顶端,在爬树的过程中进行交换最优值的操作。

2.删除元素时,先把第一个元素和末尾元素的值换一下,然后删除末尾元素,从根节点往下递归,直到叶子节点,递归过程进行最优值交换操作。

3.查询元素时,查第一个元素。

↑啊这是不是非常简单啊?pj选手不会的都拉出去续了

相信有些人可能看了上面这三段我意念出来的文字,像便秘一样写不出来,唉我只好舍命陪君子瞎jb口胡着写一个啦~~~喵!

【我以堆排序为例子】

技术分享
1 void  put(int k)
2 {
3     int father=k>>1;
4     if (k==0) return ;
5     if (a[k]<a[father])
6       swap(a[k],a[father]),put(father);
7     return ;
8 }
FA♂Q
技术分享
 1 void del(int k)
 2 {
 3     int lc,rc;
 4     lc=k<<1;
 5     rc=(k<<1)+1;
 6     if (lc>len && rc>len) 
 7       return ;
 8     if (lc<=len && rc>len)
 9       if (a[k]>a[lc])
10         {
11             swap(a[k],a[lc]);
12             return ;
13         }
14     if (lc<=len && rc<=len)
15        {
16           int tc=rc;
17           if (a[lc]<a[rc]) tc=lc;
18           if (a[k]>a[tc])
19             swap(a[k],a[tc]),del(tc);
20        }
21 }
Change♂boss♂of♂this♂gym

YY了一下插入和删除这两个操作,大概也许应该是没错的

然后就可以用heap做许多好玩的事情啦(误)

 

浅谈数据结构-堆

标签:

原文地址:http://www.cnblogs.com/yz12138/p/5869601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!