注意:这篇博客讲的是手写堆,喜欢用C++自带数据结构模拟的慎入

今天我们来聊一聊一种奇怪 的数据结构:

为什么说这个数据结构有点奇怪呢?

先看看其他的在我眼里是正常的数据结构:

队列(近似于排队)

栈(类似于一个桶)

数组(就是一组存储各种数据类型的集合(?))

但是!

堆这个东西有点奇怪,它模拟的是:

完全二叉树。

这就很让人摸不着头脑了emmmm

后来去各种找资料 知道了它的模拟方式就是:

堆的物理结构就是数组。堆的逻辑结构是一棵完全二叉树。树中每个结点与数组中存放该结点中值的那个元素相对应。如下图:



尼玛这不就是给这棵树的结点编号存数组里吗(疯狂咆哮)

接下来堆的特性我就找了一段资料如下,做了解就可以了:



感觉说的有点多…下面进入代码实现部分。今天我们以小根堆为例来进行代码实现的讲解 .

堆的基本操作:

  • 上浮(up)
  • 下沉(down)
  • 插入(insert)
  • 删除(del)
  • *建立(build)

第一个是上浮(up)操作。

上浮操作,顾名思义,就是将一个结点在树中的位置尽量往上浮

代码实现用到了【位运算】不了解的可以百度一下◀〓〓

基本思路:

以小根堆为例,当小根堆的元素值h[x]变小时,该结点可能会上浮,如果h[x]小于h[x>>1]则交换两个结点的值,如此循环下去直到x=1或h[x]>=h[x>>1].

e.g.





代码实现:

void up(int x)//h[x]上浮
{
   while (x>1&&h[x]<h[x>>1]){
       swap(h[x],h[x>>1]);
       x>>=1;
   }
}

时间复杂度为O(logn)。

下沉(down)操作:

思路:

当小根堆的元素值h[x]变大时,该结点可能会下沉,如果有儿子结点值小于该结点的值则跟较小儿子结点交换,如此循环下去直到条件不满足或者没有儿子结点。

代码:

void down(int x)//h[x]下沉,len是堆中元素个数
{
    int y=x<<1;
    while(y<=len){
         if(y+1<=len&&h[y+1]<h[y])y++;
         if(h[y]<h[x]){
               swap(h[x],h[y]);
               x=y;y=x<<1;
         }
         else break;
    }
}

O(logn)

插入(insert)操作:

基本思路:

插入一个元素,把该元素放在最后,再做up操作。

程序如下:

void insert(int x)
{
   h[++len]=x;
   up(len);
}

时间复杂度为O(logn)

删除(del)操作:

基本思路:

删除第x个元素,为了不破坏堆的性质,把h[len]移到x处,堆元素个数len减一,注意可能是做up(x)也可能做down(x),根据h[x]的变化情况来定。

程序如下:

void del(int x)//删除h[x]
{
    h[x]=h[len--];
    up(x);
    down(x);
}

时间复杂度为O(logn)

*建堆(build)操作



不做过多讲述,这个操作写法有很多,也可以尝试着自己去探索其他的写法!

ov.

【基本数据结构之堆】-C++的更多相关文章

  1. 算法手记 之 数据结构(堆)(POJ 2051)

    一篇读书笔记 书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了 ...

  2. 数据结构之堆Heap

    1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...

  3. Java数据结构之堆和优先队列

    概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...

  4. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  5. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  6. 数据结构:堆(Heap)

    堆就是用数组实现的二叉树,所有它没有使用父指针或者子指针.堆根据"堆属性"来排序,"堆属性"决定了树中节点的位置. 堆的常用方法: 构建优先队列 支持堆排序 快 ...

  7. 算法&数据结构系列 -- 堆(优先队列)

    前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...

  8. java数据结构之(堆)栈

    (堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...

  9. 数据结构(堆):POJ 1442 Black Box

    Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10658   Accepted: 4390 Descri ...

随机推荐

  1. 浅谈.NET编译时注入(C#-->IL)

    原文:浅谈.NET编译时注入(C#-->IL) .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台.所以.NET语言的编译就分为了两部 ...

  2. 微信小程序把玩(十一)icon组件

    原文:微信小程序把玩(十一)icon组件 这些是提供的所支持的图标样式,根据需求在此基础上去修改大小和颜色. 主要属性: 使用方式: wxml <!--成功图标--> <icon t ...

  3. linux输出信息调试信息重定向

    最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0).因为后期要使用ttySAC0作为上层应用通信 ...

  4. JavaScript API for Office Outlook Add-in - “一页纸文档“

    上一篇文章 Office Add-in Model 为 Outlook Mail Add-in 提供的 JavaScript API 介绍 ,简单地在表格中列出了所有的 Object 定义,但是个人感 ...

  5. Qt技术优势

    1. Qt这个C++的图形库由Trolltech在1994年左右开发.它可以运行在Windows,Mac OS X, Unix,还有像Sharp Zaurus这类嵌入式系统中.Qt是完全面向对象的. ...

  6. delphi的Socket(有两种分别继承TObject和TComponent的方式)

    在Delphi中,对于Windows中的Socket进行了有效的封装.在Delphi中,按其继承关系,可以分层两类:一.TComponent--TAbstractSocket--TCustomSock ...

  7. Microsoft Development Platform Technologies

  8. screen命令使用简单说明

    首先用screen [-S]命令建立一个session,然后就可以在这个session中建立多个window了.使用screen [-S]可以建立多个session,而每个session又可以建立多个 ...

  9. 【web自动化测试】requests-html 这个解析库,能让你更轻松的获取网页内容

    1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库 ...

  10. sqlserver/mysql按天,按小时,按分钟统计连续时间段数据

    文 | 子龙 有技术,有干货,有故事的斜杠青年 一,写在前面的话 最近公司需要按天,按小时查看数据,可以直观的看到时间段的数据峰值.接到需求,就开始疯狂百度搜索,但是搜索到的资料有很多都不清楚,需要自 ...