《数据结构与算法分析: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) ≤ ...
随机推荐
- 【转】run方法与start方法的区别
在java线程中 start与run的不同start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候 ...
- Metasploitable渗透测试实战——生成木马
攻击机:kali 目标机:windows 1.生成木马 wincap发送至本机 2.进入msf (命令:msfconsole)启动监听 3.当目标点击test.exe(可伪装)时,触发后门,实现入 ...
- java集合框架——List
一.List接口概述 List有个很大的特点就是可以操作角标. 下面开始介绍List接口中相对于Collection接口比较特别的方法.在Collection接口中已经介绍的方法此处就不再赘述. 1. ...
- Android 中间白色渐变到看不见的线的Drawable
用gradient <gradient android:startColor="#00ffffff" android:centerColor="#ffffff&qu ...
- 2019.03.14 ZJOI2019模拟赛 解题报告
得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...
- 动态数组第k小,Poj(1442)
题目链接:http://poj.org/problem?id=1442 本来想复制一下,然后直接sort,结果T了. 在网上看了一下,有用两个队列做的,想了半天,没看懂什么意思.后来模拟一边,总算是懂 ...
- IDEA的常用操作(快捷键)
IDEA的常用操作(快捷键) Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt ...
- eclipse使用maven install 命令,生成war包中没有jsp/js/css的解决方法
在pom.xml文件中添加如下11行代码就可以了. <build> <plugins> <plugin> <groupId>org.apache.mav ...
- 抽象类和final
抽象类: 概念:在继承过程中,形成一个继承金字塔,位于金字塔底部的类越来越具体(强大),位于塔顶的越来越抽象(简单). 关键字 :abstract 抽象类特性: [1]抽象类过于抽象,实例化后无语义 ...
- Spring是如何管理Bean
容器是什么?spring中是如何体现的?一直有疑惑,这两天看了一下Spring管理bean的Demo,对于Spring中的容器有了简单的认识. 我们知道,容器是一个空间的概念,一般理解为可盛放物体的地 ...