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语言描述》复习——第五章“堆”——二叉堆的更多相关文章

  1. 《数据结构与算法分析——C语言描述》ADT实现(NO.03) : 二叉搜索树/二叉查找树(Binary Search Tree)

    二叉搜索树(Binary Search Tree),又名二叉查找树.二叉排序树,是一种简单的二叉树.它的特点是每一个结点的左(右)子树各结点的元素一定小于(大于)该结点的元素.将该树用于查找时,由于二 ...

  2. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  3. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  4. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  5. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  6. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  7. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

  8. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  9. 【数据结构与算法分析——C语言描述】第二章总结 算法分析

    算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...

随机推荐

  1. Altium_Designer-PCB中各层作用详解

    一直以来,对PCB中各层,比如:solder层.paste层.Top overlay层等等这些一知半解.今天仔细看了下,向大家介绍一下,有不对的地方还请指正. 1.mechanical机械层是定义整个 ...

  2. 94. Binary Tree Inorder Traversal(inorder ) ***(to be continue)easy

    Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...

  3. Linux 命令后台运行

    写这个随笔主要是每次Deepin用shadowsocks的时候总需要命令行启动,然后一个终端就一直开着总是点错了就给关了. (不知道为什么我的Deepin的shadowsocks-qt5总是连接不上的 ...

  4. Linux空间PHP开发环境小白教程(LAMP)

    租了一个云服务器, 但是只有linux系统,没有php开发环境, 只好自己摸索着一步一步安装啦. 本教程来自自学IT创E老师的Linux教程,想详细了解的可以去论坛找. 一.使用PUTTY登录服务器 ...

  5. java基础30问

    Java基础知识30问   1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用 ...

  6. poj_3641_Pseudoprime numbers

    Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). Th ...

  7. Shell学习——列出当前路径下所有目录

    1.ls -d */[root@client02 ~]# ls -d */Desktop/ Documents/ Downloads/ jq-1.5/ Music/ Pictures/ Public/ ...

  8. yii2 的登录注册 轮子

    //利用到了yii2 框架之中的验证规则 进行判定而已 也不是很高深的东西  但是 使用框架自身的轮子 会有安全性能的隐患 1注册reg controller 中 我都以admin 为例子 publi ...

  9. 删除警告的方法 python

    import warningswarnings.filterwarnings('ignore')

  10. 用python实现【五猴分桃】问题

    转载链接:https://blog.csdn.net/cy309173854/article/details/78296839 据说“五猴分桃”问题最先是由大物理学家狄拉克提出来的,这一貌似简单的问题 ...