最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆

 更新時(shí)間:2022年02月18日 09:58:39   作者:我是小白呀  
二叉堆是一種特殊的堆,其實(shí)質(zhì)是完全二叉樹。二叉堆有兩種:最大堆和最小堆。最大堆是指父節(jié)點(diǎn)鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值。而最小堆恰恰相反,指的是父節(jié)點(diǎn)鍵值總是小于任何一個(gè)子節(jié)點(diǎn)的鍵值

概述

從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

優(yōu)先隊(duì)列

優(yōu)先隊(duì)列 (Priority Queue) 和隊(duì)列一樣, 是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu). 優(yōu)先隊(duì)列中的每個(gè)元素有各自的優(yōu)先級(jí), 優(yōu)先級(jí)最高的元素最先得到服務(wù). 如圖:

二叉堆

二叉堆 (Binary Heap) 是一種特殊的堆, 二叉堆具有堆的性質(zhì)和二叉樹的性質(zhì). 二叉堆中的任意一節(jié)點(diǎn)的值總是大于等于其孩子節(jié)點(diǎn)值. 如圖:

二叉堆實(shí)現(xiàn)

獲取索引

// 獲取父節(jié)點(diǎn)的索引值
public int parent(int index) {
    if (index <= 0) {
        throw new RuntimeException("Invalid Index");
    }

    return (index - 1) / 2;
}

// 獲取左孩子節(jié)點(diǎn)索引
public int leftChild(int index) {
    return index * 2 + 1;
}

// 獲取右孩子節(jié)點(diǎn)索引
public int rightChild(int index) {
    return index * 2 + 2;
}

添加元素

// 添加元素
public void add(E e) {
    data.add(e);
    siftUp(data.size() - 1);
}

siftUp

// siftDown
private void siftDown(int k) {
    while (leftChild(k) < data.size()) {
        int j = leftChild(k);
        if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
            j++;
        }
        if (data.get(k).compareTo(data.get(j)) >= 0) {
            break;
        }
        Collections.swap(data, k, j);
        k = j;
    }
}

完整代碼

import java.util.ArrayList;
import java.util.Collections;

public class BinaryHeap<E extends Comparable<E>> {

    private ArrayList<E> data;

    // 無參構(gòu)造
    public BinaryHeap() {
        data = new ArrayList<>();
    }

    // 有參構(gòu)造
    public BinaryHeap(int capacity) {
        data = new ArrayList<>(capacity);
    }

    // 或者元素個(gè)數(shù)
    public int size() {
        return data.size();
    }

    // 判斷堆是否為空
    public boolean isEmpty() {
        return data.isEmpty();
    }

    // 獲取父節(jié)點(diǎn)的索引值
    public int parent(int index) {
        if (index <= 0) {
            throw new RuntimeException("Invalid Index");
        }

        return (index - 1) / 2;
    }

    // 獲取左孩子節(jié)點(diǎn)索引
    public int leftChild(int index) {
        return index * 2 + 1;
    }

    // 獲取右孩子節(jié)點(diǎn)索引
    public int rightChild(int index) {
        return index * 2 + 2;
    }

    // 添加元素
    public void add(E e) {
        data.add(e);
        siftUp(data.size() - 1);
    }

    // siftUp
    private void siftUp(int k) {
        while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
            Collections.swap(data, k, parent(k));
            k = parent(k);
        }

    }

    // siftDown
    private void siftDown(int k) {
        while (leftChild(k) < data.size()) {
            int j = leftChild(k);
            if (j + 1 < data.size() && data.get(j + 1).compareTo(data.get(j)) > 0) {
                j++;
            }
            if (data.get(k).compareTo(data.get(j)) >= 0) {
                break;
            }
            Collections.swap(data, k, j);
            k = j;
        }
    }
}

到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之二叉堆的文章就介紹到這了,更多相關(guān)Java 二叉堆內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 添加MySQL數(shù)據(jù)庫及JPA實(shí)例

    Spring Boot 添加MySQL數(shù)據(jù)庫及JPA實(shí)例

    本篇文章主要介紹了Spring Boot 添加MySQL數(shù)據(jù)庫及JPA,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • kafka內(nèi)外網(wǎng)訪問配置方式

    kafka內(nèi)外網(wǎng)訪問配置方式

    這篇文章主要介紹了kafka內(nèi)外網(wǎng)訪問配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 深入解析Java類加載的案例與實(shí)戰(zhàn)教程

    深入解析Java類加載的案例與實(shí)戰(zhàn)教程

    本篇文章主要介紹Tomcat類加載器架構(gòu),以及基于類加載和字節(jié)碼相關(guān)知識(shí),去分析動(dòng)態(tài)代理的原理,對(duì)Java類加載相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-05-05
  • 使用spring的websocket創(chuàng)建通信服務(wù)的示例代碼

    使用spring的websocket創(chuàng)建通信服務(wù)的示例代碼

    這篇文章主要介紹了使用spring的websocket創(chuàng)建通信服務(wù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • logback整合rabbitmq實(shí)現(xiàn)消息記錄日志的配置

    logback整合rabbitmq實(shí)現(xiàn)消息記錄日志的配置

    這篇文章主要介紹了logback整合rabbitmq實(shí)現(xiàn)消息記錄日志的配置,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • Java如何調(diào)用wsdl的webservice接口

    Java如何調(diào)用wsdl的webservice接口

    這篇文章主要介紹了Java如何調(diào)用wsdl的webservice接口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringData如何通過@Query注解支持JPA語句和原生SQL語句

    SpringData如何通過@Query注解支持JPA語句和原生SQL語句

    這篇文章主要介紹了SpringData如何通過@Query注解支持JPA語句和原生SQL語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java8?時(shí)間日期的使用與格式化示例代碼詳解

    java8?時(shí)間日期的使用與格式化示例代碼詳解

    這篇文章主要介紹了java8?時(shí)間日期的使用與格式化,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Maven 多模塊父子工程的實(shí)現(xiàn)(含Spring Boot示例)

    Maven 多模塊父子工程的實(shí)現(xiàn)(含Spring Boot示例)

    這篇文章主要介紹了Maven 多模塊父子工程的實(shí)現(xiàn)(含Spring Boot示例),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • spring aop之@AfterReturning不生效問題及解決

    spring aop之@AfterReturning不生效問題及解決

    這篇文章主要介紹了spring aop之@AfterReturning不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

榆中县| SHOW| 抚顺县| 嵊州市| 长白| 米易县| 万山特区| 高密市| 广饶县| 南城县| 古田县| 昌黎县| 新兴县| 白朗县| 满城县| 玉林市| 临西县| 通渭县| 隆回县| 梁河县| 潮安县| 富顺县| 盐边县| 松潘县| 盐津县| 合水县| 镇宁| 探索| 万源市| 黑河市| 长白| 游戏| 枣阳市| 屯留县| 攀枝花市| 延吉市| 松溪县| 广丰县| 夹江县| 察雅县| 长岭县|