堆的相关知识

本文介绍了堆的基本概念,包括大顶堆和小顶堆,详细讲解了完全二叉树的顺序存储特性以及堆的存储方式。重点阐述了利用大根堆进行堆排序的方法及其时间复杂度分析,指出建堆和堆排序的过程,以及空间复杂度为O(1)。
摘要由CSDN通过智能技术生成


声明:本文都以大根堆为例。

1. 堆的基本概念

堆就是利用完全二叉树的结构来维护的一维数组。
大顶堆:每个结点的值都大于或等于其左右孩子结点的值。
小顶堆:每个结点的值都小于或等于其左右孩子结点的值。
排序,求升序用大顶堆,求降序用小顶堆。

2. 堆——二叉树的顺序存储

2.1 完全二叉树的顺序存储特性回顾

若点编号从1开始,共有n个节点,则对于点i:

  • 左儿子为2i;(编号从0开始,左儿子为2i+1)
  • 右儿子为2i+1;(编号从0开始,右儿子为2i+2)
  • 父亲节点为floor(i/2);
  • 所在层次为ceil(log2(i+1))或floor(log2(i))+1;
  • 2*i<=n表i有左儿子;
  • 2*i+1<=n表i有右儿子;
  • i>n/2表i为叶子节点(参考左右孩子的编号);

n/2为最后一个非叶子节点;

2.2 存储方式

把树存储在一个数组中,堆排序在此数组中原地排序,S(n)=O(1),其和逻辑中的树的对应关系见图。
在这里插入图片描述
在这里插入图片描述

2.3 建堆时的排序方式

调整思路:

  1. 非叶子节点不满足“大于子节点的特征”,需要调整;
  2. 如果先调整上面的节点,后调整下面的,那么下面调整完又要调整上面的, 所以从下面的节点开始倒序调整;
  3. 2中被划掉的推测有误,因为倒序调整时,上面的节点被换到下面来后,还是可能因太小不断“下沉”;倒序调整是为了让子树先满足性质,再不断扩大这个满足性质的子树。

3. 利用大根堆进行堆排序

3.1 方法

step1: 建堆,即把已有数组调整成大根堆。
step2: 利用大根堆给出有序数组,调整n次,每次把堆顶和堆底元素互换,然后下沉新的堆顶(每次堆都变小);第一次把根a[1]和a[n]调换,然后下沉新的a[1];第i次把根a[1]和数组的n+1-i个数a[n+1-i]调换,然后下沉新的a[1],此时a[n+2-i…n]都是有序的了;调整完的数组是上升数组。

3.2 算法分析

  • 建堆的时间复杂度为O(n)。
  • 建堆时排序的时间复杂度为O(n*log2n) (插入一个是O(log2n))。
  • 堆排序总的时间复杂度为O(n)+O(nlog2n) =O(n*log2n) 。
  • 空间复杂度O(1)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值