第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

「掃盲」數(shù)據(jù)結(jié)構(gòu) - 堆入門(mén)

標(biāo)簽:
Java 算法

🔥 什么是堆❔

  • 堆是一颗【完全二叉树

  • 堆的所有【根节点】“大于”【子节点

    这里的大于是可以定义的。

image-20200318211957067

​ 上图所示,都是满足堆上方的性质,一颗完全二叉树,所有的根节点大于子节点

​ 上方展示的为最大堆(相应的也可以定义最小堆)

  • 使用数组表示

    image-20200318212734956

    因为堆满足完全二叉树的定义,所以堆可以使用数组来表示【上图所示】。

    由上图得在 index 位置上的节点可以推倒出如下公式 parent(i) = i / 2 left child (i) = 2 * i right child (i) = 2 * i + 1

    但是在上图中,其实是浪费了数组的零号位置,如果元素从0号位置排将会是下面的结构

    image-20200318213435336

    由上图可以推倒公式为:

    parent(i) = (i - 1) / 2 left child (i) = 2 * i + 1 right child (i) = 2 * i + 2

堆中的常用操作

  • Sift Up (向堆中添加元素)

    上浮,因为堆底层实现为数组,所以我们在添加元素的时候是直接向数组的末端添加元素,这样就始终保证堆是一个完全二叉树,但是我们需要维持二叉树第二个性质,根节点元素大于子节点,所以我们需要 sift up 操作

    假设有如下堆结构:

    image-20200318214332416

    假设我们现在需要添加的元素为 52,现在元素的位置为 arr[arr.length - 1],但是这样就违反了堆的结构,因为 52 > 16sift up 就是如果当前元素大于根节点元素的值那么就交换两个元素,【迭代】执行,直到满足子节点小于根节点。

    这时我们就需要交换 52 和 16号元素的值

    image-20200318214919048

    交换完成后是这个样子

    image-20200318215227768

    但是这时候又会发现还是不满足堆结构,因为 52 > 41,所以 52 和 41 还需要交换

    image-20200318215332914

    交换后才又满足堆的结构

    image-20200318215450242

    上面 52 号元素移动的整个过程,称之为 sift up 上浮

    heap_sift_up.png
  • Sift Down (取出堆中的最大元素)

    由堆的特性所得,根节点的元素为堆中的最大元素,所以我们只需要取出根节点即可。

    image-20200318220445853

    但是如果直接取出根节点就会导致将原来的堆切割为两个堆,后续在合并的时候就会变的异常麻烦,所以我们这里转变一下思路,直接将末尾的元素 arr[arr.length - 1] 16 与 根节点62 交换位置,而后再将其处理为堆结构这样会简单很多

    image-20200318220722116

    如上图所示,直接将末尾的元素替换掉头结点。此时就违反了堆结构,我们就需要进行 Sift Down 的操作。

    当前元素与它的左右孩子进行对比,与左右孩子中较大的孩子进行交换,迭代进行,最终便可完成 Sift Down

    image-20200318221110695

    第一次交换 16 和 50 ,因为 52 > 30,交换后的效果为

    image-20200318221300114

    第二次 交换 16 和 42,因为 42 > 16

    image-20200318221601439

    经过前面的两次交换后,现在就满足最大堆的性质了。

    上面两次交换的过程就称为 Sift Down

    heap_sift_down.png
  • replace

  • heapity

开源项目推荐

[SCHEDULE-BILIBILI]github.com/xiaoxiunique/schedule-bilibili

只有 Js 能干点啥,JS 和 Github Actions 实现哔哩哔哩每日自动签到、投币、领取奖励。🐄 🍺

[IDEA-TopTips]github.com/xiaoxiunique/tool-tips

IDEA 宇宙最强操作技巧,错误此项目 后悔一生。🐄 🍺

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消