首页 > 编程语言 >C++U7-4-树及其应用(一)

C++U7-4-树及其应用(一)

时间:2024-05-06 23:01:13浏览次数:13  
标签:应用 int U7 C++ son pa heap 节点 size

堆及其应用(一)

 预先掌握

 堆的定义

  • 堆:是一种特殊的树形数据结构,通常指的是二叉堆,可以被看作一棵完全二叉树。堆的特点是每个节点的值都大于等于(对于最大堆)或小于等于(对于最小堆)其子节点的值。堆的根节点包含最大值(最大堆)或最小值(最小堆)。
  • 用途:堆:主要用于实现优先队列,支持高效地从队列中提取最大或最小元素。堆还常用于堆排序算法中,该算法利用堆的性质实现了快速排序。此外,堆在带权任务调度、频率统计和数据压缩等领域也有重要应用。

 

"堆" 在计算机科学和日常生活中都有多种含义,但在这里我主要讨论它在计算机科学中的数据结构和算法中的应用。

堆(Heap) 是一种特殊的树形数据结构,通常是一个完全二叉树。堆有两个主要类型:

  1. 最大堆(Max Heap):在最大堆中,对于除了根以外的每个节点 i,都有 A[parent(i)] >= A[i],其中 A 是包含堆元素的数组,parent(i) 是返回节点 i 的父节点索引的函数。这意味着根节点包含堆中的最大值。
  2. 最小堆(Min Heap):在最小堆中,对于除了根以外的每个节点 i,都有 A[parent(i)] <= A[i]。这意味着根节点包含堆中的最小值。

堆的一个重要特性是它们可以通过数组高效地实现,因为它们是完全二叉树。给定一个节点在数组中的索引 i(通常从 0 开始),其左子节点的索引是 2i+1,右子节点的索引是 2i+2,其父节点的索引是 (i-1)/2(在向下取整的情况下)。

堆的性质

 

 

 操作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[【堆及其应用一】大根堆]

 

【算法分析】
用输入的 n 个数建立一个大根堆,然后 for 循环 从 1∼n 输出堆数组。

【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
int heap[maxn], heap_size;
void put(int d) {
    int son, pa;
    heap[++heap_size] = d;//新增一个结点,值为d
    son = heap_size;
    while (son > 1) { //向上调整,使其满足大根堆的性质
        pa = son >> 1; //找到父节点
        if (heap[son] <= heap[pa]) break; //如果父节点的值大于等于儿子结点,调整完毕
        swap(heap[son], heap[pa]);  //向上调整
        son = pa;
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        put(x);
    }
    for (int i = 1; i <= n; i++) cout << heap[i] << " ";
    return 0;
}
View Code

 

 

 

 

 

 

 

【堆及其应用一】排序1

 

【算法分析】
建立一个大根堆,每次输出堆顶的元素,然后将堆顶元素删除(删除之后要调整堆使得满足大根堆的性质),这样就可以使得元素从大到小排序。

【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
int heap[maxn], heap_size;
void put(int d) {
    int son, pa;
    heap[++heap_size] = d;//新增一个结点,值为d
    son = heap_size;
    while (son > 1) { //向上调整,使其满足大根堆的性质
        pa = son >> 1; //找到父节点
        if (heap[son] <= heap[pa]) break; //如果父节点的值大于等于儿子结点,调整完毕
        swap(heap[son], heap[pa]);  //向上调整
        son = pa;
    }
}
//返回堆顶的值,并删除堆顶
int get() {
    int pa, son, res;
    res = heap[1]; //存储堆顶的值
    heap[1] = heap[heap_size--]; //用最后一个元素覆盖堆顶,并把堆元素个数减一
    pa = 1;
    //向下调整
    while (pa * 2 <= heap_size) {
        son = pa * 2;
        if (son < heap_size && heap[son + 1] > heap[son]) son++;//找到存在的儿子中最大的一个
        if (heap[pa] >= heap[son]) break; //调整完毕
        swap(heap[pa], heap[son]);//向下调整
        pa = son;
    }
    return res;//返回堆顶的值
}
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        put(x);
    }
    while (heap_size) {
        cout << get() << " ";
    }
    return 0;
}
View Code

 

 

链接:https://pan.baidu.com/s/1csYxLlghawMtZTALobEJOg?pwd=0000
提取码:0000

 

标签:应用,int,U7,C++,son,pa,heap,节点,size
From: https://www.cnblogs.com/jayxuan/p/18176145

相关文章

  • C++U7-3-树及其应用
    树及其应用 树的表示方法       讲解哈夫曼树的基本概念            哈夫曼树的构造    哈夫曼编码的基本概念                作业讲解:链接:https://pan......
  • 深入探究C++ 类成员(Class Members)
    一、定义在class的声明里头,真正有用的两样东西是datamembers和memberfunctions:Datamembers:表示根据这个class所产生的object里头会有些什么东西,它事实上也是占据object内存的唯一东西(除非引入虚拟机制)。通常为数据的封装性,我们把datamembers声明为private或protec......
  • 漂亮的.NET控制台应用程序类库--Spectre.Console
    思维导航前言项目特性项目源代码新建控制台应用安装项目的NuGet包控制台文字输出table表格输出条形图日历布局规则水平线项目源码地址优秀项目和框架精选DotNetGuide技术社区交流群前言做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出......
  • C++面试笔记 - (二)
    1、C++从代码到可执行二进制文件的过程C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接。预编译:这个过程主要的处理操作如下:将所有的#define删除,并且展开所有的宏定义处理所有的条件预编译指令,如#if、#ifdef处理#include预编译指令,将被包含的......
  • C++面试总结(一)--c与c++不同
    C++面试总结(一)--C与C++不同c++特点C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。C++有三大特性(1)封装。(2)继承。(3)多态;C++语言编写出的程序结构清晰、易于扩充,程序可读性好。C++生成的代码质量高,效率高,C++更加安全,增加了const常量、引用、四类cast转换(stat......
  • 前端埋点数据采集(二)mock应用系统10万条前端埋点数据
    前端埋点数据采集(二)mock应用系统10万条前端埋点数据上一期我们分享了前端埋点数据采集(一)采集系统架构设计我们说应用系统的数据,采集到大数据平台来,然后再到数仓。但是很多实际场景是应用系统、大数据平台、数仓平台各自并没有完成系统的搭建和开发。 假设现在一个场景是:应用......
  • Android adb 启动界面、获取当前界面应用名称
    前言全局说明一、说明二、adb启动设置界面adbshellamstart-aandroid.intent.action.MAIN-ncom.android.settings/com.android.settings.SubSettings三、获取当前界面应用名称adbshelldumpsyswindow|findstrmCurrentFocus下面是用adb进入android命令......
  • c++中文编码问题
    std::string或者constchar*,本质上都是二进制,不包含编码属性,其编码信息来源于赋值语句,QString以utf16编码,默认构造或赋值的字面量假定为utf8,若是其它编码比如ansi,可以调用QString::fromLocal8bit一、字面量的编码取决于文件,即如果在c++源文件中有直接赋值1)、constchar*s="......
  • 22. 括号生成-c++
    数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]classSolution{public:vector<string>generat......
  • 39. 组合总和-c++
    给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同......