数据结构:如何理解堆?

一句话说明

堆的本质:联系实际也可知,有层层递增或递减的关系的,才能堆起来,否者不就倒了吗?所以,理解堆的最本质一点:每一个堆都是逐层递减或递增的。
而如何实现呢?
最好的实现方式,就是要很直观,甚至是简单粗暴,所以就想到了完全二叉树,完全二叉树特别好的一个性质就是:父结点和子结点的相对位置是确定的,这一点不管是对堆的查找还是建立亦或是删除,都特别的友好。

一道例题:

树7 堆中的路径 (25 point(s))
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:
每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。

输出格式:
对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10
46 23 10
26 10

思路要点

看到堆,就立马联系到完全二叉树,因为1 23 4567 891011121314 ……一一对应。

/* 堆的路径问题 属于基本操作
以下为建立小堆来实现的路径打印

思路点:堆的实现是通过完全二叉树,所以可以用数组
并且通过倒序,实现从子结点找到父结点

*/

#include <cstdio>

#define MAXN 1001 //结点数最大值
#define MINH -10001 //结点值最小值

int H[MAXN], SizeH;

void Create()
{
    SizeH = 0;
    H[0] = MINH;
}

void InsertH(int temp)
{
    //从最后一个位置往上插入
    //该循环的目的,把逐层向上的父结点和需要插入的值进行比较
    //如果大了就换下来(因为这是小堆)
    int n;
    for (n = ++SizeH; H[n/2] > temp; n /= 2) {
        H[n] = H[n/2];//此时H[i/2]位置就可以插入了
    }
    H[n] = temp;
}
int main()
{

    int N, M, temp;
    scanf("%d %d", &N, &M);
    Create();
    for (int i = 0; i < N; i++) {
        scanf("%d", &temp);
        InsertH(temp);
    }
    for (int i = 0; i < M; i++) {
        scanf("%d", &temp);
        for (int j = temp; H[j] > H[0]; j /= 2) {
            printf("%d", H[j]);
            if (j > 1) printf(" ");
        }
        printf("\n");
    }
    return 0;



}

转载于:https://www.cnblogs.com/ZealYoung/p/10858429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是一种特殊的树形结构,它是一种用来维护一组可以动态改变的元素的数据结构。 栈是一种顺序存储的线性数据结构,其核心是元素的先进后出(First In Last Out,FILO)的原则进行操作的。 因此,和栈的最大区别在于其存储结构不同:是树形结构,而栈是线性结构。 ### 回答2: 与栈是数据结构中常用的两种存储方式,它们在内存中的作用和特点有所不同。 首先,和栈的数据存储方式不同。栈是一种线性存储结构,数据按照"先进后出"的顺序进行存取。栈的特点是只能在栈顶进行插入和删除操作,即只能对栈顶元素进行访问。而则是一种二叉树结构,数据存储无序。中的节点按照一定的规则进行排序或者化操作。 其次,和栈在内存使用上也有差异。栈的分配和回收都由编译器自动完成,速度较快,但容量有限。的分配和回收由程序控制,容量较大。在动态分配内存时,使用可以分配较大的空间,但需要手动释放,否则容易产生内存泄漏。 再者,和栈在局部性和访问速度上有不同的特点。栈上的数据具有很好的局部性,数据访问速度较快。而上的数据分布不连续,每次访问需要通过指针进行寻址,速度较慢。 此外,和栈在数据的生命周期上也有差异。栈上的数据生命周期由其作用域决定,当离开作用域时,该数据自动释放。而上的数据生命周期由程序控制,可以在需要的时候手动释放。 总的来说,和栈都是数据结构中常用的存储方式,栈适合用于处理局部性较好、大小固定的数据,而适合用于动态分配较大、生命周期不确定的数据。 ### 回答3: 在数据结构中,(Heap)和栈(Stack)是两种常用的存储结构。和栈的区别主要体现在以下几个方面: 1. 数据结构通常是一种树形结构,可以用完全二叉树来实现;而栈是一种线性结构,采用先进后出(Last In First Out,LIFO)的原则。 2. 存储方式:是动态分配的对象,存储在内存中。它的空间不连续,通过指针进行管理。栈则是一种固定大小的内存块,存储在栈内存中。栈的内存空间是连续的,系统自动分配和释放。 3. 空间分配:内存的分配由程序员控制,需要手动申请和释放内存空间,一般用于存储动态大小的数据。栈内存的分配由编译器自动完成,当进入一个函数时,会自动为函数的局部变量分配空间,并在函数结束时自动释放。 4. 空间大小:的大小通常比栈大得多,的空间由操作系统决定,一般是几十兆甚至几个G;而栈的大小通常比较有限,一般在几千字节到几百兆字节之间。 5. 内存管理:内存的管理需要程序员手动管理,需要注意申请和释放的成对操作,避免内存泄漏和野指针;栈内存的管理由编译器自动完成,避免了手动管理内存的麻烦。 6. 数据访问速度:的数据访问速度较慢,因为需要通过指针来访问,而指针需要额外的寻址操作;栈的数据访问速度较快,因为数据存储在连续的内存空间中,直接访问即可。 综上所述,和栈在数据结构中具有不同的特点和应用场景。主要用于存储动态分配的数据,而栈主要用于存储函数调用、局部变量等。深入理解和栈的区别对于合理使用和优化程序内存有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值