《数据结构与算法分析: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) ≤ ...
随机推荐
- mongdb增加字段和删除字段
增加字段 db.xxx.update({},{"$set":{"column1":1,"column2":0}},false,true); ...
- COGS 678. 双重回文数
★ 输入文件:dualpal.in 输出文件:dualpal.out 简单对比时间限制:1 s 内存限制:128 MB Dual Palindromes 双重回文数 描述 [USACO ...
- April 24 2017 Week 17 Monday
Much effort, much prosperity. 越努力,越幸运. I have ever seen this sentence in many people's signature of ...
- 轻量级HTTP服务器Nginx(配置与调试Nginx维护Nginx)
轻量级HTTP服务器Nginx(配置与调试Nginx) 文章来源于南非蚂蚁 Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/opt/nginx/conf ...
- 1.3配置存储单元(nbu重删池)
1.3配置存储单元 在备份或归档操作时,NetBackup将数据通过存储单元写到物理介质上,NetBackup支持三种类型的存储单元.即: 介质管理器.磁盘和NDMP. 1.3.1介质管理存储单元配置 ...
- 百度非会员满速下载利器(IDM)Internet Download Manager v6.30.8 中文特别版
下载利器(IDM)Internet Download Manager v6.30.8 中文特别版 所属分类:工具软件 应用平台:Windows 资源版本:v6.30.8 最后更新:2018年04月14 ...
- TeamCity实战(2):NuGet服务器
如果有在内网架设NuGet服务器的需要,比如说公司要求所有开发人员的开发机与外网隔离,但是项目开发又必须要通过NuGet获取开发包的情况. 打开选项其实很简单,但是打开之后怎么样更新开发包要复杂些了. ...
- 【转】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
转载自:http://m.blog.csdn.net/blog/lihongli528628/45483463 [git 删除本地分支] git branch -D br [git 删除远程分支] g ...
- 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题
解决思路 众所周知,MVC中调用的微软的组件JavaScriptSerialer...,格式DateTime类型数据需要在客户端专门解. 还知道,NewtonSoft.json可以“正确”的格式化Da ...
- C# continue语句
一.C# continue语句 continue语句在循环体中结束本次循环,而重新开始下一次循环. 语法格式如下: continue;二.示例 using System;using System. ...