`
kmplayer
  • 浏览: 500379 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第14章 堆

阅读更多
1,二叉树是否是一个堆,由两个性质决定:
(1)顺序:任何结点的值都小于或等于其子节点的值;
(2)形状:最多两层上具有叶子结点,其中最底层的叶子节点尽可能的靠左分布.树中不存在空闲的位置,即所有结点到根结点的距离都不超过log2n.

2,树中常见的函数定义如下:根结点位于x[1]
root=1
value(i)=x[i]
leftchild(i)=2*i
rightchild(i)=2*i+1
parent(i)=i/2
null(i)=(i<1)or(i>n)
如下图:




3,关键函数:siftup
策略:尽可能地将元素向上筛选,直到元素大于其父结点或位于树根.
结果:如果heap(1,n-1)为真,经过siftup,heap(1,n)为真.
代码:
void sitfup(n)
		pre n > 0 && heap(1, n-1)
		post heap(1, n)
	i = n
	loop
		if i == 1
			break;
		p = i / 2;
		if x[p] <= x[i]
			break;
		swap(p, i)
		i = p

运行时间和logn成正比.

4,关键函数:sitfdown
策略:将x[1]向下筛选,和较小的子结点交换,直到没有子结点小于它的子结点.
heap(1, n),如果给x[1]分配一个新值,得到heap(2, n).
代码:
void siftdown(n)
		pre heap(2, n) && n>=0
		post heap(1, n)
	i = 1
	loop
		c = 2*i
		if c > n
			break;
		if c+1 <= n
			if x[c+1] < x[c]
					c++ //取较小的子结点
		if x[i] <= x[c]
			break;
		swap(c, i);
		i = c;

运行时间和logn成正比.

5,堆排序
第一阶段:
建立heap(1,n)
for i = [2, n]
sifup(i);
第二阶段:
建立有序序列
for (i = n; i >= 2; i--)
swap(1, i);
siftdown(i-1);

6,优先级队列:
template<class T>
class priqueue
{
public:
	priqueue(int maxsize); //初始化集合为空
	void insert(T t);
	T extracmin();
}

void insert(t)
	if n >= maxsize
		report error;
		break;
	n++;
	x[n] = t;
	siftup(n);

T extractmin()
	if n < 1
		report error;
		break;
	t = x[1];
	x[1] = x[n--];
	siftdown(n);
	return t;

7,实例代码:
#include <iostream>
#include <ctime>
using namespace std;

template<class T>
class priqueue
{
public:
    priqueue(int m) : n(0), maxsize(m), x(new T[maxsize+1]) {}

    void insert(T t)
    {
        x[++n] = t;
        for(int i = n, p; i > 1 && x[p = i/2] > x[i]; i = p)
            swap(p, i);
    }

    T extractmin()
    {
        T t = x[1];
        x[1] = x[n--];
        for (int i = 1, c; (c = 2*i) <= n; i = c)
        {
            if ( c+1 <= n && x[c+1] < x[c])
                c++;
            if ( x[i] <= x[c])
                break;
            swap(i, c);
        }
        return t;
    }

private:
    void swap(int i, int j)
    {
        T t = x[i];
        x[i] = x[j];
        x[j] = t;
    }

private:
    int n, maxsize;
    T* x;
};

int main()
{
    srand(time(0));
    int m = 100;
    priqueue<int> pq(100);
    for (int i=0; i < m; i++)
        pq.insert( rand()%500 );
    for (int i=0; i < m; i++)
    {
        cout << pq.extractmin() << " ";
        if ( (i + 1) % 10 == 0 )
            cout << endl;
    }
	return 0;
}
  • 大小: 18.4 KB
分享到:
评论

相关推荐

    C 程序设计课件:第14章 堆与拷贝构造函数.ppt

    C 程序设计课件:第14章 堆与拷贝构造函数.ppt

    C++程序设计课件:第14章 堆与拷贝构造函数.ppt

    C++程序设计课件:第14章 堆与拷贝构造函数.ppt

    上海交大C++面向对象

    第一章 C++入门 ...第十四章 堆与拷贝构造函数 第十五章 静态成员与友员   第十六章 继承 第十七章 多重继承 第十八章 运算符重载   第十九章 I/O流 第二十章 模板 第二一章 异常处理

    编程珠玑 第二版 修订版

    第14章 堆 141 14.1 数据结构 141 14.2 两个关键函数 143 14.3 优先级队列 145 14.4 一种排序算法 148 14.5 原理 150 14.6 习题 150 14.7 深入阅读 152 第15章 字符串 153 15.1 单词 153 15.2 短语 156 ...

    算法导论(第2版)参考答案

     第十四章 扩充的数据结构(Augmenting Data Structures)  第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques)  第十五章 动态规划(Dynamic Programming)  第十六章 ...

    数据结构 C++ 语言描述

    第一章 数据结构入门 第二章 对象设计技术 第三章 算法概述 第四章 向量容器 第五章 指针和动态内存 第六章 表容器和迭代器 第七章 栈 ...第十四章 堆、2进制文件和位组 第十五章 递归算法 第十六章 图

    算法设计技巧与分析 电子工业出版社

    第一部分 基本概念和算法导引 ... 第14章 随机算法 第15章 近似算法 第六部分 域指定问题的迭代改进 第16章 网络流 第17章 匹配 第七部分 计算几何技术 第18章 几何扫描 第19章 Voronoi图解 参考文献

    编程珠玑源代码

    第1章 开篇,第2章 啊哈!算法,第3章 数据决定程序结构,第4章 编写正确的程序,第5章 编程小事,第6章 程序性能分析,第7章 粗略估算,第8章 算法设计技术,第9章 代码...搜索,第14章 堆,第15章 字符串

    Java数据结构与算法中的源代码和applet - 站长下载

    第十四章堆栈 第十五章队列与优先队列 第十六章二叉树 第十七章二叉树的应用 第十八章二叉搜索树 第十九章集与映射 第二十章有序集与映射的实现 第二十一章实现映射的散列法 第二十二章堆 第二十三章位数与文件压缩 ...

    HCIA-Datacom 培训视频教程【共143集】.rar

    第14章 网络地址转换 第15章 网络服务与应用 第16章 WLAN概述 第17章 广域网技术 第18章 网络管理与运 第19章 IPv6基础 第20章 SDN与NFV概述 第21章 网络编程与自动化 第22章 园区网典型组网架构及案例实践

    HCIA-Datacom LVC公开课培训视频教程共143集.zip

    网盘文件永久链接 第1章数据通信网络基础 ...第14章网络地址转换 第15章网络服务与应用 第16章WLAN概述 第17章广域网技术 第18章网络管理与运维 第19章IPv6基础 第20章SDN与NFV概述 第21章网络编程与自动化 ...........

    算法导论(中文 第二版)答案

     第十四章 扩充的数据结构(Augmenting Data Structures)  第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques)  第十五章 动态规划(Dynamic Programming)  第十六章 ...

    算法导论-第三版(中文).rar

    第十四章 扩充的数据结构(Augmenting Data Structures) 第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques) 第十五章 动态规划(Dynamic Programming) 第十六章 贪婪算法...

    算法导论 第二版

    第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第15章 动态规划 第16章 贪心算法 第17章 平摊分析 第五部分 高级数据结构 概述 第18章 B树 第19章 二项堆 第20章 斐波那契堆 第21章 用于不相交集合的数据...

    算法导论(第二版 中文高清版)

    第14章 数据结构的扩张 第四部分 高级设计和分析技术 导论 第15章 动态规划 第16章 贪心算法 第17章 平摊分析 第五部分 高级数据结构 概述 第18章 B树 第19章 二项堆 第20章 斐波那契堆 第21章 用于不相交集合的数据...

    算法导论第三版英文原版

    第十四章 扩充的数据结构(Augmenting Data Structures) 第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques) 第十五章 动态规划(Dynamic Programming) 第十六章 贪婪算法...

    算法导论(原书第二版)

    第十四章 扩充的数据结构(Augmenting Data Structures) 第四部分(Part IV) 高级的设计与分析技术(Advanced Design and Analysis Techniques) 第十五章 动态规划(Dynamic Programming) 第十六章 贪婪算法...

    C++ STL开发技术导引(第5章)

    第14章 multimap多重映照容器 207 14.1 multimap技术原理 207 14.2 multimap应用基础 210 14.3 本章小结 216 第15章 hash_set哈希集合容器 217 15.1 hash_set技术原理 217 15.2 hash_set应用基础 230 ...

    C++ STL 开发技术导引(第6章)

    第14章 multimap多重映照容器 207 14.1 multimap技术原理 207 14.2 multimap应用基础 210 14.3 本章小结 216 第15章 hash_set哈希集合容器 217 15.1 hash_set技术原理 217 15.2 hash_set应用基础 230 ...

Global site tag (gtag.js) - Google Analytics