`
kmplayer
  • 浏览: 508831 次
  • 性别: 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++ 程序设计课件:第十四章 堆与拷贝构造函数 本资源摘要信息涵盖了 C++ 程序设计的第十四章,主要介绍堆和拷贝构造函数的相关知识点。下面是对 TITLE、DESCRIPTION、TAG 和 PART CONTENT 的详细解释: 1. 堆的...

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

    堆与拷贝构造函数 本章节主要内容包括堆的概念、需要 new 和 delete 的原因、分配堆对象、拷贝构造函数、浅拷贝与深拷贝、临时对象、无名对象、构造函数用于类型转换等。 1. 关于堆 在 C++ 程序的内存格局中,堆...

    上海交大C++面向对象

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

    算法导论第十四章习题解答

    第十四章通常聚焦于图算法,这包括了网络流、最小生成树、最短路径等核心概念。在解读书中的习题时,我们不仅可以深化对这些算法的理解,还能提升编程能力。 一、网络流问题 网络流问题在实际应用中广泛出现,如...

    算法导论第二十四章习题解答

    《算法导论》第二十四章习题解答涵盖了各种高级算法问题,这些题目旨在深化对算法的理解,提升编程技能。在这一章中,我们通常会遇到动态规划、图论、最优化算法等主题。以下是部分习题的解析和知识点概述: 1. **...

    编程珠玑 第二版 修订版

    第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 ...

    Java语言程序设计与数据结构(基础篇)第14章课后习题代码chapter14.rar

    在第14章,你可能会遇到关于树的插入、删除、查找操作的题目,或者要求实现特定类型的树结构,如堆(用于优先队列)或搜索树(用于高效查找)。 此外,图算法是解决许多实际问题的关键,如路径查找、最短路径计算等...

    数据结构 C++ 语言描述

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

    算法导论第二十章习题解答

    《算法导论》第二十章习题解答涵盖了各种高级算法问题,主要涉及图论和网络流等内容。在这一章中,作者深入探讨了如何解决实际问题,如最短路径、最大流最小割以及网络调度等问题。以下是部分习题的解析和相关知识点...

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

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

    编程珠玑源代码

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

    第14章 算法设计.zip

    第14章“算法设计”通常会深入探讨一系列关键概念、方法和技术,旨在帮助程序员和计算机科学家构建更智能、更高效的软件系统。在这个章节中,我们可能会接触到以下几个重要的知识点: 1. **算法的基本概念**:算法...

    堆排序算法实现

    本篇文章将基于《算法导论》第六章的内容,深入探讨堆排序的实现原理,并通过具体的C语言代码示例来展示其实现过程。 #### 二、堆排序基础概念 1. **二叉堆**:二叉堆是一种特殊的完全二叉树结构,分为最大堆和...

    算法导论第1-16章编程题答案

    8. **第十四章:字符串匹配算法** - KMP、Boyer-Moore、Rabin-Karp等算法在文本处理中扮演重要角色,Java实现有助于理解这些算法的高效性。 9. **第十一章:递推与遍历** - 递推关系的发现和遍历技术如深度优先搜索...

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

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

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

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

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

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

    算法导论-第三版(中文).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章 用于不相交集合的数据...

Global site tag (gtag.js) - Google Analytics