2023/1/11总结

今天AC了俩个题目:

第一题:P4391 [BOI2009]Radio Transmission 无线传输

https://blog.csdn.net/lxh0113/article/details/128649662?spm=1001.2014.3001.5501

第二题:P8630 [蓝桥杯 2015 国 B] 密文搜索

https://blog.csdn.net/lxh0113/article/details/128646440?spm=1001.2014.3001.5501

然后学习了关于堆的一些知识:

1.堆是一个完全二叉树。

2.如果堆的父节点都小于子节点,那么就叫小根堆或者最小堆,如果堆的父节点都大于子节点,那么就叫大根堆或者最大堆。

3.堆是一个完全二叉树,但是堆的存储方式是使用数组存储的,利用层序遍历的特点我们可以知道当子节点为   i    时,俩个孩子节点分别为 2*i+1   2*i+2 

4.堆的俩个基本操作分别为  上滤  和  下滤。

下滤是由上而下对于每个最大的子节点,去交换,直到满足堆序性。

上滤就是由下往上对于父节点,去交换,直到满足堆序性。主要用于插入操作。

5.建立堆有俩个方法一个是  自顶向下建堆法,有点类似于插入排序,每次都将新节点放入末尾的位置,执行上滤操作,使它满足堆序性。另外一个方法是子夏而上建堆法,先是建立一个堆,然后对于每一个父节点进行下滤操作。

这里有一个优先队列的使用方法,利用堆的特点以及队列的特点,每次上滤会得到一个最小值,或者最大值,然后在数据里面弹出这个最小值或者最大值,然后调整堆(就是将末尾的元素放入那个需要确定的位置),每次利用上滤操作弹出一个元素,直到最后出队完成,我们就能得到一个排好序的数组。这个也叫堆排序。

你可能感兴趣的:(c++,c语言,数据结构,算法)