堆的相关知识

我们知道在一个堆中满足任意子树的根大于其儿女则,这个堆为最大堆,反之亦然,为最小堆。

我们也有如下几个较为重要的性质:

(1):一个堆中至多有2^(n+1) -1个节点,至少有2^n个节点。

(2):设堆A有n个节点,则其叶节点下标为⌊(n/2)⌋+1,⌊(n/2)+2⌋,⌊(n/2)+3⌋,……,n。

(3):设MAX-HEAPIFY(i)过程可使以第i个节点为根的子树成为最大堆。

(4):当对(n/2)+1以后的节点进行MAX-HEAPIFY过程不会产生影响。

(5):MAX-HEAPIFY过程时间复杂度为O(lgn)。因为lgn=h,最多只递归h次。

(6):节点高度(height of node)从在该节点下的最低的叶子向上,该节点所在的层数。

(7):节点深度(depth of node) 从根节点向下,经过的层数。

(8):在任一有n个元素的堆中,最多有(n/2^(h+1))⌋个高度为h的节点(不是深度)。


现在我们讲一下如何建最大堆,过程——BUILD-MAX-HEAP(A)

我们需要将一个数组A[1..n]变成一个最大堆。我们需要对其所有非叶子节点进行MAX-HEAPIFY过程。所以我们只需从⌊n/2⌋至1去递归过程即可。


现讲一下堆排序的算法(从大到小):

其实就是先把堆变成最大堆,然后再取出首元素,然后再把第n个元素与第1个元素调换,并调用MAX_HEAPIFY(1)使得当前以第一个元素为根的子堆依然满足最大堆性质,从而导致整个堆满足,以保证下次调换的正确性,整个过程的时间复杂度约为O(nlgn)

CTF入门基础知识是指在CTF(Capture The Flag)比赛中,掌握关于(heap)的一些基础知识是计算机内存的一部分,用于存储动态分配的数据。在中,数据可以通过malloc()和free()这样的函数进行分配和释放。 为了应对CTF相关的问题和挑战,以下是几个基础知识点: 1. 管理:了解内存的布局,包括段(heap segment)的起始地址、结束地址以及分配的内存块。此外,还需要了解块(heap chunk)的结构,包括块的头部和尾部。块中的元数据通常用于管理分配和释放。对于不同的管理器,其块结构可能有所不同。 2. 溢出漏洞:溢出是一种常见的漏洞类型。当程序没有正确地管理内存时,会导致溢出漏洞。攻击者可以通过溢出篡改重要的数据或劫持程序流程。学习如何利用溢出漏洞可以帮助我们理解程序的弱点以及如何加强安全性。 3. 分配技巧:在CTF中,有时需要进行分配,比如分配特定大小的块或者创建一定数量的块。掌握一些分配技巧可以帮助我们解决一些相关的CTF问题。 4. 利用技术:了解利用技术是掌握CTF基础的重要部分。常见的利用技术包括重叠块、fastbin攻击、unsorted bin攻击等。通过这些技术,攻击者可以在利用溢出漏洞时实现特定的攻击目标。 以上是CTF入门基础知识的一些关键点。通过学习和实践,逐渐掌握这些知识可以帮助我们在CTF比赛中更好地理解和解决相关的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值