《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆
2014.06.15 22:14
简介:
堆是一种非常实用的数据结构,其中以二叉堆最为常用。二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序。我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中。
图示:
下图是一个最大堆:

实现:
优先队列是STL中最常用的工具之一,许多算法的优化都要利用堆,使用的工具就是优先队列。STL中的优先队列通过仿函数来定义比较算法,此处我偷懒用了“<”运算符。关于使用仿函数的好处,我之后如果有时间深入学习STL的话,再写博文分析吧。
// My implementation for priority queue using binary heap.
#include <iostream>
#include <string>
#include <vector>
using namespace std; template <class T>
class PriorityQueue {
public:
PriorityQueue() {
m_data.push_back();
} PriorityQueue(const vector<T> &data) {
m_data.push_back();
for (size_t i = ; i < data.size(); ++i) {
m_data.push_back(data[i]);
}
_makeHeap();
} bool empty() {
return m_data.size() == ;
} size_t size() {
return m_data.size() - ;
} T top() {
return m_data[];
} void push(const T &val) {
m_data.push_back(val); int n = size();
int i = n; while (i > ) {
if (m_data[i / ] < m_data[i]) {
_swap(m_data[i / ], m_data[i]);
i /= ;
} else {
break;
}
}
} void pop() {
int n = size();
m_data[] = m_data[n];
m_data.pop_back();
--n; int i = ;
T max_val;
while (i * <= n) {
max_val = i * == n ? m_data[i * ] : _max(m_data[i * ], m_data[i * + ]);
if (m_data[i] < max_val) {
if (max_val == m_data[i * ] || i * == n) {
_swap(m_data[i], m_data[i * ]);
i = i * ;
} else {
_swap(m_data[i], m_data[i * + ]);
i = i * + ;
}
} else {
break;
}
}
} void clear() {
m_data.resize();
} ~PriorityQueue() {
m_data.clear();
}
private:
vector<T> m_data; T _max(const T &x, const T &y) {
return x > y ? x : y;
} void _swap(T &x, T &y) {
T tmp; tmp = x;
x = y;
y = tmp;
} void _makeHeap() {
int n = size();
int i, j;
T max_val; for (j = n / ; j >= ; --j) {
i = j;
while (i * <= n) {
max_val = i * == n ? m_data[i * ] : _max(m_data[i * ], m_data[i * + ]);
if (m_data[i] < max_val) {
if (max_val == m_data[i * ] || i * == n) {
_swap(m_data[i], m_data[i * ]);
i = i * ;
} else {
_swap(m_data[i], m_data[i * + ]);
i = i * + ;
}
} else {
break;
}
}
} n = size();
cout << '[';
for (int i = ; i <= n; ++i) {
cout << m_data[i] << ' ';
}
cout << ']' << endl;
}
}; int main()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
PriorityQueue<int> pq(v);
string s;
int n; while (cin >> s) {
if (s == "push") {
cin >> n;
pq.push(n);
} else if (s == "pop") {
pq.pop();
} else if (s == "top") {
cout << pq.top() << endl;
} else if (s == "end") {
while (!pq.empty()) {
pq.pop();
}
break;
}
} return ;
}
《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆的更多相关文章
- 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)
二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 读书笔记:《数据结构与算法分析Java语言描述》
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- 【数据结构与算法分析——C语言描述】第二章总结 算法分析
算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...
随机推荐
- PB导出规定格式DBF文件 dBase 3 格式 222个字段
最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...
- Linux 使用第三方邮箱发邮件的设置
mail命令在Ubuntu下是需要安装的,使用下条命令进行安装: sudo apt-get install heirloom-mailx 在CentOS 下安装则是: yum install mail ...
- 运行在 Android 系统上的完整 Linux -- Termux
Termux 可以在安卓系统上搭建一个完整的linux 环境,类似于 cygwin 并非linux 虚拟机,整个安装包只有 几百KB 刚开始觉得这东西的命令行很难用,看了官方介绍后才发现它原来有许多 ...
- MySQL中的if和case语句使用总结
create table test( id int primary key auto_increment, name ), sex int ) ),(),(),() ,'男','女') from te ...
- elsevier期刊要求翻译
百度文库 http://wenku.baidu.com/view/e20a27e84afe04a1b071de4e.html 官网文档 http://www.elsevier.com/journals ...
- using System.Security.Cryptography
这个命名空间主要是用来进行加密的一些类. 加密服务: 公共网络(如 Internet)不提供实体之间安全通信的方式. 此类网络上的通信易被读取或甚至被未经授权的第三方修改. 加密有助于防止数据被查看, ...
- C# if语句
一.C# if语句 if语句根据条件判断代码该执行哪一个分支. if语句有两个或两个以上的分支供代码选择,但是每次只能执行一个分支. 1. 基本if语句 语法格式如下: if(expression){ ...
- Leetcode463. Island Perimeter
题目 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表 ...
- 实例:关于ALV控件可编辑的整理
使ALV控件中的内容可编辑 这应该是一个非常有用的功能,这样我们便可以用它来代替table control来编出一些有这现成功能的界面来.实际上,让alv中的内容可以被编辑与alv的事件无关.但是经常 ...
- 介绍hadoop中的hadoop和hdfs命令
有些hive安装文档提到了hdfs dfs -mkdir ,也就是说hdfs也是可以用的,但在2.8.0中已经不那么处理了,之所以还可以使用,是为了向下兼容. 本文简要介绍一下有关的命令,以便对had ...