二叉堆
时间:2022-04-22
本文章向大家介绍二叉堆,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
容易证明:
一棵高为h的完全二叉树有2^h 到 2^(h+1)-1个结点。
这就意味着,完全二叉树的高是[logN]
特点:
任意位置i:
左儿子在位置2i上,右儿子在位置2i+1上,父亲在i/2上
一个堆数据结构将由一个Comparable数组和一个代表当前堆的大小的整数组成:
优先队列的接口:
1 template <typename Comparable>
2 class BinaryHeap
3 {
4 public:
5 explicit BinaryHeap ( int capacity = 10 );
6 explicit BinaryHeap ( const Vector<Comparable> & items);
7
8 bool isEmpty() const;
9 const Comparable & findMin() const;
10
11 void insert(const Comparable & x);
12 void deleteMin();
13 void deleteMin(Coparable & minItem);
14 void makeEmpty();
15 private:
16 int currentSize;
17 vector<Comparable> array;
18 void buildHeap();
19 void percolateDown(int hole);
20 }
堆序的性质:如果想要找到一个最小点,最好是把最小值移动到堆的最上方,使用方法: 上滤
应用比如插入一个元素到堆中:
1 void insert(const Comparable & x)
2 {
3 if(currentSize == array.size()-1)
4 array.resize(array.size()*2);
5
6 int hole = ++currentSize;
7
8 for( ; hole > 1 && x < array[hole/2];hole /= 2)
9 array[hole] = array[hole/2];
10 array[hole] = x;
11 }
想要删除一个堆结点,一般都是要把堆结点移动到最顶端,然后通过 下滤 方法删除:
1 void deletMin()
2 {
3 if(isEmpty())
4 throw UnderflowException();
5
6 array[1] = array[currentSize--];
7 percolateDown(1);
8 }
9 void deleteMin(Comparable & minItem)
10 {
11 if(isEmpty())
12 throw UnderflowException();
13 minItem = array[1];
14 array[1] = array[currentSize--];
15 percolateDown(1);
16 }
17 void percolateDown(int hole)
18 {
19 int child;
20 Comparable tmp = array[hole];
21 for( ; hole*2 <= currentSize;hole = child)
22 {
23 child = hole*2;
24 if(child != currentSize && array[child+1] < array[child])
25 child++;
26 if(array[child] < tmp)
27 array[hole] = array[child];
28 else
29 break;
30 }
31 array[hole] = tmp;
32 }
堆的其他操作:
decreaseKey(p,@):把p结点的元素减少到p-@
increaseKey (p,@):把p结点的元素增加到p+@
remove (p)一般都是先用decreaseKey(p,无限大),减少到最小,然后移动至堆顶端,用deleteMin方法删除。
buildHeap:构造堆原始集合
1 explicit BinaryHeap( const vector<Comparable> & items): array(item.size()+10),currentSize(items.size())
2 {
3 for(int i=0;i<items.size();i++)
4 array[i+1] = items[i];
5 buildHeap();
6 }
7 void buildHeap()
8 {
9 for( int i = currentSize/2; i>0;i--)
10 percolateDown(i);
11 }
- “AS3.0高级动画编程”学习:第三章等角投影(上)
- su: 无法设置用户ID: 资源暂时不可用
- NumPY学习笔记
- LVS负载均衡下session共享的实现方式-持久化连接
- Centos6.9下RabbitMQ集群部署记录
- “AS3.0高级动画编程”学习:第三章等角投影(下)
- zabbix监控主机cpu达到80%后报警
- ssh登陆服务器locale告警的处理方法
- as3.0中如何阻止事件冒泡?
- Nginx+upstream针对后端服务器容错的运维笔记
- MongoDB日常运维操作命令小结
- flash builder代码格式化以及其它快捷键
- Repeater,DataList,DataGrid
- flash/flex builder在IE中stage.stageWidth始终为0的解决办法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用Angular依赖注入自定义SAP Spartacus的ProductAdapter
- 获取SAP Spartacus当前显示产品json数据的又一办法
- SAP Spartacus注入自定义的CurrentProductService
- Redis系列(十三)应用之分布式锁
- Oracle数据库 sql条件查询语句与练习
- (六)Hive优化
- mapreduce -- wordcount执行流程
- (三)Hive基本操作命令
- 链表神操作 --- 快慢指针
- appium教程_2.概念加深
- [javascript] cdn模式下vue和vue-router实现路由
- (干货)前端实现导出excel的功能
- 完美解决JavaScript的深浅拷贝
- 来,我们在重新说下,线程状态?
- [不定时一题]LeetCode两数相加