首页 > 其他分享 >【数据结构】 堆(二叉堆)详解

【数据结构】 堆(二叉堆)详解

时间:2024-12-09 13:58:48浏览次数:3  
标签:数据结构 idx int 二叉 详解 swap heap now size

定义:

堆的底层数据结构是树,一般不引起歧义的情况下,堆指的是二叉堆,其底层数据结构是完全二叉树,堆分为大根堆和小根堆,大根堆的每个节点的父亲都大于当前节点,小根堆反之,本文以小根堆为例

二叉堆插入

思路:将要插入的树放在数组最后,令数组原来的大小为 \(size\) ,堆数组的名为 \(heap\) ,则 \(heap[++size]=x\) ,其中 \(x\) 为要插入的数字,之后将插入的数字不断向上调整即可(如图)

CODE:

void put(int x){
	heap[++size]=x;
	int now=size;
	while (now>1&&heap[now/2]>heap[now]){
		swap(heap[now/2],heap[now]);
		now/=2;
	}
}

时间复杂度: \(O(\log n)\)

二叉堆删除

思路:将要删除的元素与最后一个元素交换,同时 \(size--\) ,再将这个位置的树向下调整
CODE:

void del(int idx){
	swap(heap[size],heap[idx]);
	size--;
	while (idx*2<=size){
		int t=idx;
		idx*=2;
		if (idx+1<=size&&heap[idx]>heap[idx+1]) idx++;
		if (heap[idx]>=heap[t]) return ;
		swap(heap[t],heap[idx]);
	}
}

时间复杂度: \(O(\log n)\)

例题

[NOIP2004 提高组] 合并果子
例题代码:

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;

int n,heap[10005],size,ans;

void put(int x){
	heap[++size]=x;
	int now=size;
	while (now>1&&heap[now/2]>heap[now]){
		swap(heap[now/2],heap[now]);
		now/=2;
	}
}

void del(int idx){
	swap(heap[size],heap[idx]);
	size--;
	while (idx*2<=size){
		int t=idx;
		idx*=2;
		if (idx+1<=size&&heap[idx]>heap[idx+1]) idx++;
		if (heap[idx]>=heap[t]) return ;
		swap(heap[t],heap[idx]);
	}
}

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		int tmp;
		scanf("%d",&tmp);
		put(tmp);
	}
	for (int i=1;i<n;i++){
		int a=heap[1];
		del(1);
		int b=heap[1];
		del(1);
		put(a+b);
		ans+=a+b;
	}
	printf("%d",ans);
	return 0;
}

标签:数据结构,idx,int,二叉,详解,swap,heap,now,size
From: https://www.cnblogs.com/ZYStream/p/18594680

相关文章

  • 数据结构--排序
    排序是计算机科学与技术领域中的一项基本操作,旨在将一组数据按某种顺序排列。以下是几种常见排序算法的具体解释:一、冒泡排序(BubbleSort)工作原理冒泡排序算法的工作原理如下:比较相邻的元素。如果第一个比第二个大(对于升序排序,如果是降序则相反),就交换它们两个。对每一对......
  • Halcon中get_region_runs(Operator)算子原理及应用详解
    在Halcon中,get_region_runs算子用于从一个区域(Region)中提取连续的线段(runs),并返回这些线段的起始行号、起始列号和结束列号。这个算子特别适用于处理二值图像或区域对象,其中需要分析区域的连续部分。下面是对get_region_runs算子的详细解释:算子原型get_region_runs(Region......
  • Halcon中lines_gauss(Operator)算子原理及应用详解
    在Halcon图像处理库中,lines_gauss算子是一个用于检测图像中线条的强大工具,它能够提供亚像素精度的线条轮廓。以下是对lines_gauss(ImageReducedTracks,Lines,1.5,1,8,‘light’,‘true’,‘bar-shaped’,‘true’)算子的详细解释:一、算子功能lines_gauss算子主要......
  • 数据结构实验8
    1#include<iostream>2#include<string>3usingnamespacestd;4#defineMax_size10056voidselectSort(int*arr,intn)//简单选择排序7{8inti,j,k,temp;9for(i=0;i<n;i++){10k=i;11for(j......
  • mysqli_real_escape_string详解
    mysqli_real_escape_string是PHP中用于防止SQL注入的一种函数。它通过转义特殊字符来确保用户输入的安全性。以下是对该函数的详细介绍:函数概述用途:用于对字符串进行转义,以便安全地将其插入到SQL查询中。语法:stringmysqli_real_escape_string(mysqli$link,string......
  • LCR 047. 二叉树剪枝(中等)(主站814)
    https://leetcode.cn/problems/pOCWxh/https://leetcode.cn/problems/binary-tree-pruning/难度:☆☆☆题目:给定一个二叉树根节点root,树的每个节点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。节点node的子树为node本身,以及所有node的后......
  • 求解赫夫曼编码的算法 数据结构算法6.12、6.13
    一.问题描述定义赫夫曼树和赫夫曼编码的存储结构,并写出求解赫夫曼编码的算法。二.问题分析1.赫夫曼树的逻辑结构赫夫曼树(HuffmanTree)是一种用于数据压缩的二叉树,也称为最优二叉树。其逻辑结构主要包括以下特点:节点类型:赫夫曼树包含两种类型的节点,即内部节点(也称为非叶子......
  • 数据结构 (33)选择类排序
    前言    数据结构中的选择类排序主要包括简单选择排序(也称为选择排序)和堆排序。一、简单选择排序基本思想:简单选择排序是一种直观易懂的排序算法。它的工作原理是,在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最......
  • 数据结构 (34)归并排序
    前言    归并排序(MergeSort)是一种高效、稳定的排序算法,它采用分治法的思想,将待排序的序列分为若干个子序列,然后对这些子序列进行排序,最后再将排好序的子序列合并成一个完整的有序序列。一、基本思想    归并排序的核心思想是分治法,即将大问题分解为小问题......
  • Apollo功能及原理详解
    前言公司里面使用的配置中心是携程开源的Apollo,之前我只使用过Nacos,遂记录一下学习过程。Apollo工作原理模块介绍上图就是Apollo的总体设计,从下往上挨个分析:ConfigDB用于存储各种配置ConfigService提供配置的读取、推送等功能,服务对象是Apollo客户端,多实例,需要注册到Eure......