5.1 堆(heap)(解决优先队列)

5.1.1 定义


优先队列(Priority Queue):特殊的“ 队列”,取出元素的顺序是依照元素的优先权(关键字) 大小,而不是元素进入队列的先后顺序。

即可认为
每个加入队列的值有一定的意义(大小),进入队列没有规定,但是出队列要根据一定的意义(大小)出队列。

5.1.2 存储和特性

我们运用优先队列

特性:
1. :用数组表示的完全二叉树
2. $\color{有序性** : 任一结点 的关键字是其子树所有结点的最大值( 或最小值)
- “最大堆(MaxHeap)”,也称”大顶堆”:最大值
- “最小堆 ( MinHeap)”,也称”小顶堆”:最小值

5.1.3 堆抽象数据类型

5.1.3.1插入

5.1.3.2 删除

5.1.4 总结

1.了解堆的定义和结构;
2.会识别最大堆和最小堆,能做出相关习题;
3.编程(插入、删除、建立)。

5.2 哈夫曼树(解决编码)

5.2.1 定义

:将百分制的考试成绩转换成五分制的成绩?

如何根据结点不同的查找频率构造更有效的搜索树?

(WPL) : 设二叉树有 n 叶子结点 ,每个叶子结点带有权值 wk ,从根结点到每个叶子结点的长度为 lk ,则每个叶子结点的带权路径长度之和就是:
WPL=ni=1wklk

(最小二叉树):WPL最小的二叉树。

5.2.2 构造与特点

1.

  1. 把数据从小到大进行排列(构造最小堆);
  2. 每次把 权值最小的两棵 二叉树(节点)合并。

2.

  1. 没有度为1 的结点;
  2. n 个叶子结点的 哈夫曼树共有 2n1 个结点 ;
  3. 哈夫曼树的任意非叶节点左右子树交换 后仍是哈夫曼树 ;
  4. 对同一组 权值 {w1,w2,,wn} ,存在 不同构的两棵哈夫曼树

例如:
对一组 权值 {1,2,3,3} ,可构成:不同构 的两棵哈夫曼树。

5.2.3 哈夫曼树编码

1.
给定一段字符串,如何 对字符进行编码 ,可以使得该字符串的编码存储空间最少!

:假设有一段文本,包含 58 个字符,并由以下 7 个字符构: aeistspnl ;这 7 个字符出现的次数不同。如何对这7 个字符进行编码,使得总编码空间最少?

进行不等长编码需注意:
(prefix code ):任何字符的编码都不是另一字符编码的前缀

进行编码(编码代价最小):
(1 )左右分支: 0 1
(2 )字符只在叶结点上。

2.

  1. 为五个使用频率不同的字符设计哈夫曼编码,下列方案中哪个不可能是哈夫曼编码?
    A. 00,100,101,110,111
    B. 000,001,01,10,11
    C. 0000,0001,001,01,1
    D. 000,001,010,011,1

**解析:**A

根据编码规则建立一个编码树,然后对于任何给定的要判断的码,起始结点设为根结点,读到一个0,转到左儿子,读到一个1,转到右儿子,直到读完,这时检查走到的结点是不是叶子结点~因为没有提到是最优编码,所以构成的编码树树不一定是哈夫曼树,该结点不必须由两个儿子。

5.3 集合

  1. : 交、并、补、差,判定 一个元素是否属于某一集合。
  2. :集合 查找 某元素属于什么集合。
    • 可以 用 树结构 表示集合;
    • 采用数组存储形式。
  1. 查找(返回根节点)

  2. 并集合(一个根结点的父结点指针设置成另一个根结点 的数组下标

5.4

#include<stdio.h>

#define MAXH 1001
#define MINH -10001

int H[MAXH],size;

void Create()
{
    size = 0;
    H[0] = MINH;
    /*设置"岗哨"*/
}

void Insert(int X)
{
    int i;
    for(i=++size;H[i/2]>X;i/=2)
        H[i] = H[i/2];
    H[i] = X;
}

int main()
{
    int count,outCount,x,i,outNumb;
    scanf("%d %d",&count,&outCount);
    Create();
    for(i = 0; i < count; i++)
    {
        scanf("%d",&x);
        Insert(x);
    }
    for(i = 0; i < outCount ; i++)
    {
        scanf("%d",&outNumb);
        printf("%d",H[outNumb]);
        while(outNumb>1)
        {
            outNumb/=2;
            printf(" %d",H[outNumb]);
        }
        printf("\n");
    }
    return 0;
}

陈越《数据结构》第五讲 树下的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 我可以使用AVCaptureSession将AAC流编码到内存吗?

    解决方法我最后向Apple寻求建议.似乎AVCaptureSession抓住了AAC硬件编码器,但只允许您使用它直接写入文件.您可以使用软件编码器,但您必须专门询问它而不是使用AudioConverterNew:同当然,软件编码器会占用cpu资源,但会完成工作.

  3. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  4. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  5. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  6. ios – NSString cString已被弃用.什么是替代品?

    我有另一个新手问题.我写了一段代码,将Nsstring转换为NSMutableData,以模拟一个webService结果.但事实证明,cString已被弃用.你可以帮我更换吗?这是我的代码解决方法>从字符串获取原始字节.>获取UTF8编码中这些字节的长度.>使用dataWithBytes:length:方法创建NSData对象.

  7. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

  8. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. ios4 – xcode上的奇怪错误:解析问题Unknow类型名称’plementation’

    在线上:Xcode4说:错误解析问题UnkNow类型名称’plementation’之后有很多解析问题.但该项目在iPhone上工作.我真的不知道是什么…id=27对于我自己的项目,我用TextWrangler打开了违规文件,并用“Western”编码重新保存它们,到目前为止,还没有从LLVM/Clang得到任何进一步的问题.

  10. ios – 如何删除/解码URL百分比编码?

    我想要一个url并将其转换成更易读的格式.例如我有以下链接:我拿走了不必要的部分,并留下了“Sándor_Font”作为Nsstring.有没有什么方式将它转换成“SándorFont”,而不必输出每一个特殊字符的组合并替换字符串的每个部分?为了演示如何使用它,我写了以下示例代码:最后我要标签说“SándorFont”不是“Sándor_Font”.谢谢!

随机推荐

  1. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  2. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

  3. 陈越《数据结构》第一讲 基本概念

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  4. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

  5. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  6. 【数据结构】【C++STL】FIFO队列&amp;优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  7. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  8. 【数据结构】链表

    线性表的顺序存储结构有存储密度高及能够随机存取等优点,但存在以下不足:线性表的链式存储(单链表)的实现单向循环链表的实现

  9. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  10. BZOJ 1895 &amp; POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

返回
顶部