PTA 堆中的路径 思路分析及代码解析

2024-03-29 14:38

本文主要是介绍PTA 堆中的路径 思路分析及代码解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7-5 堆中的路径 思路分析及代码解析 v1.0

  • 一、前导
    • 1. 需要掌握的知识
    • 2. 题目信息
  • 二、解题思路分析
    • 1. 题意理解
    • 2. 思路分析(重点)
  • 三、具体实现
    • 1. 弯路和bug
    • 2. 代码框架(重点)
      • 2.1 采用的数据结构
      • 2.2 程序主体框架
      • 2.3 各分支函数
    • 3. 完整编码
  • 四、参考资料

一、前导

1. 需要掌握的知识

  1. 堆的基本知识

2. 题目信息

题目来源:PTA / 拼题A
题目地址:https://pintia.cn/problem-sets/15/problems/713

二、解题思路分析

1. 题意理解

基础题,小顶堆的代码实现

  1. 输入数据
5 3    \\向小顶堆中插入5个元素;需要打印3条路径
46 23 26 24 10  \\插入的具体元素
5 4 3  \\打印路径:从数组下标到根节点,这些是数组下标
  1. 输出数据
24 23 10  \\打印的路径
46 23 10
26 10
  1. 题意
    代码的核心是建堆

2. 思路分析(重点)

  1. 建小顶堆并打印

三、具体实现

1. 弯路和bug

  1. 这道题属于基础知识的应用,考察了建堆,个人建议再练习下删除堆中的元素,为后面的Huffman Tree创建打基础

2. 代码框架(重点)

堆是一种树结构:完全二叉树,可以通过结构体数组实现

2.1 采用的数据结构

使用结构体数组

typedef int ElementType;  //通过变量ElementType增加代码的灵活性
struct HNode
{ElementType *a; int size;int capability;
};
typedef struct HNode *Heap;
typedef Heap MinHeap;

2.2 程序主体框架

主要分为三部分:建空堆,插入元素,打印,难点在插入元素

               程序伪码描述
int main()
{	1.建空堆2.通过循环,插入各个元素3.打印
}

2.3 各分支函数

  1. MinHeap Creat(int size); 建一个空堆,结构体数组首元素作为哨兵
typedef struct HNode *Heap;
typedef Heap MinHeapMinHeap Creat(int size)
{MinHeap H;H=(MinHeap)malloc(sizeof(struct HNode));H->a=(ElementType*)malloc(sizeof(ElementType)*(size+1));H->size=0;H->capability=size;H->a[0]=Min;return H;
}
  1. void Insert(MinHeap H,ElementType x); 将元素插入最小堆中,通过for循环进行上滤:和父节点比较,值小的话向上走,直到遇到哨兵
void Insert(MinHeap H,ElementType x)
{int i;i=++H->size;for(; x < H->a[i/2]; i=i/2)H->a[i]=H->a[i/2];H->a[i]=x;
}
  1. void Print(MinHeap H,int i); 从小顶堆的指定位置向上打印
void Print(MinHeap H,int i)
{cout<<H->a[i];i=i/2;for(;i>0;i=i/2) cout<<" "<<H->a[i];cout<<endl;
}

3. 完整编码

#include <cstdlib>
#include <iostream>
using namespace std;#define  Min -10000typedef int ElementType;
struct HNode
{ElementType *a;int size;int capability;
};
typedef struct HNode *Heap;
typedef Heap MinHeap;MinHeap Creat(int size);
void Insert(MinHeap H,ElementType x);
void Print(MinHeap H,int i);int main()
{int N,M,x;cin>>N>>M;MinHeap H;H=Creat(N);while(N){cin>>x;Insert(H,x);N--;}while(M){cin>>x;//cout<<"Print Func. will start"<<endl;Print(H,x);M--;} return 0;} MinHeap Creat(int size)
{MinHeap H;H=(MinHeap)malloc(sizeof(struct HNode));H->a=(ElementType*)malloc(sizeof(ElementType)*(size+1));H->size=0;H->capability=size;H->a[0]=Min;return H;
}void Insert(MinHeap H,ElementType x)
{int i;i=++H->size;for(;x<H->a[i/2];i=i/2){H->a[i]=H->a[i/2];}H->a[i]=x;//cout<<"Here is Insert"<<endl;
}void Print(MinHeap H,int i)
{//cout<<"Here is Print"<<endl;cout<<H->a[i];i=i/2;for(;i>0;i=i/2) cout<<" "<<H->a[i];cout<<endl;
}

2021.10.11 AC代码:编码模拟建堆的步骤;堆是一个完全二叉树,因此可以通过数组进行存储

#include <iostream>
using namespace std;typedef int ElementType;
#define Min -10001ElementType* a; //通过数组存储数据. 通过变量标记最后一个元素
ElementType LastIndex = 1; //位置0存储哨兵,实际数据从1开始存储void Insert(ElementType Value);
void Print(int Index);int main()
{int N, M; cin >> N >> M;a = new ElementType[N + 1];a[0] = Min;//哨兵ElementType Value;for (int i = 0; i < N; i++){cin >> Value;Insert(Value);//建堆 core Func.}while (M--){cin >> Value;Print(Value);}return 0;
}void Insert(ElementType Value)
{a[LastIndex++] = Value;int i = LastIndex - 1, Tmp = a[i];while (Tmp < a[i / 2] && i>0){a[i] = a[i / 2];a[i / 2] = Tmp;i = i / 2;}return;
}void Print(int Index)
{cout << a[Index]; Index /= 2;while (Index > 0){cout << " " << a[Index];Index /= 2;}cout << endl;return;
}

四、参考资料

  1. 浙江大学 陈越、何钦铭老师主讲的数据结构

这篇关于PTA 堆中的路径 思路分析及代码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858856

相关文章

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义